我正在尝试使用c ++程序中的wget for 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文件执行时按预期工作。也可以从批处理文件中使用--output-file =代替-O。
但是,当我尝试使用CreateProcessA()调用wget时,这些第一个选项将被解释为URL。 wget尝试下载bits.bin例如作为ftp地址。最终它会忽略这些无用的URL,而只是下载并存储6个单独的文件,例如[URL1],[URL2] .1,[URL3] .2等,并带有冗长的url-as-names。
我认为CreateProcess向被调用程序呈现参数的方式可能与Windows的wget期望它们的方式不兼容,但我真的不明白为什么应该有任何区别。
请注意,由于6个URL很长,因此参数字符串的长度几乎为900个字符。因此,这在某种程度上限制了我的选择。我无法显示实际的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()差。我希望利用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);
答案 0 :(得分:1)
我通过将可执行文件的名称作为第一个参数发送来使用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\"");