创建在所选目录中打开的命令提示符进程

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() 少。 完美详细的答案,并回答了我想要的一切以及更多,谢谢

以上是关于创建在所选目录中打开的命令提示符进程的主要内容,如果未能解决你的问题,请参考以下文章

如何创建线程详解

如何在当前目录中打开命令提示符作为快捷方式

谁有DOS命令提示符?现在就要!要全面的。

您如何用Java编写命令提示符?

请模拟一下win10的cmd

如何快速在当前目录打开cmd命令提示符