複数のフォルダ内に、下記のようなファイルがあります。
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コマンドはワイルドカードが使えないので頭をかかえています。
どなたかご教示いただければ幸いです。
よろしくお願いします。
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
早速の回答、有難うございます!(初めての投稿で、こんなに早くお返事をいただけると思っていませんでした)
いただいた.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%
のように追加したところ、完璧にできました!
助かりました。
前のコメントでご指摘のように、まだ駆け出しなので「()」は使わないようにしたいと思います。
No.6
- 回答日時:
他人の回答に勝手に解説を入れる試み:
#5 の「call」は UNIX のシェルにおける eval のようなもので, 「変数を展開してから再度実行する」という意味になります. だから
call set new=%%old:!dt!=FY09_01%%
は実質的に現在のシェルで
set new=%old:何とか=FY09_01%
(「何とか」は環境変数 dt を展開した結果: !dt! なので, 「実行時の値」を使う. あと, %% を展開すると % になることに注意) と入力したのと同じことになり, これを実行するので目的を達成できる, と.
こちらもフォローアップ有難うございました。
UNIXですか。。こちらもまた不案内ですが、考え方はわかりました。
皆様のご協力、感謝します!仕事に役立てます。
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 環境変数=%%・・・・%%
ってのは遅延展開の技?みたいなものらしい・・・。
詳しくなくてすみません。
呼ばれるタイミングを利用してるのではないかな?
No.4
- 回答日時:
面白そうなんでちょっとみてみました。
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" は バッチファイル名を呼び出すコマンドだと
理解しているのですが、上のような使い方もあるのでしょうか?
わからないことばかりで申し訳ありません。よろしくお願いします。
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
No.1
- 回答日時:
for %%a in (*_*.csv) do (
set fname=%%a
ren %fname% %fname:~0,-25%FY08_01%fname:~-10%
)
ってできるんだっけ?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチでテキストファイルから...
-
バッチファイルで電卓作ったの...
-
VBアプリケーションで終了コー...
-
コマンドプロンプトで2ヶ月前3...
-
コマンドプロンプト(バッチファ...
-
DOSのバッチで、変数中のファイ...
-
バッチファイルで常に最新の現...
-
バッチプログラムで変数の参照...
-
バッチファイルでDirで取得した...
-
C#でメジャーなバッチフレーム...
-
Kシェルでgotoのような処理を作...
-
コマンドプロンプト標準出力と...
-
大量のフォルダからひとつのフ...
-
コマンドプロンプトのエラーに...
-
binファイルを解凍したいの...
-
バッチファイル 特定ウインドウ...
-
コマンドプロンプトの「%1」と...
-
一定のファイル数ごとにフォル...
-
これってパソコンの最適化が完...
-
reaper音声ファイルについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチでテキストファイルから...
-
バッチファイルで昨日の日付を取得
-
コマンドプロンプト標準出力と...
-
コマンドプロンプトで2ヶ月前3...
-
コマンドプロンプト画面の閉じ...
-
コマンドプロンプト(バッチファ...
-
バッチファイルで常に最新の現...
-
VBアプリケーションで終了コー...
-
コマンドプロンプト(バッチ)...
-
バッチファイルでDirで取得した...
-
DOSのバッチで、変数中のファイ...
-
IPアドレスの第3オクテットだ...
-
バッチファイルで2つ以上の変...
-
子バッチ内のキー入力処理へ自...
-
バッチファイル(for文)がうま...
-
絶対パス名からファイル名を取...
-
呼び出し元バッチを知るには?
-
DOSのバッチで、テキストファイ...
-
バッチファイル テキストファイ...
-
echoとsystem関数について
おすすめ情報