Как я справляюсь с символами кавычек при использовании cmd.исполняемый


Я пытаюсь сделать это:

cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out"

однако, у меня есть проблемы, которые сводятся к пути cmd.исполняемые произведения. Если Вы читаете справку для него, он обрабатывает " символы особым образом. См. справку в конце вопроса. Так что, это не выполняется правильно... Я предполагаю, что cmd.exe удаляет некоторые цитаты, что делает заявление плохо сформированным.

Я могу сделать это успешно:

// quotes not required around folder with no spaces
cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > C:\temp\FolderWithNoSpaces\SomeProgram.out

но мне действительно нужно, чтобы первый работал. Есть ли далеко вокруг странное обработка цитату, что УМК.exe использует? Я хочу, чтобы он сохранил все цитаты, но, похоже, нет возможности сделать это.


справка взята из вывода: cmd/?

Если указан /C или /K, то остальная часть командной строки после переключатель обрабатывается как командная строка, где логика используется для обработки символов кавычек ("):

1.  If all of the following conditions are met, then quote characters
    on the command line are preserved:

    - no /S switch
    - exactly two quote characters
    - no special characters between the two quote characters,
      where special is one of: &<>()@^|
    - there are one or more whitespace characters between the
      the two quote characters
    - the string between the two quote characters is the name
      of an executable file.

2.  Otherwise, old behavior is to see if the first character is
    a quote character and if so, strip the leading character and
    remove the last quote character on the command line, preserving
    any text after the last quote character.
2   51  

2 ответа:

Ах. до. Думаю, я сам ответил на свой вопрос.

Если вы используете /S и обертываете все это в кавычки, он просто удаляет эти внешние кавычки.

cmd.exe /S /C " do what you like here, quotes within the outermost quotes will be preserved "

Я думаю, вы найдете, что ваш пример работает абсолютно нормально, как это.

cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out"

я воспроизвел ваш пример здесь http://pastebin.com/raw.php?i=YtwQXTGN

C:\>cmd /c "c:\Program Files\my folder\my long program.exe" > "c:\temp\spaces are here\a.a"

C:\>type "c:\temp\spaces are here\a.a"
my long program.exe has run

C:\>

further example demonstrating it works with "my long program.exe", removing cmd /c, it operates fine too.

C:\>"c:\Program Files\my folder\my long program.exe" > "c:\temp\spaces are here\
a.a"

C:\>type "c:\temp\spaces are here\a.a"
my long program.exe has run

C:\>



Another example, but with replace.  replace with no parameters says "source path required"  "no files replaced"

C:\>replace > a.a
Source path required

C:\>type a.a
No files replaced

Exactly the same effect when they're in folders with spaces.

C:\>cmd /c "c:\Program Files\my folder\replace.exe" > "c:\temp\spaces are here\r.r"
Source path required

C:\>type "c:\temp\spaces are here\r.r"
No files replaced

C:\>

further demonstration with replace
without cmd /c works fine too.

C:\>"c:\Program Files\my folder\replace.exe" > "c:\temp\spaces are here\r.r"
Source path required

C:\>type "c:\temp\spaces are here\r.r"
No files replaced

C:\>

причина, почему ваш пример работает нормально

cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out"

и как / почему это работает так, потому что > интерпретируется как специальный хост.ехе вот это cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" - Я думаю, - оценивается в первую очередь. т. е. cmd /c не видит > и после этого.

cmd/? показано 2 случая

Случай 1 и Случай 2. Ваш пример соответствует случаю 1

If /C or /K is specified, then the remainder of the command line after
the switch is processed as a command line, where the following logic is
used to process quote (") characters:

    1.  If all of the following conditions are met, then quote characters
        on the command line are preserved:

        - no /S switch
        - exactly two quote characters
        - no special characters between the two quote characters,
          where special is one of: &<>()@^|
        - there are one or more whitespace characters between the
          two quote characters
        - the string between the two quote characters is the name
          of an executable file.

    2.  Otherwise, old behavior is to see if the first character is
        a quote character and if so, strip the leading character and
        remove the last quote character on the command line, preserving
        any text after the last quote character.

вы можете проверить, что ваш пример соответствует случаю 1, потому что если вы добавляете /S (без добавления каких-либо кавычек или внесения каких-либо изменений в ваш пример, кроме добавления /s), то вы получаете другой результат, потому что это делает ваш пример хитом случай 2. Таким образом, это доказывает, что ваш пример определенно случай 1. И она четко соответствует всем критериям случае 1. Если бы ваш пример был случаем 2, и вы добавили /s, то это не имело бы никакого значения.

ваш ответ интересен тем, что показывает альтернативный способ получения результата, но в случае 2. Добавляя дополнительные внешние кавычки и добавляя /s.

но на самом деле, когда вы добавляете эти дополнительные внешние кавычки, то вы просто сделали это случай 2, и добавление a /s поверх этого не будет иметь значения.

C:\>cmd /c "c:\Program Files\my folder\replace.exe"
Source path required
No files replaced

C:\>cmd /s /c "c:\Program Files\my folder\replace.exe"
'c:\Program' is not recognized as an internal or external command,
operable program or batch file.

C:\>cmd /c ""c:\Program Files\my folder\replace.exe""
Source path required
No files replaced

C:\>cmd /s /c ""c:\Program Files\my folder\replace.exe""
Source path required
No files replaced

C:\>

пример в вашем вопросе работали штраф в размере

cmd.exe /C "C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out"

ваша альтернатива (с /S и внешними кавычками), которую вы даете в качестве ответа, чтобы заставить пример работать, тоже отлично работает

cmd.exe /S /C ""C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out""

хотя ваш ответ, который является альтернативой, на самом деле может быть упрощен путем удаления /S, потому что это уже случай 2, поэтому добавление /s не будет иметь никакого значения. Так что это улучшит решение, данное в вашем ответе

cmd.exe /C ""C:\Program Files\Somewhere\SomeProgram.exe" > "C:\temp\Folder Containing Spaces\SomeProgram.out""

ваш пример, который вы описали, проблема в вашем вопросе, и ваш решение, производит такой же хороший результат. Но одна большая разница, я полагаю, (и я не уверен, как это проверить), но одна разница в том, как работает ваш пример, и как работает решение в вашем ответе, я думаю, в случае вашего примера, хостинг/вызов cmd.exe выполняет перенаправление в файл. В то время как в примере вашего решения вызывается cmd.exe передается > хостом cmd.exe, и поэтому вызванный cmd.exe делает редирект. И конечно, ваш пример-это случай 1, а ваше решение-это поправка, которую вы сделали (очень хорошо), чтобы заставить ее работать в случае 2.

надеюсь, я не ошибся здесь, возможно. Но ваш вопрос и ответ помогли мне обернуть голову вокруг того, как cmd и, в частности, cmd /c работает!

возможно, ваш пример был чрезмерным упрощением вашего фактического, и ваш фактический потерпел неудачу и нуждался в вашей поправке. Если ваш пример был немного сложнее, например, имея параметр для программы, которая взял кавычки, тогда это будет неудачный случай 1, и вам действительно понадобятся внешние кавычки (/S не изменит результат, поэтому нет /S будет необходимо, так как это уже будет случай 2, как только вы добавите необходимые внешние кавычки). Но пример, который вы привели в своем вопросе, на самом деле кажется мне прекрасным.

добавил - a связанные Q и A что такое "cmd / s"?