在 C++ 中查看 system() 调用的输出

问题描述 投票:0回答:4

如何查看系统命令的输出。例如:

int _tmain(int argc, _TCHAR* argv[]) {

   system("set PATH=%PATH%;C:/Program Files (x86)/myFolder/bin");
   system("cd C:/thisfolder/");

   std::cin.get();
   return 0;

}

当我在 Visual Studio 中运行该程序时,它给我一个黑屏,并且我看不到正在运行的命令。我需要它,以便我可以查看它是否有效。谢谢!

c++ windows command-line cmd system
4个回答
9
投票

使用

popen
而不是
system
。请参阅此处的示例https://msdn.microsoft.com/en-us/library/96ayss4b.aspx

char   psBuffer[128];
FILE   *pPipe;

if( (pPipe = _popen( "set PATH=%PATH%;C:/Program Files (x86)/myFolder/bin", "rt" )) == NULL )
    exit( 1 );

然后

while(fgets(psBuffer, 128, pPipe)) {
    printf(psBuffer);
}

if (feof( pPipe))
    printf( "\nProcess returned %d\n", _pclose( pPipe ) );

1
投票

system
调用的输出应该显示在标准输出上。

我认为这些命令如果成功的话通常不会显示任何输出。尝试在后面添加 dir 或 pwd 以列出您所在的目录。

如果您想将命令的输出获取到程序中进行处理,那就是另一个问题了。您将必须使用特定于操作系统的 api,或者可能将输出重定向到您可以读取的文件中。


0
投票

尝试添加如下所示的

pause
以在每个命令后等待。失败时,将显示错误消息。成功后,将显示命令的实际输出,如果有

system("set PATH=%PATH%;C:/Program Files (x86)/myFolder/bin & pause");
system("cd C:/thisfolder/ & pause");

请注意,对 system

each
调用使用 cmd.exe(如
cmd /c [command]
)来执行命令,并且一个命令中的
PATH
等环境变量不会影响另一个命令。

cmd.exe /c set PATH=%PATH%;C:/Program Files (x86)/myFolder/bin 
cmd.exe /c cd C:/thisfolder/

0
投票

正如@SGrebenkin提到的,

system
应该将命令的任何输出重定向到stdout,除非它们被重定向到其他地方。

虽然接受的答案建议

popen
,但值得一提的是,Windows 上的
popen
可能会产生不需要的副作用,特别是对于 GUI 应用程序。

如果在 Windows 程序中使用,_popen 函数将返回无效的 导致程序无限期停止响应的文件指针。 _popen 在控制台应用程序中正常工作。

有一个库可以捕获命令的输出,然后可以使用

printf
将其输出到标准输出。

https://github.com/Neko-Box-Coder/System2

它适用于 posixwindows 系统。 (它不使用 Windows 的 popen,所以它也应该在 GUI 应用程序中工作)

它可以从命令发送输入并接收输出

并有阻塞非阻塞版本。

它同时具有仅标头和源版本

© www.soinside.com 2019 - 2024. All rights reserved.