Я пытался получить cmd.exe /c /v:on
выполнено с использованием ShellExecute
а также ShellExecuteEx
, Однако оба метода, похоже, принимают только один параметр, потому что когда он встречает /v:on
, The filename, directory name, or volume label syntax is incorrect.
отображается под Windows 7.
Это код, который я пробовал и в настоящее время возиться (без удачи):
#include <windows.h>
int main()
{
SHELLEXECUTEINFO info = {0};
info.cbSize = sizeof(SHELLEXECUTEINFO);
info.fMask = SEE_MASK_NOCLOSEPROCESS;
info.hwnd = NULL;
info.lpVerb = NULL;
info.lpFile = "cmd.exe";
info.lpParameters = "/c /v:on SET example=stackoverflow & ECHO '!example! & pause'";
info.lpDirectory = NULL;
info.nShow = SW_SHOW;
info.hInstApp = NULL;
ShellExecuteEx(&info);
// wait for process to terminate
// WaitForSingleObject(info.hProcess, INFINITE);
return 0;
}
поскольку cmd.exe
это исполняемый файл, вы должны использовать CreateProcess()
вместо ShellExecuteEx()
(который просто позвонит CreateProcess()
внутренне все равно, так что избавьтесь от среднего человека).
В любом случае это не ShellExecute()
проблема. Если вы откроете cmd.exe
окно и введите полную командную строку:
cmd /c /v:on SET example=stackoverflow & ECHO '!example! & pause'`
Вы получаете точно такую же ошибку, и еще:
cmd / c / v: на SET пример = стек переполнения ЭХО! Пример! Пауза' Неверный синтаксис имени файла, имени каталога или метки тома. '!пример! «Пауза» не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.
Причина первой ошибки в том, что /v
является параметром cmd.exe
сама по себе, а не отдельная команда, которая /C
может выполнить. Все, что следует /C
(или же /K
) — это новая командная строка, поэтому она должна быть последним параметром, указанным при вызове cmd.exe
, Это указано в документации для /C
(а также /K
):
Если указан / C или / K, то остаток командной строки после
переключатель обрабатывается как командная строка
В качестве таких, /v:on
интерпретируется как первый параметр новой командной строки, поэтому он рассматривается как имя файла, которого, очевидно, не существует.
Поменять местами /V
а также /C
параметры, и первая ошибка исчезает:
cmd / v: on / c SET пример = переполнение стека ЭХО! Пример! Пауза' '!пример! «Пауза» не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.
Теперь вы заметите, что !example!
не расширяется, как ожидалось. Это потому, что вы не цитируете командную строку, как документацию для /C
(а также /K
) говорит:
Обратите внимание, что несколько команд разделены разделителем команд&&принимаются за строку если в кавычках. Кроме того, по соображениям совместимости / X совпадает с / E: ON, / Y совпадает с / E: OFF, а / R совпадает с / C. Любые другие переключатели игнорируются.
Итак, оберните командную строку в кавычки, а затем !example!
расширяется:
cmd / v: on / c "SET example = stackoverflow ЭХО! Пример! Пауза'" 'переполнение стека «Пауза» не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.
И наконец, pause
не интерпретируется правильно, потому что вы помещаете его в одинарные кавычки ECHO
а не снаружи как отдельная команда:
cmd / v: on / c "SET example = stackoverflow ЭХО "! Пример!" Пауза" 'переполнение стека ' Нажмите любую клавишу для продолжения . , ,
И тогда вы можете отбросить одинарные кавычки из ECHO
:
C: \ Users \ Ryan> cmd / v: on / c "SET example = stackoverflow ЭХО! Пример! Пауза" переполнение стека Нажмите любую клавишу для продолжения . , ,
Других решений пока нет …