6

У меня работает Windows XP Home SP3. Попытка выполнить эту команду:

cmd /c "C:\Program Files\TortoiseSVN\bin\subwcrev.exe" .. ..\Modules\getbuildinfo.c Win32-temp-Debug\getbuildinfo2.c

Работает нормально (игнорируйте точные имена программ и файлов). Однако при цитировании последнего аргумента я получаю сообщение об ошибке:

cmd /c "C:\Program Files\TortoiseSVN\bin\subwcrev.exe" .. ..\Modules\getbuildinfo.c "Win32-temp-Debug\getbuildinfo2.c"

'C:\Program' is not recognized as an internal or external command,
operable program or batch file.

При запуске без cmd /c но напрямую обе командные строки работают без ошибок. Я использовал cmd /c для отладки аналогичной проблемы, которая была у меня с system вызовами из C-программы.

Что не так с cmd здесь?

1 ответ1

8

Вот что help cmd о цитировании:

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

  1. Если выполнены все следующие условия, символы кавычек в командной строке сохраняются:

    • нет /S переключатель
    • ровно две кавычки
    • между двумя символами кавычек нет специальных символов, где специальным является один из: & <> () @ ^ |
    • между двумя кавычками есть один или несколько пробельных символов
    • строка между двумя символами кавычки - это имя исполняемого файла.
  2. В противном случае старое поведение состоит в том, чтобы увидеть, является ли первый символ символом кавычки, и если это так, убрать начальный символ и удалить последний символ кавычки в командной строке, сохранив любой текст после последнего символа кавычки.

Так что удвойте первую и последнюю кавычки, и это должно сработать:

cmd /c ""C:\Program Files\TortoiseSVN\bin\subwcrev.exe" .. ..\Modules\getbuildinfo.c "Win32-temp-Debug\getbuildinfo2.c""

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .