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

バッチ初心者です。
指定したフォルダのテキストファイルを一括置換するバッチファイルを作成したのですが、
for文を使うところでつまづいてしました。
for文のin( )内にディレクトリを入れると失敗してしまいます。

失敗例↓
for %%f in (d:\aaa\*.txt) do (
set fname=%%f
set fname=!fname:%1=%2!
ren %%f !fname!
)

for文を
for %%f in (*.txt)
にすると成功します。

IN( )内にディレクトリを入れると処理が失敗するのはなぜでしょうか??
helpを読んでもわかりません。

試しにオプション付けて
for /r d:\aaa %%f in (*.txt) do echo %%f
を実行すると成功するので、

for /r d:\aaa %%f in (*.txt) do (
・・・・
)
にしてみましたが、成功しません。。。

A 回答 (5件)

補足どもです。



> renの部分をechoで出力してみたところ、
> ren d:\aaa\sample01.txt d:\aaa\aample01.txt
> というように、しっかりと変更されていました。
まずそのコマンドを単独でコマンドプロンプトから実行してみてください。
「コマンドの構文が誤っています。」と出てきましたね?
つまりrenコマンドの使い方が間違っています。

どこが間違っているのかは、コマンドプロンプトで
ren /?
を実行してrenのヘルプを見て確認してください。


どこが間違っているのか分かったところで
次はこれを修正する方法ですが、
1つの方法として
set fname=%%f

set fname=%%~nxf
と修正するという手があります。

%~nx の意味は
for /?
を実行してforのヘルプを見て確認してください。
    • good
    • 0
この回答へのお礼

ご指摘の通りに修正したところ成功しました。
ヘルプの読み込みが足りないことを痛感しました。
また、エラー原因の探し方が大変勉強になりました。
本当にありがとうございました。

お礼日時:2009/03/03 00:07

うまくいかないならどううまくいかないのか位書こうよ。


例えばこんなエラーが出るとか、
renのところをechoで出力してみたら期待していたのと違うとか。

でも、forの中身をechoだけにしてうまくいくなら、
forは正しく動いているけどforの中身が間違ってるのでは?

遅延環境変数の展開を使ってるみたいだけど
まさか遅延環境変数の展開を有効にしてないってことはないよね?

この回答への補足

私の文章が変だったので、訂正します。

>>しかし、dir /b で見てみるとsample01.txtのままです。
これは、echoで見ているから当たり前ですね。

補足日時:2009/03/02 14:59
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>うまくいかないならどううまくいかないのか位書こうよ。
失礼しました。
D:\aaa>cmd.exe /v:on /c Sample23.bat s a
で実行すると、
コマンドの構文が誤っています。
といわれてしまいます。

renの部分をechoで出力してみたところ、
ren d:\aaa\sample01.txt d:\aaa\aample01.txt
というように、しっかりと変更されていました。
しかし、dir /b で見てみるとsample01.txtのままです。

echoで出力してわかったのですが、
in( )内にディレクトリを入れるとディレクトリも変更対象に
なるみたいで、テキストファイルがリネームされないみたいです。

お礼日時:2009/03/02 14:56

バッチファイルで検索したら、書き方いっぱいでてくると思います。




仕方がないのでcd使う手もあります。
でも今どこかをよくよく気にしないといけません。
    • good
    • 1

バッチファイルの限界ですかね。

forはそういう仕様なのでしょう。

仕方がないのでfor以外を検討されては?
    • good
    • 0
この回答へのお礼

for以外を検討して見たいと思います。
でも、for以外って全く思いつかないです。。。

お礼日時:2009/03/02 00:40

ディレクトリが間違っているのか、長すぎて認識できないのかでしょう。



またディレクトリにスペースや特殊記号などで認識されない場合があります。ダブルクォーテーション"でくくるか、ディレクトリを変更するかしたら良いと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>ディレクトリが間違っているのか、長すぎて認識できないのかでしょう。
ディレクトリは、実際にd:\aaaというフォルダを作った後バッチを実行しているので、長すぎはなさそうです。
あと、for /r d:\aaa %%f in (*.txt) do echo %%fで成功してるのでディレクトリはあってそうです。

>またディレクトリにスペースや特殊記号などで認識されない場合があります。ダブルクォーテーション"でくくるか、ディレクトリを変更するかしたら良いと思います。
ダブルクォーテーションでくくってみましたが、駄目でした。
確かにディレクトリを書かなければ良い問題なのですが、書くとなぜ失敗するのか知りたいです。。。

お礼日時:2009/03/02 00:14

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