CreateProcess 只执行一半命令
Posted
技术标签:
【中文标题】CreateProcess 只执行一半命令【英文标题】:CreateProcess only executes the half command 【发布时间】:2019-11-11 11:12:13 【问题描述】:我对 CreateProcess 有疑问。我创建了以下源代码:
STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
CreateProcessA(nullptr,
"plink.exe -telnet -P 9999 192.168.230.75 < C:\\Users\\Mahre\\Scripts\\Telenet_Script.txt",
nullptr,//security
nullptr,// security
FALSE,//inherits handles
0,
nullptr,
nullptr,
&si,
&pi);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
问题是 CreateProcess 只执行了一半的命令。命令plink.exe -telnet -P 9999 192.168.230.75
被执行,但是CreateProcess忽略了这部分< C:\\Users\\Mahre\\Scripts\\Telenet_Script.txt
。我很确定这是小于号。
对于邪恶的system()
,它工作得非常好,它执行了完整的命令:
system("plink.exe -telnet -P 9999 192.168.230.75 < C:\\Users\\Mahre\\Scripts\\Telenet_Script.txt");
有人可以向我解释如何使用 CreateProcess 做到这一点吗?
【问题讨论】:
查看执行 cmd.exe。 CreateProcess() 对输入重定向一无所知。这是一个shell功能,执行 cmd.exe /c 代替。 我可以想象<
和C:\\Users\\Mahre\\Scripts\\Telenet_Script.txt
也作为参数传递给telnet
,telnet
以某种方式处理它们或只是忽略它们。这与在bash
或cmd.exe
中调用此行相反,其中<
之后的部分由bash
或cmd.exe
本身处理(作为@HansPassant 已经提到的输入重定向)。
【参考方案1】:
输入重定向运算符由 shell 提供,在本例中为 cmd.exe
。
要使用CreateProcess()
执行此操作,您需要自己执行此操作。
首先使用CreateFile()
打开要用作读取输入的文件,并将句柄设置为可继承。当您调用CreateProcess()
时,您需要将可继承句柄标志设置为TRUE,并填写STARTUPINFO
结构以包含您要用于标准输入的句柄。
以这种方式执行此操作时,您不应提供命令的“
有关详细信息,请阅读 MSDN 上的 CreateProcess
文档。这些是文档中涵盖此案例变体的示例。
【讨论】:
以上是关于CreateProcess 只执行一半命令的主要内容,如果未能解决你的问题,请参考以下文章
取决于进程创建的执行异常(ShellExecute vs CreateProcess)
如何使用 CreateProcess 在 cmd 中执行命令?
django迁移文件时出错,然后发现只迁移成功一半的sql表格,另外一半重新执行命令无法迁移成功,解决方法