Windows的WGET忽略了使用CreateProcess()调用选项
wget for windows ignores options when called with createprocess()
我正在尝试将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"");
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 调用CreateProcess()并获取字符串的返回值
- 如何使用 CreateProcess 调用 tshark 将捕获文件转换为 txt
- Windows的WGET忽略了使用CreateProcess()调用选项
- CreateProcess正在调用cmd.exe,包括没有显示(闪烁)窗口的参数
- 记录使用 createprocess 函数调用的 exe 的错误
- 使用CreateProcess尽可能使用单个命令参数调用exec*函数
- 可以单独调用两个 CreateProcess() 共享相同的启动和进程信息
- 如何为两个单独的 CreateProcess() API 调用打开单独的命令提示符控制台
- 如何在调试模式下运行使用CreateProcess调用链接的程序
- 为什么通过CreateProcess调用的程序的窗口显示为SW_HIDE和CREATE_NO_INDOW
- 如何在c#中通过lpEnvironment调用CreateProcess()
- 在CreateProcess之后调用GetModuleFileNameEx时ERROR_INVALID_HANDLE
- 关于Cpp App CreateProcess()调用的c# App MessageBox.Show()的问题
- 对于每个CreateProcess,首先调用我的函数