Функция system () не выполняет команду оболочки, как ожидалось - PullRequest
0 голосов
/ 15 октября 2018

У меня есть следующее command, которое читает ОС имя данных из реестра следующим образом:

for /f "tokens=2*" %a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName ^| findstr "REG_"') do @echo %b

output :    Windows 10 Enterprise

Так что теперь эта команда работает в Командная строка , но когда я использую ее в функции system(), она не выполняется должным образом.

My code:

CHAR szCommandLine[MAX_PATH * 4] = { 0 };
StrCpyA(szCommandLine, "for /f \"tokens = 2*\" %%a in ('reg query \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\" /v ProductName ^| findstr \"REG_\"') do @echo %%b");
// print the command
printf(szCommandLine);
printf("\n");
// run the command
system(szCommandLine);

Вывод:

for /f "tokens=2*" %a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName ^| findstr "REG_"') do @echo %b

%%a was unexpected at this time.

Сейчас я не знаюименно то, что происходит в system() функции, которые ведут себя как неправильно command.На самом деле напечатанная command в моей программе - это точно та же команда, которая корректно выполнялась в Командная строка .

1 Ответ

0 голосов
/ 15 октября 2018

Согласно IanAbbott полезные пункты:

Я заменил %a вместо %%a в параметрах команды, потому что %%та же самая %% в system() функции, и это неправильно в command.

system("for /f \"tokens=2*\" %a in ('reg query \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\" /v ProductName ^| findstr \"REG_\"') do @echo %b");

...