我正在尝试运行以下命令:
forfiles /p ..\Schemas /m *.xsd /c "cmd /c ""C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\xsd.exe @path /classes"""
但是,它失败了:
ERROR: Invalid argument/option - 'Files'.
Type "FORFILES /?" for usage.
这些也不起作用:
forfiles /p ..\Schemas /m *.xsd /c "cmd /c \"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\xsd.exe\" @path /classes"
forfiles /p ..\Schemas /m *.xsd /c "cmd /c ^"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\xsd.exe^" @path /classes"
肯定是失败了,因为传递给 cmd
的路径包含空格。你通常通过引用整个论点来解决这个问题。但是,似乎没有办法传递双引号。
那么,如何使用 Windows forfiles 命令的完整路径运行命令?
最佳答案
在您的第一次尝试中,您尝试在 cmd/c
之后在整个命令行周围放置(额外的)引号,而不是仅在可执行文件的路径中放置引号,这将失败,因为 cmd
尝试查找整行并将其作为命令执行。因此,您需要在 xsd.exe
之后立即移动结束引号,而不是在命令行末尾。
不过,总的来说,这里的主要问题是 cmd
和 forfiles
处理引号的方式不同。 forfiles
使用 \"
转义引号,但 cmd
不关心反斜杠。此外,如果您的代码出现在括号内的代码,如果它们没有出现在 cmd
的引号中,您的路径中的文字括号可能会另外引起麻烦。最后,cmd
可能会尝试去除引号(意外),这可能会导致更多问题。
要解决所有这些问题,请使用另一种方法,在/C
之后为命令行提供文字引号: forfiles
支持通过 中的十六进制代码指定字符0xHH
符号;所以声明 0x22
隐藏父 cmd
实例的引号,直到实际执行命令行:
forfiles /p ..\Schemas /m *.xsd /c "cmd /c 0x220x22C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\xsd.exe0x22 @path /classes0x22"
这会导致执行以下命令行(使用 "D:\Data\Schemas\sample.xsd"
作为 @path
的示例值):
cmd /c ""C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\xsd.exe" "D:\Data\Schemas\sample.xsd" /classes"
最后,通过cmd
去掉最外层的引号后,执行如下命令行:
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\xsd.exe" "D:\Data\Schemas\sample.xsd" /classes
请注意 @path
,以及所有其他与文件名和路径相关的 @
样式的 forfiles
变量扩展为已经引用的值。
最初,我完全忘记了 cmd
试图去除引号这一事实。 Klitos Kyriacou的 answer让我想起了那个;所以如果你喜欢我的回答,请不要忘记给他们点赞!
关于windows - 如何使用 Windows forfiles 命令的完整路径运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39452239/