2
2022.03.08
forfiles
を使用して、次のようなファイルのバッチジョブを実行するというアイデアが大好きです。
forfiles /m *.abc /c "cmd /c someprogram.exe -input @FILE -output @FNAME.xyz"
forfilesが@FNAME
を引用符で囲むことを要求しているため、これが機能しないことを除いて、次のようになります。
someprogram.exe -input "my file.abc" -output "my file".xyz
これは無効で失敗します。
@FNAME
が引用符で囲まれるのを防ぐにはどうすればよいですか?
私のハッキーな回避策は、コマンドを実行するのではなくエコーし、別の文字( *
など)を使用してファイル名の開始と終了をマークし、出力を一時ファイルに送信することです。
forfiles /m *.abc /c "cmd /c echo someprogram.exe -input *@FILE* -output *@FNAME.xyz*" > go.bat
次に、PowerShellを使用してすべての"
を削除し、 *
を"
に置き換えます。
powershell -Command (Get-Content go.bat) -replace '\"', '' -replace '\*', '\"' | Out-File -encoding ASCII go.bat
最初の行の後、 go.bat
には次のものが含まれます。
someprogram.exe -input *"my file.abc"* -output *"my file".xyz*
PowerShellの後、 go.bat
には次のものが含まれます。
someprogram.exe -input "my file.abc" -output "my file.xyz"
これで実行できます。
(この質問は、コマンドライン全体のすべての引用符を削除します。これは、スペースを含むファイルとパスで壊れます)