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。
如果没有这些选项,您传递的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创建一个窗口进程,并获取这个窗口HWND句柄