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忽略了这部分&lt; 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 代替。 我可以想象&lt;C:\\Users\\Mahre\\Scripts\\Telenet_Script.txt 也作为参数传递给telnettelnet 以某种方式处理它们或只是忽略它们。这与在bashcmd.exe 中调用此行相反,其中&lt; 之后的部分由bashcmd.exe 本身处理(作为@HansPassant 已经提到的输入重定向)。 【参考方案1】:

输入重定向运算符由 shell 提供,在本例中为 cmd.exe

要使用CreateProcess() 执行此操作,您需要自己执行此操作。

首先使用CreateFile()打开要用作读取输入的文件,并将句柄设置为可继承。当您调用CreateProcess() 时,您需要将可继承句柄标志设置为TRUE,并填写STARTUPINFO 结构以包含您要用于标准输入的句柄。

以这种方式执行此操作时,您不应提供命令的“

有关详细信息,请阅读 MSDN 上的 CreateProcess 文档。这些是文档中涵盖此案例变体的示例。

【讨论】:

以上是关于CreateProcess 只执行一半命令的主要内容,如果未能解决你的问题,请参考以下文章

取决于进程创建的执行异常(ShellExecute vs CreateProcess)

CreateProcess() API 函数有啥用?

如何使用 CreateProcess 在 cmd 中执行命令?

django迁移文件时出错,然后发现只迁移成功一半的sql表格,另外一半重新执行命令无法迁移成功,解决方法

我可以访问从 Delphi CreateProcess 命令返回的字符串吗?

CreateProcess 挂钩以添加命令行