创建在所选目录中打开的命令提示符进程
Posted
技术标签:
【中文标题】创建在所选目录中打开的命令提示符进程【英文标题】:Creating a command prompt process that opens at a chosen directory 【发布时间】:2017-05-05 17:02:16 【问题描述】:在这里需要帮助,我正在尝试使用 windows api 在 c++ 中创建一个进程,发生的事情是正在创建的进程是 cmd.exe 但是我希望 cmd.exe 在某个目录中打开 cd'd即 root c:\,但是该进程是在可执行文件的目录中打开的。 我尝试将“cd \”作为 CreateProcess 函数的第二个参数传入,但无济于事
这是代码的sn-p:
TCHAR program[] = TEXT("C:/Windows/System32/cmd.exe");
TCHAR command[] = TEXT("cd /");
STARTUPINFO info;
PROCESS_INFORMATION processInfo;
ZeroMemory(&info,sizeof(STARTUPINFO));
ZeroMemory(&processInfo,sizeof(PROCESS_INFORMATION));
BOOL processResult =
CreateProcess(program,
command, NULL, NULL,
TRUE, CREATE_NEW_CONSOLE,
NULL, NULL,
&info,
&processInfo);
if(!processResult)
std::cerr << "CreateProcess() failed to start program \""
<< program << "\"\n";
exit(1);
std::cout << "Started program \""
<< program << "\" successfully\n";
我们将不胜感激! 谢谢
【问题讨论】:
edit cd到目录,然后运行进程。签出。[/edit] ***.com/questions/3485166/… 你可以改用ShellExecute
。
【参考方案1】:
如果您希望cd /
(或任何其他命令)产生任何效果,您需要在命令提示符下使用/k
或/c
标志。您可以在 cmd.exe
的文档中查看这些开关,但基本上,/c
运行命令然后终止,而 /k
运行命令并保持控制台会话打开。你几乎肯定想要/k
这里。
但实际上,您应该将目录指定为进程的工作目录,而不是执行更改目录命令。
按照 Raw N 的建议,您可以通过调用 ShellExecute
function 轻松完成此操作。工作目录是它的参数之一。 ShellExecute
(或ShellExecuteEx
)比CreateProcess
更易于使用,除非您需要一些只有CreateProcess
才能获得的特殊低级行为,否则应该首选。
这也适用于CreateProcess
:将路径作为lpCurrentDirectory
参数传递。
无论你做什么,不要硬编码路径!在 Windows NT 上使用 %comspec%
环境变量。也可以只执行cmd
,让默认搜索路径完成它们的工作。
【讨论】:
ShellExecuteEx()
应始终使用而不是 ShellExecute()
,因为后者的错误报告很差(只有一组有限的非标准返回值)。还应注意CreateProcess()
的开销比ShellExecute()
少。
完美详细的答案,并回答了我想要的一切以及更多,谢谢以上是关于创建在所选目录中打开的命令提示符进程的主要内容,如果未能解决你的问题,请参考以下文章