CreateProcess执行Windows命令

我正在尝试使用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,当我分开应用程序path"C:\\windows\\system32\\cmd.exe"从它显示控制台,而不执行我的subst命令的命令。

任何帮助将不胜感激。

Solutions Collecting From Web of "CreateProcess执行Windows命令"

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

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

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

话虽如此,至少在我的Windows 7中, subst ,不是在cmd.exe里面实现的。 它是一个单独的可执行文件 所以你可以直接调用它并完全绕过cmd.exe

关于您对CreateProcess的调用,我有以下几点意见:

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

尝试使用

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

代替。 CMD将不接受没有/c/k ,除非您想在控制台窗口中看到输出,只需使用/c