CreateProcess 执行 Windows 命令

Posted

技术标签:

【中文标题】CreateProcess 执行 Windows 命令【英文标题】:CreateProcess to execute Windows command 【发布时间】:2012-12-10 13:03:02 【问题描述】:

我正在尝试使用 CreateProcess 函数执行一个 dos 命令:

 LPWSTR cmd=(LPWSTR)QString("C:\\windows\\system32\\cmd.exe  subst " + DLetter+"  \""+mountPath+"\"").utf16();



        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        ZeroMemory( &pi, sizeof(pi) );

        if ( CreateProcessW(0,     // Application name
                           cmd,                 // Application arguments
                           NULL,
                           NULL,
                           TRUE,
                           0,
                           NULL,
                           L"C:\\windows\\system32",          // Working directory
                           &si,
                           &pi) == TRUE)
         ...

它给出最后一个错误 3 = ERROR_PATH_NOT_FOUND,当我将应用程序路径 "C:\\windows\\system32\\cmd.exe" 与命令分开时,它显示控制台而不执行我的 subst 命令。

任何帮助将不胜感激。

【问题讨论】:

你可以打电话给DefineDosDevice(),它(非持久性地)做同样的事情 【参考方案1】:

您需要在cmd.exe 的选项中包含/C 或/K。

/C 执行字符串指定的命令,然后终止 /K 执行字符串指定的命令,但保留

如果没有这些选项,您传递的subst 命令将被忽略。

话虽如此,subst,至少在我的 Windows 7 机器上,并没有在cmd.exe 内部实现。它是一个单独的可执行文件。所以你可以直接调用它,完全绕过cmd.exe

关于您给CreateProcess 的电话,我有以下cmets:

    不要包含路径C:\\windows\\system32。只需调用subst.exe 并让系统使用标准搜索路径定位可执行文件。 将FALSE 传递给bInheritHandles。您没有将任何句柄传递给新进程,因此您不需要新进程继承您的句柄。 传递NULL 作为工作目录。无需在此处指定。

【讨论】:

谢谢大卫,它有效我用我的参数调用了 subst.exe,但我没有在 C:/ 和 D:/ 的计算机下找到已安装的驱动器,确实 subst 以管理员权限运行,所以这是为什么我没有找到我的新驱动器?(我是一个简单的用户) 我不确定。我认为这是一个不同的问题。 @DavidHeffernan:更好的是,不要使用subst 可执行文件来操作驱动器映射。直接使用Win32 API函数,如DosDefineDevice()WNetAddConnection...()WNetCancelConnection...() 呃是的,这是一个更好的主意,@Remy【参考方案2】:

尝试使用

"C:\\windows\\system32\\cmd.exe /c subst " + DLetter+"  \""+mountPath+"\""

相反。 CMD 不会接受没有/c/k 的参数,除非您想在控制台窗口中查看输出,否则只需使用/c

【讨论】:

不是我 - 但为什么有两个 cmd 实例?第二个也缺少 /c。 @HarryJohnston 谢谢,我回答的时候打错了。

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

Windows:如何使用CreateProcess停止重定向Stdout的缓冲

Windows CreateProcess 和输出重定向

CreateProcess 执行批处理文件

windows 下在进程中使用createprocess创建一个窗口进程,并获取这个窗口HWND句柄

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

CreateProcess 挂钩以添加命令行