電子書籍の厳選無料作品が豊富!

複数のフォルダ内に、下記のようなファイルがあります。

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

よろしくお願いします。

A 回答 (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
    • good
    • 1
この回答へのお礼

早速の回答、有難うございます!(初めての投稿で、こんなに早くお返事をいただけると思っていませんでした)

いただいた.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%
のように追加したところ、完璧にできました!
助かりました。

前のコメントでご指摘のように、まだ駆け出しなので「()」は使わないようにしたいと思います。

お礼日時:2009/03/17 18:45

他人の回答に勝手に解説を入れる試み:


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

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

お礼日時:2009/03/23 14:01

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

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

お礼日時:2009/03/23 13:59

面白そうなんでちょっとみてみました。


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" は バッチファイル名を呼び出すコマンドだと
理解しているのですが、上のような使い方もあるのでしょうか?

わからないことばかりで申し訳ありません。よろしくお願いします。

補足日時:2009/03/17 18:46
    • good
    • 0

残念ながら「後ろから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
    • good
    • 0

for %%a in (*_*.csv) do (


set fname=%%a
ren %fname% %fname:~0,-25%FY08_01%fname:~-10%
)
ってできるんだっけ?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!