- ベストアンサー
バッチファイルのfor文の使い方がわからない!
- バッチ初心者のあなたが、指定したフォルダのテキストファイルを一括置換するバッチファイルを作成しましたが、for文の使い方につまづいています。
- for文のin( )内にディレクトリを入れると処理が失敗してしまう現象が起きており、その理由がわかりません。
- オプションを付けた場合は成功することから、for /rコマンドを使用してみたが、それでも成功しない状況です。
- みんなの回答 (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のヘルプを見て確認してください。
その他の回答 (4)
- Gotthold
- ベストアンサー率47% (396/832)
うまくいかないならどううまくいかないのか位書こうよ。 例えばこんなエラーが出るとか、 renのところをechoで出力してみたら期待していたのと違うとか。 でも、forの中身をechoだけにしてうまくいくなら、 forは正しく動いているけどforの中身が間違ってるのでは? 遅延環境変数の展開を使ってるみたいだけど まさか遅延環境変数の展開を有効にしてないってことはないよね?
お礼
回答ありがとうございます。 >うまくいかないならどううまくいかないのか位書こうよ。 失礼しました。 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( )内にディレクトリを入れるとディレクトリも変更対象に なるみたいで、テキストファイルがリネームされないみたいです。
補足
私の文章が変だったので、訂正します。 >>しかし、dir /b で見てみるとsample01.txtのままです。 これは、echoで見ているから当たり前ですね。
- shikaruni
- ベストアンサー率20% (19/95)
バッチファイルで検索したら、書き方いっぱいでてくると思います。 仕方がないのでcd使う手もあります。 でも今どこかをよくよく気にしないといけません。
- shikaruni
- ベストアンサー率20% (19/95)
バッチファイルの限界ですかね。forはそういう仕様なのでしょう。 仕方がないのでfor以外を検討されては?
お礼
for以外を検討して見たいと思います。 でも、for以外って全く思いつかないです。。。
- shikaruni
- ベストアンサー率20% (19/95)
ディレクトリが間違っているのか、長すぎて認識できないのかでしょう。 またディレクトリにスペースや特殊記号などで認識されない場合があります。ダブルクォーテーション"でくくるか、ディレクトリを変更するかしたら良いと思います。
お礼
回答ありがとうございます。 >ディレクトリが間違っているのか、長すぎて認識できないのかでしょう。 ディレクトリは、実際にd:\aaaというフォルダを作った後バッチを実行しているので、長すぎはなさそうです。 あと、for /r d:\aaa %%f in (*.txt) do echo %%fで成功してるのでディレクトリはあってそうです。 >またディレクトリにスペースや特殊記号などで認識されない場合があります。ダブルクォーテーション"でくくるか、ディレクトリを変更するかしたら良いと思います。 ダブルクォーテーションでくくってみましたが、駄目でした。 確かにディレクトリを書かなければ良い問題なのですが、書くとなぜ失敗するのか知りたいです。。。
お礼
ご指摘の通りに修正したところ成功しました。 ヘルプの読み込みが足りないことを痛感しました。 また、エラー原因の探し方が大変勉強になりました。 本当にありがとうございました。