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