3

次のコマンドを実行しようとしています。

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 コマンドからフル パスを指定してコマンドを実行するにはどうすればよいでしょうか。

4

2 に答える 2

3

ここに問題があるわけforfilesではありません。これは、cmd.exe が引用符を処理する方法です。それは本質的に、それ自体の利益のために賢くなりすぎようとしています。このCMD /Cコマンドは、スペースを含むものを含め、任意の行をコマンドとして使用できます。ただし、後に指定されたコマンド ラインCMD /Cが引用符で始まる場合は、実行を試みる前に最初と最後の引用符を行から削除します。したがって、これらの 2 つの行はまったく同じです。

cmd /c echo hello
cmd /c "echo hello"

問題は、次のコマンドで引用符が取り除かれることです。

cmd /c "C:\Program Files\xyz\abc.exe" one two

希望どおりにするには、全体を引用符で囲む必要があります (内側の引用符はエスケープする必要はありません)。

cmd /c ""C:\Program Files\xyz\abc.exe" one two"

FORFILESこれで、これをコマンドに入れることができます。FORFILES では、引用符を でエスケープする\必要があるため、次のように記述する必要があります。

forfiles /c "cmd /c \"\"C:\Program Files\xyz\abc.exe\" one two\""

またはあなたの特定のケースでは:

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\""

( for のすべての引用符CMDはエスケープされますが、外側の引用符は for でFORFILESあるため、エスケープされないことに注意してください。)

于 2016-09-12T16:15:42.477 に答える