Использование% APPDATA% с CreateProcessW - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть простой код, который использует system () для загрузки файла в AppData с переменной% APPDATA%, я хочу использовать CreateProcessW вместо system, но по какой-то причине, когда я использую ту же команду в CreatProcess, он ищет«Working Dir» \% APPDATA% вместо действительного каталога AppData и выдает исключение.

Рабочий код системы ():

system("powershell.exe -command Invoke-WebRequest https://the.earth.li/~sgtatham/putty/latest/w32/putty.exe -OutFile '%APPDATA%\\putty.exe'");

Код CreateProcessW:

wchar_t cmdArgs[] = L"powershell.exe -command Invoke-WebRequest https://the.earth.li/~sgtatham/putty/latest/w32/putty.exe -OutFile '%APPDATA%\\putty.exe'";
CreateProcessW(NULL, cmdArgs, nullptr, nullptr, false, 0, nullptr, nullptr, &si, &pi)

Исключение:

Invoke-WebRequest : Could not find a part of the path 'G:\Projects\C++\PS_Tries\PS_Tries\%APPDATA%\putty.exe'.
At line:1 char:1
+ Invoke-WebRequest https://the.earth.li/~sgtatham/putty/latest/w32/put ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Invoke-WebRequest], DirectoryNotFoundException
    + FullyQualifiedErrorId : System.IO.DirectoryNotFoundException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

Как я могу заставить его расширять% APPDATA% как system ()?

1 Ответ

0 голосов
/ 12 декабря 2018

Вы можете использовать функцию _wdupenv_s , чтобы получить путь к appdata, а затем concatenate с вашими аргументами

wchar_t *w_app_data_path;
size_t sz = 0;
errno_t err = _wdupenv_s(&w_app_data_path, &sz, L"APPDATA");
wchar_t cmdArgs[2048]{ 0 };
wsprintfW(cmdArgs, L"powershell.exe -command Invoke-WebRequest https://the.earth.li/~sgtatham/putty/latest/w32/putty.exe -OutFile '%s\\putty.exe'", w_app_data_path);
free(w_app_data_path);
CreateProcessW(NULL, cmdArgs, nullptr, nullptr, false, 0, nullptr, nullptr, &si, &pi)
...