ForFiles:如何防止@FNAME被括在引号中?

ForFiles:如何防止@FNAME被括在引号中?

我喜欢使用对文件执行批处理作业的想法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"

现在可以执行了。

这个问题删除整个命令行中的所有引号,这会中断文件和带有空格的路径)

答案1

Forfiles 无法做到这一点。但是 For 可以。

在您的批处理文件中,您可能想要使用以下内容:

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"

相关内容