ForFiles:@FNAMEが引用符で囲まれないようにするにはどうすればよいですか?

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"

これで実行できます。

この質問は、コマンドライン全体のすべての引用符を削除します。これは、スペースを含むファイルとパスで壊れます)

回答
2
2022.03.08

Forfilesはこれを行うことができません。しかし、できます。

バッチファイルでは、次を使用する必要があります。

 for %%f IN (*.abc) DO someprogram.exe -input "%%F" -output "%%~nF.xyz"

このワンライナーはCMDで直接使用することもできます。その場合は、代わりに次を使用してください。

 for %f IN (*.abc) DO someprogram.exe -input "%F" -output "%~nF.xyz"