Windows的WGET忽略了使用CreateProcess()调用选项

wget for windows ignores options when called with createprocess()

本文关键字:CreateProcess 调用 选项 WGET Windows      更新时间:2023-10-16

我正在尝试将wget从C 程序中使用Windows,以从网站下载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文件执行时,对此进行了测试并按预期工作。使用 - 输出文件=而不是-o也可以从批处理文件起作用。

但是,当我尝试使用CreateProcessa()()将WGET调用时,这些第一个选项被解释为URL。WGET试图下载BIT.BIN作为FTP地址。它最终忽略了这些荒谬的URL,仅下载和存储6个单独的文件,例如[url1],[url2] .1,[url3] .2等,带有长期丑陋的url-as as-names。

我认为,也许createProcess向调用程序提供参数的方式与Windows的期望如何兼容,但我并不真正了解为什么会有任何区别。

请注意,参数字符串几乎为900个字符,因为6个URL长。因此,这在某种程度上限制了我的选择。我无法显示实际的URL,因为它们包含密码和其他个人数据。

我尝试在没有运气的情况下向参数字符串的不同部分添加引号。如果有的话,似乎会使事情变得更糟。我之所以使用sprintf,是因为在实际代码中,我必须在运行时插入一个passkey和其他选项。

目前,除非这里有人有解决方案,否则我会放弃使用createProcess()运行wget。接下来,我将尝试Shellexecute(),然后在必要时()()。想知道MaxPath是否会成为问题。我可能不得不将WGET拨打6次,而不是一次,并管理自己的随机延迟。我只是尝试了:

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

它弹出了一个确认的Diolog盒,当我允许它运行时,WGET似乎并没有真正做任何事情。也许System()将是我唯一的选择。

注意: createProcess()现在正常工作,因为我也将wget.exe也包括在第二个参数中。谢谢大家。奇怪的是,Shellexecute似乎根本不起作用,但我想这没关系。也许是一些实现细节,例如max_path限制。

我知道我可以将createProcess中的第一个参数设置为null,并在第二个createProcess()param中包含程序名称,但我也引入了潜在的max_path问题。尽管我认为这并不比Shellexecute()差。我希望利用CreateProcess参数的慷慨的32768字符限制。

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);

我通过以可执行名称作为第一个参数来使用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"");