“|”管道运算符在C ++中不在命令行中工作

时间:2010-05-04 05:12:32

标签: c++

我正在使用与DB2数据库交互的Windows应用程序。在我的应用程序中,我有代码通过命令行界面执行一些DB2命令。我已经使用windowsAPI“ShellExecuteEx()”通过命令行执行这些DB2命令。

以下是为通过命令行执行DB2命令而编写的代码。

  string command = "/c /w /i DB2 UNCATALOG NODE DB_DATABASE ">>" test.log | echo 
  %date% %time% >> test.log";
  SHELLEXECUTEINFO shellInfo;
  ZeroMemory(&shellInfo, sizeof(shellInfo));
  shellInfo.cbSize = sizeof(shellInfo);
  shellInfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS;
  shellInfo.lpFile = "db2cmd";
  shellInfo.lpParameters = command.c_str();
  if (ShellExecuteEx(&shellInfo)) 
    { 
      WaitForSingleObject(shellInfo.hProcess, INFINITE); 
      CloseHandle(shellInfo.hProcess); 
      bStatus = true; 
    } 
    else 
    { 
           bStatus = false; 
    } 

代码执行成功,但是如果观察到test.log,我只得到DB2命令的结果,而不是日期和时间。如果你看到上面的命令有“|”管道运算符和echo命令在test.log中记录日期和时间

请注意,如果我通过单独的命令行执行上面的DB2命令,即不通过代码执行。我能够在test.log中查看日期和时间日志以及DB2命令结果。以下是我通过命令行执行的完整命令。 DB2CMD / c / i / w DB2 UNCATALOG NODE DB_DATABASE“>>” test.log | echo%date %% time%>> test.log中

根据我的说法,因为DB2命令通过代码成功执行,所以仅使用“|”有问题管道运算符或echo命令。

2 个答案:

答案 0 :(得分:2)

管道机制用于将一个程序的输出作为输入传递给下一个程序。我想在你的情况下,&& separator会更合适。

尝试让cmd处理多个语句的执行:

cmd /c "db2cmd ... && echo ..."

答案 1 :(得分:0)

管道运算符由命令shell执行。获得该功能的最简单方法是使用system()库函数。

否则,您可以在命令完成(修订)后以编程方式将时间戳附加到文件中:

system ("db2cmd DB2 UNCATALOG NODE DB_DATABASE >>test.log");
system ("echo  %date% %time% >> test.log");