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

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

新規登録して質問してみよう
ただいま回答率
85.37%
バッチファイル

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

Q&A

解決済

3回答

2996閲覧

特定の文字列を持つファイルを一括でリネームするバッチファイルを作成したい。

mta77

総合スコア4

バッチファイル

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

0グッド

0クリップ

投稿2021/08/26 00:45

特定の文字列を持つファイルを一括でリネームするバッチファイルを作成しております。
そこで、下記のバッチファイルを使用しているのですが、
実際に実行すると本来ほしい結果がでず苦慮しております。
記述方法が間違っているのか、アドバイスをお願い致します。

やりたいこととして
同じフォルダ内にあるCSVファイル名を変更したい

望む出力結果例
a_yyymmdd.csv→aaa_yyymmdd.csv
b_yyymmdd.csv→bbb_yyymmdd.csv

yyyymmddは変更せず前方のa,bのみを変更したい。

上記を実現するバッチを以下のように作成しましたがforのループが旨く行かず
a.csv→aaaccc.csvとなります。

exit /b で:changeのfor文を戻し:change2の処理を実行する構文を想定しておりますが
うまく行かずアドバイスをお願い致します。

echo off SET /P ANSWER="実行しますか (Y/N)?" if /i {%ANSWER%}=={y} (goto :yes) if /i {%ANSWER%}=={yes} (goto :yes) :no echo "No が選択されました" goto exitlabel :yes echo "Yesが選択されました" echo 処理開始 for %%f in (*.csv) do call :change %%f exit /b :change set fileName=%1 set fileName=%fileName:a=aaa% ren %1 %fileName% for %%f in (*.csv) do call :change2 %%f :change2 set fileName=%1 set fileName=%fileName:c=ccc% ren %1 %fileName% echo 完了しました! Enterを押して終了してください。 pause > nul exit

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

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

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

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

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

yambejp

2021/08/26 00:57

VBS(cscript)など処理能力の高い言語で対応することは無理ですか? (どちらもwinのバッチ処理にはかわりませんが)
mta77

2021/08/26 00:58

ご回答ありがとうございます。できればバッチで対応したいです。
mta77

2021/08/26 00:59

ちなみにVBSだとどういった構文になるのでしょうか。
guest

回答3

0

バッチファイルからpowershellのワンライナーを実行する方法もご紹介します

CMD

1@echo off 2 3set a="dir '*_*.csv' | ren -newName { [Text.RegularExpressions.Regex]::Replace($_.Name, '^(\w)_(\d{8})', '$1$1$1_$2.csv') }" 4 5powershell -Command %a%

投稿2021/08/26 04:02

mayu-

総合スコア335

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

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

mta77

2021/08/27 00:42

回答が遅くなってすみません。ワンライナーの方法ありがとうございます。 こちらでも処理できました。
guest

0

VBS

1dim reg 2set reg = CreateObject("VBScript.RegExp") 3reg.Pattern = "^(.)(_.+.csv)$" 4dim fso 5set fso = createObject("Scripting.FileSystemObject") 6dim folder 7set folder = fso.getFolder(".\") 8dim file 9for each file in folder.files 10 if reg.Test(file.name) then 11 Set fn = fso.GetFile(file.name) 12 fn.name=reg.replace(file.name, "$1$1$1$2") 13 end if 14next

上記

  • a_yyymmdd.csv→aaa_yyymmdd.csv
  • b_yyymmdd.csv→bbb_yyymmdd.csv
  • a.csv→a.csvのまま

もっと複雑な条件設定も可能です

投稿2021/08/26 01:23

編集2021/08/26 01:28
yambejp

総合スコア116439

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

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

mta77

2021/08/26 02:00

yambejp様、ご回答ありがとうございます。 .vbsで頂いたソース実行しましたが、リネーム処理が走りませんでした。 自分のやり方が悪いのか確認してみます。
yambejp

2021/08/26 02:19

これでテストしてみてください dim fso set fso = createObject("Scripting.FileSystemObject") dim folder set folder = fso.getFolder(".\") Dim reg Set reg = CreateObject("VBScript.RegExp") reg.Pattern = "^(.)(_.+.csv)$" dim file for each file in folder.files if reg.Test(file.name) then Set fn = fso.GetFile(file.name) WScript.echo fn.name WScript.echo reg.replace(file.name, "$1$1$1$2") end if next
mta77

2021/08/27 00:54

確認できました。ありがとございます。
guest

0

ベストアンサー

これは以前経験しました。CMD.EXEのバグと言って良いのか、想定外の使い方で未定義動作にあたるのか不明。

2年前なので細かいところはよく覚えていませんが、自分のブログから引用すると、

いろいろ試すと、「ワイルドカードが複数のファイルにマッチするときに、その(辞書順での)最後のファイル以外の1つ以上のファイルを、最後のファイルより辞書的に大きいファイル名にリネームして、かつ、最後のファイルもリネームした場合」のようです。

のときに、リネーム後のファイルがマッチして繰り返し処理される。

多分これで行けるはずです。

CMD

1for /f %%f in ('dir /b *.csv') do call :change %%f

#追記
見直すと、上記の点以外でもいろいろおかしいですね。
処理の流れがぐちゃぐちゃです。

CMD

1echo off 2(中略) 3echo 処理開始 4 5for /f %%f in ('dir /b *.csv') do call :change %%f 6echo 完了しました! Enterを押して終了してください。 7pause > nul 8exit /b 9 10:change 11set fileName=%1 12set fileName=%fileName:a=aaa% 13if not "%1"=="%fileName%" ( 14 ren %1 %fileName% 15 exit /b 16) 17set fileName=%1 18set fileName=%fileName:c=ccc% 19if not "%1"=="%fileName%" ren %1 %fileName% 20exit /b

投稿2021/08/26 01:20

編集2021/08/26 02:16
otn

総合スコア85762

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

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

mta77

2021/08/26 02:01

otn様、ご回答ありがとうございます 頂いたソースですが、 ”for %%f in (*.csv) do call :change %%f”部分を変更する理解でよろしいでしょうか。 所々実行しましたがうまくいかずアドバイス頂けると幸いです。
otn

2021/08/26 02:34 編集

そうです。 > 所々実行しましたがうまくいかずアドバイス頂けると幸いです。 どうなりましたか? 「うまくいかない」は解決のための情報量がゼロなので、どうなったかを書きましょう。 見直すと元々の構造が変ですね。 追記しておきます。
mta77

2021/08/26 02:47

アドバイスありがとうございます。実行し、a.csv→aaa.csvからc.csvまで処理は通りましたが、処理結果が”ccc.cccsv”となり正常終了しませんでした。 change内のサブルーチンで”set fileName=%fileName:c=ccc%”の追記処理が必要でしょうか。
otn

2021/08/26 03:50

それは、1行だけ置き換えたときの結果ですか? 追記に書いたとおり、元のコードは処理がぐちゃぐちゃなので、どうなるか考える気がしません。
mta77

2021/08/26 05:00

コードを変更して無事ファイル名が変更可能になりました。 ありがとうございました。
otn

2021/08/26 06:31

処理フローがぐちゃぐちゃなのは、「call :ラベル」 の処理がどうなるかが理解できていないからではないかと思います。 普通のプログラミング言語にある関数やメソッドとは全然違うので。
mta77

2021/08/27 00:19

call と exit /b exitの処理の仕方がまだ実行処理はできたものの まだピンと来ていないです。 バッチ処理について始めたばかリの事もあり勉強させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問