【问题标题】:viewing output of system() call in C++在 C++ 中查看 system() 调用的输出
【发布时间】:2015-03-21 11:51:33
【问题描述】:

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

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 中运行程序时,它给我一个黑屏,我看不到正在运行的命令。我需要它,所以我可以查看它是否有效。谢谢!

【问题讨论】:

  • 可能是输出重定向问题。 system() 函数使用命令解释器来运行 system() 函数的参数字符串,因此命令解释器可能没有继承您的标准输出,因此命令的输出不会进入控制台窗口。另一件事可能是您使用的命令没有生成任何输出。尝试不同的命令,例如echo 命令,然后执行system("echo this is output") 之类的操作。
  • 我不确定set-ing(或cd)与system 的一次调用会影响对system 的下一次调用(在POSIX 和Linux 上,我敢肯定)不起作用。但我不知道 Windows)。
  • 您是否考虑过使用某些操作系统 API(例如 _chdir...)而不是调用 system?或者使用一些框架,比如POCOQt,或者可能是 Boost。
  • @BasileStarynkevitch 你是对的。由于 set 命令在命令解释器退出后在命令解释器中运行,因此对环境变量的任何更改也将消失,因为每个进程都有自己的副本。同样的事情也适用于目录更改的 cd 命令。
  • 请注意,您使用的命令不会对后续执行产生任何影响(或根本没有任何影响)——它们的预期效果会在 system() 函数返回后消失。

标签: c++ windows command-line cmd system


【解决方案1】:

使用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 ) );

【讨论】:

    【解决方案2】:

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

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

    请注意,每个system 的调用都使用cmd.exe(作为cmd /c [command])来执行您的命令,并且一个命令中的PATH 等环境变量不会影响另一个命令。 p>

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我反引用了“系统”,因为 system callsystem 库函数非常不同
      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      相关资源
      最近更新 更多