• ベストアンサー

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コマンドはワイルドカードが使えないので頭をかかえています。 どなたかご教示いただければ幸いです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

#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

Ponyo27
質問者

お礼

早速の回答、有難うございます!(初めての投稿で、こんなに早くお返事をいただけると思っていませんでした) いただいた.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% のように追加したところ、完璧にできました! 助かりました。 前のコメントでご指摘のように、まだ駆け出しなので「()」は使わないようにしたいと思います。

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

他人の回答に勝手に解説を入れる試み: #5 の「call」は UNIX のシェルにおける eval のようなもので, 「変数を展開してから再度実行する」という意味になります. だから call set new=%%old:!dt!=FY09_01%% は実質的に現在のシェルで set new=%old:何とか=FY09_01% (「何とか」は環境変数 dt を展開した結果: !dt! なので, 「実行時の値」を使う. あと, %% を展開すると % になることに注意) と入力したのと同じことになり, これを実行するので目的を達成できる, と.

Ponyo27
質問者

お礼

こちらもフォローアップ有難うございました。 UNIXですか。。こちらもまた不案内ですが、考え方はわかりました。 皆様のご協力、感謝します!仕事に役立てます。

  • OKwebb
  • ベストアンサー率44% (92/208)
回答No.5

#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 環境変数=%%・・・・%% ってのは遅延展開の技?みたいなものらしい・・・。 詳しくなくてすみません。 呼ばれるタイミングを利用してるのではないかな?

Ponyo27
質問者

お礼

フォローアップ有難うございました。 いろいろなやり方があるのですね。 遅延展開の技、ですね。勉強してみます! 助かりました。

  • OKwebb
  • ベストアンサー率44% (92/208)
回答No.4

面白そうなんでちょっとみてみました。 for文の中が set fname=%%a set dt=%fname:~-25,14% call set new=%fname:%dt%=FY09_01% ren %%a %new% ではどうでしょう。 ちゃんと検証はしてないけど。

Ponyo27
質問者

補足

早速の回答有難うございます(回答の早さに本当にびっくりしています)。 初心者のため、理解が遅くて申し訳ないのですが、いただいた 回答に基づいた構文は下のようになりますでしょうか? 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% (4848/10261)
回答No.2

残念ながら「後ろから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)
回答No.1

for %%a in (*_*.csv) do ( set fname=%%a ren %fname% %fname:~0,-25%FY08_01%fname:~-10% ) ってできるんだっけ?

関連するQ&A

  • コマンドプロンプトでのファイル操作について

    コマンドプロンプトでのファイル操作について、ご存知のかたどうか教えてください。 a.txt b.txtという2つのファイルがあるとします。 <a.txtの内容> 1111 2222 3333 <b.txtの内容> aaaa bbbb cccc 上記の2つのファイルを読み取りc.txtというファイルへ以下のように 出力したいのですが、コマンドプロンプト(batでも問題ありません) にてできるのでしょうか? <c.txtの内容> 1111,aaaa 2222,bbbb 3333,cccc ご教授のほど、宜しくお願いします。

  • DOSのバッチファイルについての質問です。

    DOSのバッチファイルについての質問です。 フォルダ内のファイルネームを一括変更したいと考えています。 変更したい文字がたくさんあり、その都度インプットして処理したいと思い 下記のようなバッチを組んだのですが上手く動きません。 何かいい方法があればご教授下さい。よろしくお願いします。 echo off SET /P word= for %%a in (*%word%*) do call :sub "%%a" exit /b :sub set fname=%~1 set fname=%fname:%woad%=ああ% ren %1 "%fname%" goto :EOF

  • kshスクリプトからCSVファイルへの書き込み追加

    いつもお世話になっております。 毎日データを取得し、結果をcsvファイルに書き込みしていくようなkshのスクリプトを作成中です。 例えばスクリプトで以下のように毎日実行していくと echo "AAAA" >> file2009_04.csv echo "BBBB" >> file2009_04.csv echo "CCCC" >> file2009_04.csv file2009_04.csvファイルには AAAA BBBB CCCC と縦方向のセル(A列)に書き込まれます。 これを以下のように横方向に(A1,B1,C1)書き込まれるようにする方法はありますか? AAAA | BBBB | CCCC | (←"|"はセル区切りのつもり) というのも書き出す部分がAAAAなんていう単語ではなく何十行もあるコマンド結果であり、A列に延々と書かれると追えなくなってしまうのです。 なので今はcsvが出来たらexcelで開いて、切り貼りして横に追加しています… 一ヶ月後にファイルを見たら、手でexcelを集計しなおすことなく、ざっとデータの推移がわかるようなものを作りたいです。 ご存知の方、よろしくお願いいたします。

  • コマンドプロンプトでファイル名を編集したい

    どなたか、ご存知の方教えてください。 以下の仕様の処理をWindows7にて、コマンドプロンプトで行おうとしています。 ですが、ファイルの名前と作成日を変数にセットする所(以下のソースの2行目、3行目)がうまくいっていないようです。 アドバイスをお願いできますでしょうか? できればその後もアドバイス頂けたらと・・・思います。 ファイル名を直接指定してのソースはできたんですが、 「*.png」という拡張子を指定し処理としたいです。 <仕様> 「実行フォルダの中にある、特定の拡張子(png)のファイルの 名前にファイル作成日を追加する」 <実行例> ファイル名:a.png ファイル作成日:2014/10/01 10:05:01 実行後ファイル名:a_2014100110.png <ソース(未完成)> for %%F in ( *.png ) do ( SET fname=%%~nF SET wktime=%%~tF SET ftime = %wk1:~0,4%%wk1:~5,2%%wk1:~8,2% SET newname = %fname%_%ftime%.png REN %%F %newname% ) よろしくお願い致します。

  • フォルダー内の複数ファイル名を一括で変名するbat

    フォルダー内の複数ファイル名を一括で変名するbatを教えてください。 batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。 以下のような形式です。  No1 aaaa bbbb [com : *********].zip を  No1 aaaa bbbb.zip に変名する。   (*******は任意の文字列) 例えば、 No1 aaaa bbbb [com : taken2110221100014].zip であれば No1 aaaa bbbb.zip に変名する。 以下が参考になりそうなので https://oshiete.goo.ne.jp/qa/9263608.html 記事中の助言を元に以下のようにコードを修正してみましたが うまく処理できませんでした。 bat(test,bat,test2.bat)のどこを再修正すれば希望の処理ができますか ? 希望は、下記ですが 「batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。」 batを修正してもこのbatでは、D&Dで処理することは可能で無い場合は アドバイス又は他の参考なりそうなURLを紹介ください。 '------------------------------------------ rem test.bat echo off for /F "delims=" %%f in ('dir /*.mp4') do call :sub "%%f" exit /*.mp4 :sub set fname=%~1 set n=0 :loop call set c=%%fname:~%n%,1%% set /a n=n+1 if "%c%"=="" goto :EOF if "%c%"=="[com" goto break goto loop :break set /a n=n-1 set ext=%~x1 call set newname=%%fname:~0,%n%%% call set newname=%newname%%ext% if "%newname%"=="" goto :EOF if "%newname:~0,1%"=="." goto :EOF ren "%fname%" "%newname%" goto :EOF '-------------------------------------- rem bat2.bat for /F "tokens=1* delims=[com" %%F in ('dir /b *.mp4') do echo move %%F[com%%G %%F.mp4 '--------------------------------------

  • DOSコマンドを教えてください

    DOS(batファイル)で、コンピュータ名とIPアドレスを取得して、csvに吐き出したいのですが、 IPアドレスの取得ってどうすれば良いのでしょうか? ipconfigを使うとIP_Addressの次のsubnet_maskを取得しているように思えます。 今、私が作ってみたのは以下のコマンドです。 rem コンピュータ名取得 set my_computername=%computername% rem IPアドレス取得 for /f "skip=7 tokens=15" %a in ('ipconfig') do set my_ipaddress="%a" rem CSVファイル出力 echo %my_computername% , %my_ipaddress% >> sample_out.csv また、そのアドレスにもダブルコーテーションが付加されています。取ることはできますか? DOSコマンド自体、あまり知識がなく困っています。 方法がありましたら教えていただけませんか?

  • DOSコマンドの環境変数取得について

    DOSコマンドで/区切りの文字列の取得方法が分からなく教えて頂きたいです。 (例) DOSコマンドでdddだけ取得して表示したいです。 set test=aaa/bbb/ccc/ddd UNIXshellだと test=aaa/bbb/ccc/ddd file=`basename $1` echo $file ddd setコマンドの置換""ではなく、/区切り位置での取得方法で 何か方法がありますでしょうか? ご説明内容が分かりにくくて申し訳ございませんが、 よろしくお願い致します。

  • windows10 DOSコマンドのワイルドカード

    以前のwindowsコマンドプロンプトでは、DOSコマンドで同一フォルダのファイルの名前をまとめて変更したいとき「*」 や「?」のワイルドカードが普通に使えていました。 ところが、windows10 のコマンドプロンプトで ren *.* x_*.* と打つと aaa.doc  →x_a.doc bbb.doc →x_b.doc とリネームされてしまいます。 期待している結果は、 x_aaa.doc x_bbb.doc です。 何かよい方法があれば教えてください。 Windows Power Shell とか使えば可能でしょうか?

  • batファイル 拡張子変更

    こんにちは。 すいません。初心者です質問させていただきます。 ファイルの拡張子を変更するbatファイルを見ようみまねで作ってみたのですが、動きません。 -------batファイルの内容です------- set C:\rename=%basyo set syaryou_R???.0??=%Rmoto set syaryou_S???.0??=%Smoto set syaryou_R???.0??.csv=%Rato set syaryou_S???.0??.csv=%Sato cd %basyo ren %Rmoto %Rato ren %Smoto %Sato ---------------------------- こんな感じなのですが、何が悪いか分かりません。 よろしくお願いします。

  • 条件分岐~同じファイル名がある場合は実行せず

    下記スクリプトにてカレントディレクトリにaaaaおよびbbbbという文字列が存在するファイルを./ccc/dddディレクトリに移行するということを行っています。 下記スクリプトでコピーの処理がありますが、 同じファイル名が./ccc/dddディレクトリに存在する場合、そのファイルについてのみコピーを行わないようにするスクリプトを考えております(同じファイルを何度も./ccc/dddディレクトリにコピーするという事を無くしたいため)。 どなたかお分かりでしたらご教授ください。 実際にスクリプトに追加していただけると助かります。 php4.3.2です。 ======== <?PHP if ($dir = opendir("./")) { while (($file = readdir($dir)) !== false) { if(preg_match("/aaaa/",$file)) { if(preg_match("/bbbb/",$file)) { copy("./".$file,"./ccc/ddd/".$file); } } } closedir($dir); } ?> ========

    • ベストアンサー
    • PHP

専門家に質問してみよう