- ベストアンサー
DOSコマンドでファイル名の一部を変更したい
複数のフォルダ内に、下記のようなファイルがあります。 ABCD_aaaa_20091234567899_1_of_3.csv ABC_DDD_bbbb_20091234567899_2_of_3.csv AAA_ccccd_20091234567899_3_of_3.csv 作業内容:ファイル名の「2009xxxxxxxxxx」を「FY08_01」 に変更します。 現在のファイルの状態: ・「2009」の後の数字「xxxxxxxxxx」は共通で、10桁あります。 ・「2009xxxxxxxxxx」の前のテキストの文字数や内容は一致 していません。 ・「2009xxxxxxxxxx」の前後には必ず「_」(アンダースコア)があります。 ・「2009xxxxxxxxxx」の後は必ず「x_of_x」となっています。 そこでDOSコマンドこんな風に書いてみたのですが、構文エラーとなってしまいました。 ********* echo off for %%a in (*_*.csv) do ( set fname=%%a set fname=%fname:~-25,14="FY09_01"% ren %%a %fname% ) ********* Webで検索して他の方法もいろいろと試したのですが、余計にわからなくなってきてしまいました。setコマンドはワイルドカードが使えないので頭をかかえています。 どなたかご教示いただければ幸いです。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#2です。考えすぎたようです orz..... #1の方の回答のままでは駄目ですが、 @echo off for %%a in (*_*.csv) do call :sub %%a goto :EOF :sub set A=%1 ren %A% %A:~0,-25%FY08_1%A:~-10% goto :EOF
その他の回答 (5)
- Tacosan
- ベストアンサー率23% (3656/15482)
他人の回答に勝手に解説を入れる試み: #5 の「call」は UNIX のシェルにおける eval のようなもので, 「変数を展開してから再度実行する」という意味になります. だから call set new=%%old:!dt!=FY09_01%% は実質的に現在のシェルで set new=%old:何とか=FY09_01% (「何とか」は環境変数 dt を展開した結果: !dt! なので, 「実行時の値」を使う. あと, %% を展開すると % になることに注意) と入力したのと同じことになり, これを実行するので目的を達成できる, と.
お礼
こちらもフォローアップ有難うございました。 UNIXですか。。こちらもまた不案内ですが、考え方はわかりました。 皆様のご協力、感謝します!仕事に役立てます。
- OKwebb
- ベストアンサー率44% (92/208)
#4です。 すいません。適当なこと書いて。 こんなんでどうですかね。 -------------------------------- echo off setlocal enabledelayedexpansion for %%a in (*_*.csv) do ( set old=%%a set dt=!old:~-25,14! call set new=%%old:!dt!=FY09_01%% ren !old! !new! ) endlocal -------------------------------- サブルーチン化があまり好きでないので遅延展開で。 call set 環境変数=%%・・・・%% ってのは遅延展開の技?みたいなものらしい・・・。 詳しくなくてすみません。 呼ばれるタイミングを利用してるのではないかな?
お礼
フォローアップ有難うございました。 いろいろなやり方があるのですね。 遅延展開の技、ですね。勉強してみます! 助かりました。
- OKwebb
- ベストアンサー率44% (92/208)
面白そうなんでちょっとみてみました。 for文の中が set fname=%%a set dt=%fname:~-25,14% call set new=%fname:%dt%=FY09_01% ren %%a %new% ではどうでしょう。 ちゃんと検証はしてないけど。
補足
早速の回答有難うございます(回答の早さに本当にびっくりしています)。 初心者のため、理解が遅くて申し訳ないのですが、いただいた 回答に基づいた構文は下のようになりますでしょうか? for %%a in (*_*.csv) do ( set fname=%%a set dt=%fname:~-25,14% call set new=%fname:%dt%=FY09_01% ren %%a %new% ) 多分私が間違っていると思うのですが、特にファイル名に変化はないようです。ちなみに"call" は バッチファイル名を呼び出すコマンドだと 理解しているのですが、上のような使い方もあるのでしょうか? わからないことばかりで申し訳ありません。よろしくお願いします。
- notnot
- ベストアンサー率47% (4900/10358)
残念ながら「後ろから25文字目から14文字を置換」というのは出来ません。また、doの後のカッコの中での環境変数の取り扱い方法も間違っています。初心者はカッコを使わない方が良いです。 ファイル名の長さごとに場合分けをするのがわかりやすいでしょう。 だらだら並べずにループで処理することも出来ますが、やや高度です。あとでわからなくなるかもしれないので、お勧めしません。 @echo off for %%a in (*_*.csv) do call :sub %%a goto :EOF :sub set A=%1 set B= if /i "%A:~30,3%" == "csv" set B=%A:~0,8%FY08_01%A:~22,10% if /i "%A:~31,3%" == "csv" set B=%A:~0,9%FY08_01%A:~23,10% if /i "%A:~32,3%" == "csv" set B=%A:~0,10%FY08_01%A:~24,10% (中略) if not defined B echo !!!! ERROR FILE="%A%" !!!!&goto :EOF ren %A% %B% goto :EOF ループする場合。 :sub set A=%1 set N=20 :loop if %N% gtr 99 echo !!!! ERROR FILE="%A%" !!!!&goto :EOF set /a N+=1 call set CSV=%%A:~%N%,3%% if /i not "%CSV%" == "csv" goto loop set /a I=N-22 set /a J=N-8 call set B=%%A:~0,%I%%%FY08_1%%A:~%J%,10%% ren %A% %B% goto :EOF
- Tacosan
- ベストアンサー率23% (3656/15482)
for %%a in (*_*.csv) do ( set fname=%%a ren %fname% %fname:~0,-25%FY08_01%fname:~-10% ) ってできるんだっけ?
お礼
早速の回答、有難うございます!(初めての投稿で、こんなに早くお返事をいただけると思っていませんでした) いただいた.bat を試した結果、 (前)AAA_ccccd_20091234567899_3_of_3.csv ↓ (後)AAA_ccccd_FY08_13_of_3.csv となって"FY_1"と"3"がくっついてしまったのですが、 ren %A% %A:~0,-25%FY08_1%A:~-10% にアンダースコア(_)を ↓ ren %A% %A:~0,-25%FY08_1_%A:~-10% のように追加したところ、完璧にできました! 助かりました。 前のコメントでご指摘のように、まだ駆け出しなので「()」は使わないようにしたいと思います。