Wget для Windows игнорирует параметры при вызове с createprocess () - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь использовать wget для windows из программы на c ++, чтобы загрузить 6 файлов с веб-сайта и объединить результаты в один файл.Это не проблема из командного файла.Команда будет просто:

wget -O bits.bin --wait=20 --random-wait --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" "http://url/to/the/file1" "http://url/to/the/file2" "http://url/to/the/file3" "http://url/to/the/file4" "http://url/to/the/file5" "http://url/to/the/file6"

Это проверено и работает, как ожидается, при выполнении из .bat-файла.Использование --output-file = вместо -O также работает из пакетного файла.

Но когда я пытаюсь вызвать wget с помощью CreateProcessA () , эти первые параметры интерпретируются как URL-адреса.wget пытается загрузить бит.бин, например, в качестве адреса ftp.В конечном итоге игнорируются эти бессмысленные URL-адреса и просто загружается и сохраняется 6 отдельных файлов в виде [URL1], [URL2] .1, [URL3] .2 и т. Д. С длинными уродливыми URL-адресами.

Я думаю, что возможното, как CreateProcess представляет параметры вызываемой программе, несовместимо с тем, как их ожидает wget для Windows, но я не совсем понимаю, почему должна быть какая-либо разница.

Обратите внимание, что строка параметра составляет почти 900 символовдолго, потому что 6 URL-адресов длинные.Так что это несколько ограничивает мои варианты, я думаю.Я не могу показать реальные URL, потому что они включают пароли и другие личные данные.

Я попытался добавить кавычки в разные части строки параметра, но безуспешно.Во всяком случае, кажется, что все еще хуже.Я использую sprintf, потому что в реальном коде я должен вставить ключ доступа и другие параметры в каждый URL во время выполнения.

Пока, если у кого-то здесь нет решения, я отказываюсь от использования CreateProcess () для запускаWget.Далее я попробую ShellExecute (), а затем, если необходимо, System ().Интересно, может ли MAXPATH стать проблемой?Возможно, мне придется звонить wget 6 раз, а не один раз, и самостоятельно управлять случайными задержками.Я только что попробовал:

ShellExecuteA(NULL, NULL,"wget.exe", params, NULL, SW_SHOW);

Появилось диалоговое окно подтверждения, и когда я позволил ему работать, wget, похоже, на самом деле ничего не делал.Возможно, System () будет моим единственным вариантом.

Примечание: CreateProcess () работает теперь, когда я также включил wget.exe во второй параметр.Спасибо, ребята. Странно, как ShellExecute, казалось, вообще не работает, но я думаю, это не имеет значения.Возможно, это была какая-то деталь реализации, например ограничения MAX_PATH.

Я знаю, что могу установить для первого параметра в CreateProcess значение NULL и включить имя программы во второй параметр CreateProcess (), но затем я представляю потенциальные проблемы MAX_PATH, какЧто ж.Хотя я полагаю, что это не хуже, чем ShellExecute ().Я надеялся воспользоваться щедрым пределом в 32768 символов для параметров CreateProcess.

char params[1024];
sprintf(params,"--output-file=bits.new --wait=20 --random-wait --user-agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0\" \"url/to/file1\" \"url/to/file2\" \"url/to/file3\"");
STARTUPINFOA startstruct = {0};
startstruct.cb = sizeof(startstruct);
PROCESS_INFORMATION procinfo;
CreateProcessA("wget.exe",params,0,0,0,CREATE_NEW_CONSOLE,0,0,&startstruct, &procinfo);

1 Ответ

1 голос
/ 23 марта 2019

Я использовал CreateProcess (), отправив имя исполняемого файла в качестве первого параметра, а во втором - имя процесса плюс другие параметры, такие как

sprintf(params,"wget.exe --output-file=bits.new --wait=60 --random-wait --user-agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0\" \"url/to/file1\" \"url/to/file2\" \"url/to/file3\"");
...