我喜欢使用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
被引号包裹?
我的 hacky 解决方法是回显命令而不是执行命令,使用另一个字符(例如*
)来标记文件名的开头和结尾,然后将输出发送到临时文件:
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"
现在可以执行了。
(这个问题删除了整个命令行中的所有引号,这会在文件和路径上用空格打断)
Forfiles 无法做到这一点。不过可以。
在您的批处理文件中,您需要使用以下内容:
这个单行也可以直接在 CMD 中使用,如果是这样,请改用以下内容: