Подтвердить что ты не робот

Как использовать символы цитаты при использовании cmd.exe

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

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

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

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

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

Но мне действительно нужен первый, чтобы работать. Есть ли место вокруг странной обработки цитаты, которую использует cmd.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.
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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"

и как/почему он работает так, как это делается, потому что the > интерпретируется как особый host.exe. Итак, эта часть 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 не изменит результат, поэтому no/S будет необходимо, поскольку это уже будет случай 2 после добавления этих необходимых внешних кавычек). Но пример, который вы дали в своем вопросе, на самом деле кажется мне хорошим.

Добавлен - Связанный Q и A Что такое` cmd/s` для?