© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2016
半角括弧だけなら、こんなのも。
setlocal enabledelayedexpansion
set x=%*
for %%i in (!x!) do (echo %%i)
pause
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
任意のファイルに対する処理を自動化するため、
バッチに各ファイルをドラッグ&ドロップして実行するようなバッチを作成しようとしています。
サンプルとして次の2行のみのバッチを作成し、ドロップしてみました。
for %%i in (%*) do (echo %%i)
pause
すると引数として取得したファイルパスに半角括弧が含まれている場合に強制終了してしまいます。
調べてみたところ、 「%*」の展開時に右括弧を含む引数があるとエラーが生じるようです。
(ドロップするファイル名が「hoge.txt」なら問題なし。「hoge(fuga).txt」だとエラー)
これのエラーを回避することは出来ないでしょうか。
「"%*"」としたり、「/f "usebackq"」 をつけても上手くいきませんでした。
宜しくお願いします。
ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。 プライバシーを保護するために、移行された質問のユーザー プロファイルは匿名化されます。
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2016
半角括弧だけなら、こんなのも。
setlocal enabledelayedexpansion
set x=%*
for %%i in (!x!) do (echo %%i)
pause
© ウィンドウズスクリプトプログラマ - Windows Script Programmer 2016
無理。
ファイル名かディレクトリ名の中に空白を入れて、回避。
どうしてもなら、vbsに変える。
他にもうまく行かないケース。
全角空白を含む。
回避、対処は同じ。
迅速な回答ありがとうございます。
Forだと無理な様ですので、Forを使わずにループさせました。
:LOOPSTART
if "%~1" == "" goto LOOPEND
echo %~1
shift
goto LOOPSTART
:LOOPEND
これであれば半角括弧を含んでいても処理ができました。
しかしご指摘のように、引数に全角スペースを含むとそこで引数を区切ってしまうので
その場合はやはり問題が生じます。(強制終了しないだけマシですが)
そのためvbsを検討しました。
なお、既に運用中のバッチがあるため、バッチからVBSに渡す形にしました。
test2.vbs %*
############End
For Each arg In WScript.Arguments
wscript.echo arg
Next
#############End
これで無事解決しました。ありがとうございます。
なるほど、遅延展開を利用するんですね。
先に構文(for ... in (...) do ...)を読ませた後に変数x(=%*)を展開すれば引数の内容は構文には影響しないと。
勉強になりました。ありがとうございます
因みに、今回調べて見たらDosコマンドには全角スペース以外にも文字列に関する不都合な仕様がいくつかあるようですね。
であればファイルを個別に扱う様な処理はバッチではなくやはりVBS等で扱った方が良いと思い至りました。