質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

2回答

2032閲覧

バッチファイルを利用してフォルダ名の前後を置換

akit0928

総合スコア3

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

1グッド

1クリップ

投稿2021/07/26 07:43

編集2021/07/26 12:30

バッチファイルを利用して連番のフォルダ名の連番部分はそのまま前後を置換したいです。
また、その際に特定の文字列(SEARCHTEXT部分)はそのまま残したいのでERRORLEVELを使ったif分岐を行っています。
ただ、連番が正しく行われず、意図しないフォルダをリネームしてしまい、連番置換ができないでいます。
違う書き方でも大丈夫ですのでわかる方いましたら教えていただけますと幸いです。
よろしくお願いします。
※ミスしていましたので現在つかっているものに修正しました。

bat

1@set /p answer=ディレクトリを指定 2@set /p before=フォルダ名前_ 3@set /p after=フォルダ名後_ 4cd %answer% 5for /l %%a in (1,1,23) do call :loop %%a 6exit /b 7 8:loop 9set N=0%1 10 11SET SEARCHTEXT="テスト" 12 13for /d %%x in ("*%N:~-2%*") do ( 14 15echo "%%x" | find %SEARCHTEXT% >NUL 16IF NOT ERRORLEVEL 1 ( 17ren "%%x" "%before%%N:~-2%%after% %SEARCHTEXT%" 18) ELSE ( 19ren "%%x" "%before%%N:~-2%%after%" 20) 21 22) 23exit /b

上記内容でメインフォルダのディレクトリからバッチをかけると、

メインフォルダ  ├ 新しいフォルダー (01)  ├ 新しいフォルダー (02)  ├ 新しいフォルダー (03) テスト ︙  ├ 新しいフォルダー (05) テスト  ︙(これを連番で20まで) ︙  └ 新しいフォルダー (20)

コマンド実行中、01のフォルダを指定しているのに下記のように、「新しいフォルダー (12)」を取得してしまうような現象が起きます。
また、09の時に「新しいフォルダー (14)」を取得してしまうなど取得の規則性もあまり感じられずにこまっています。

C:\Users\USERNAME\Downloads\メインフォルダー>for / %x in ("01") do (
echo "%x" | find "テスト" 1>NUL
IF NOT ERRORLEVEL 1 (ren "%x" "aaa01zzz "テスト"" ) ELSE (ren "%x" "aaa01zzz" )
)

C:\Users\USERNAME\Downloads\メインフォルダー>(
echo "新しいフォルダー (12)" | find "テスト" 1>NUL
IF NOT ERRORLEVEL 1 (ren "新しいフォルダー (12)" "aaa01zzz "テスト"" ) ELSE (ren "新しいフォルダー (12)" "aaa01zzz" )
)

C:\Users\USERNAME\Downloads\メインフォルダー>(
echo "新しいフォルダー (01)" | find "テスト" 1>NUL
IF NOT ERRORLEVEL 1 (ren "新しいフォルダー (01)" "aaa01zzz "テスト"" ) ELSE (ren "新しいフォルダー (01)" "aaa01zzz" )
)
重複するファイル名が存在するか、またはファイルが
見つかりませんでした。

V1489-Cygni👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

batch

1@set /p answer=ディレクトリを指定 2@set /p before=フォルダ名_前: 3@set /p after=フォルダ名_後: 4@set /p SEARCHTEXT=残したい文字列: 5cd %answer% 6for /l %%a in (1,1,23) do call :loop %%a 7exit /b 8 9:loop 10set N=0%1 11 12for /f "delims=" %%x in ('dir /b /ad ^| find "%N:~-2%"') do ( 13 echo "%%x" | find "%SEARCHTEXT%" >nul 14 if not errorlevel 1 ( 15 ren "%%x" "%before%%N:~-2%%after% %SEARCHTEXT%" 16 ) else ( 17 ren "%%x" "%before%%N:~-2%%after%" 18 ) 19) 20exit /b

dir /ad 01
としてみると、確かに

新しいフォルダー (12)
新しいフォルダー (01)

・・・と、新しいフォルダー (12) を先に拾ってきますね。なぜでしょうかね?

うまくいかない時は、
for /d 変数 in (~) ではなく、
for /f "delims=" 変数 in ('dir /b /ad ~ ')
の方を使いましょう。

投稿2021/07/26 22:33

V1489-Cygni

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

V1489-Cygni

2021/07/27 03:48

Crimson_Tide さん、情報ありがとうございます。 なるほど、勉強になります。
guest

0

長いので回答欄を使わせて頂きますが、直接の回答ではないので参考として御覧ください。

対処法としては、01のようにシステムにディレクトリ名を取得させるのではなく、
V1489-Cygni 様がご提示されているようなディレクトリ名を直接渡すような処理にしたほうがよいかと思います。

うまくいかない原因は恐らく8.3形式の短いファイル名によるものです。

もし8.3形式の名前をCドライブで無効にする、若しくは8dot3 ファイル名を完全に削除する場合、リスクを判断しきれないのでリンク先を熟読して頂いた上で自己判断自己責任でお願いします。

8.3形式については下記リンク先をご覧ください。

dir でワイルドカードを使うと意図しないファイルがマッチする

Windows10で「ファイル名が長すぎ」てエラーが発生したときの対処方法

ちなみに、Windows10では、システムドライブ(Cドライブ)は、デフォルトで8.3形式の名前生成が有効になっており、それ以外のドライブは無効になっています。

8.3形式の短いファイル名を生成しないようにする

(8.3形式の名前の削除に関して)

各アプリケーションに影響が出ないかどうかをあらかじめ十分検証しておく必要がある。

fsutil 8dot3name

8dot3 ファイル名を完全に削除し、8dot3 ファイル名をポイントするレジストリキーを変更しないと、アプリケーションをアンインストールできないなど、予期しないアプリケーションエラーが発生する可能性があります。 8dot3 ファイル名を削除する前に、まずディレクトリまたはボリュームをバックアップすることをお勧めします。

以下Windows10環境下で実施
下記フォルダには"新しいフォルダー (01) "から "新しいフォルダ (20) "があります。

Dドライブでは8dot3 ファイル名が無効になっている((8dot3 name creation is disabled).)ので
dir /x 01 としても"新しいフォルダ (12) "は検出されません。
(/x は長い名前の左に8.3形式の短い名前を表示するオプションです)

dos

1D:\dev\teratail\351300\メインフォルダー>fsutil 8dot3name query d: 2The volume state is: 1 (8dot3 name creation is disabled). 3The registry state is: 2 (Per volume setting - the default). 4 5Based on the above settings, 8dot3 name creation is disabled on d: 6 7D:\dev\teratail\351300\メインフォルダー>dir /x *01* 8 Volume in drive D is DATA01_new03 9 Volume Serial Number is 0638-DEF8 10 11 Directory of D:\dev\teratail\351300\メインフォルダー 12 132021/07/27 08:14 <DIR> 新しいフォルダー (01) 14 0 File(s) 0 bytes 15 1 Dir(s) 2,195,593,322,496 bytes free 16 17D:\dev\teratail\351300\メインフォルダー>

”C:\test\teratail\メインフォルダー”にも"新しいフォルダー (01) "から "新しいフォルダ (20) "があります。
Cドライブはデフォルトで8dot3 ファイル名が有効になっている((8dot3 name creation is enabled).)ので 新しいフォルダー (12) も検出されてしまいます。
新しいフォルダー (12)の 8.3形式の名前が ”新0154~1”となっているので、恐らくこの01にマッチして表示されているのでしょう。

dos

1C:\test\teratail\メインフォルダー>fsutil 8dot3name query c: 2The volume state is: 0 (8dot3 name creation is enabled). 3The registry state is: 2 (Per volume setting - the default). 4 5Based on the above settings, 8dot3 name creation is enabled on c: 6 7C:\test\teratail\メインフォルダー>dir /x *01* 8 ドライブ C のボリューム ラベルは Win10Pro です 9 ボリューム シリアル番号は 5CD7-F3B6 です 10 11 C:\test\teratail\メインフォルダー のディレクトリ 12 132021/07/27 08:24 <DIR> 新0154~1 新しいフォルダー (12) 142021/07/27 08:14 <DIR> 新しい~1 新しいフォルダー (01) 15 0 個のファイル 0 バイト 16 2 個のディレクトリ 280,651,665,408 バイトの空き領域 17 18C:\test\teratail\メインフォルダー>

カレントフォルダだけ8.3 形式のファイル名を削除すると、dir /x 01 を実行しても”新しいフォルダー (12)”が検出されなくなりました。
(. 指定ではなく絶対パスの方が安心かな 。 @ITのリンク先にもあるように『まず/tオプション(テスト・モードの指定)を付けてテストしてから行うのが望ましい。』をすべきでした)

dos

1C:\test\teratail\メインフォルダー>fsutil 8dot3name strip /v /s . 2レジストリをスキャンしています... 3レジストリ データ レジストリ キーのパス 4------------------------------------------------------------------------------- ------------------------------------------ 5 6影響されるレジストリ キーの合計: 0 7 88dot3 名を削除しています... 9 108dot3 名 ファイル ID 完全なパス 11------------- ------------------- ------------------------------------------------------------------------------------- 12新しい~1 0x47000000074e90 "C:\test\teratail\メインフォルダー\新しいフォルダー (01)" 13新しい~2 0x29000000074e91 "C:\test\teratail\メインフォルダー\新しいフォルダー (02)" 14~省略~ 15新0154~1 0x1f000000074ea0 "C:\test\teratail\メインフォルダー\新しいフォルダー (12)" 16~省略~ 17新E58E~1 0x160000000788d3 "C:\test\teratail\メインフォルダー\新しいフォルダー (20)" 18 19スキャンされたファイルとディレクトリの合計: 20 20見つかった 8dot3 名の合計: 20 21削除された 8dot3 名の合計: 20 22 23実行した操作の詳細については、次のログを参照してください: 24 "C:\Users\username\AppData\Local\Temp\8dot3_removal_log @(GMT 2021-07-27 00-25-33).log" 25 26C:\test\teratail\メインフォルダー>dir /x *01* 27 ドライブ C のボリューム ラベルは Win10Pro です 28 ボリューム シリアル番号は 5CD7-F3B6 です 29 30 C:\test\teratail\メインフォルダー のディレクトリ 31 322021/07/27 08:14 <DIR> 新しいフォルダー (01) 33 0 個のファイル 0 バイト 34 1 個のディレクトリ 280,837,193,728 バイトの空き領域 35 36C:\test\teratail\メインフォルダー>

追記
for文などで変数を取り扱う際や renやmoveなど変更が伴う処理は、まずは変数だけechoしたり、変更処理の頭にechoつけて意図したコマンドになっているか確認した上で、echoを外して実行することをお勧めします。

dos

1echo "%%x" 2@rem echo "%%x" | find %SEARCHTEXT% >NUL 3echo ren "%%x" "%before%%N:~-2%%after% %SEARCHTEXT%"

投稿2021/07/27 01:01

編集2021/07/27 01:23
Crimson_Tide

総合スコア509

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問