2010-05-04 33 views
0

我正在使用与DB2数据库交互的Windows应用程序。在我的应用程序中,我有通过命令行界面执行一些DB2命令的代码。我已经使用windowsAPI“ShellExecuteEx()”通过命令行执行这些DB2命令。“|”管道运算符不在C++的命令行中工作

以下是通过命令行编写执行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中被observered我只得到DB2命令,而不是日期和时间的结果。如果你看到上面的命令有“|”管道操作员和回声命令记录日期和时间test.log

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

根据我的说法,由于DB2命令通过代码成功执行,因此只有使用“|”管道运算符或回显命令。

回答

0

管道操作员由命令外壳执行。获得该功能的最简单方法是使用system()库函数。

否则,可以编程所述时间戳附加到该文件的命令完成后(修订版):

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

感谢您的意见和建议的新方法。但是,如果您仔细查看代码。命令被激活的是“db2cmd”并且传递给它的参数是“/ c/w/i DB2 UNCATALOG NODE DB_DATABASE”>>“test.log | echo%date%%time%>> test.log”; 因此,请也建议我们如何能够使用系统库来做同样的事情,如果你能提出我在使用“|”时遇到的问题,管道操作员和回声。 谢谢 – decisive 2010-05-04 05:47:12

+0

我希望找到类似db2cmd的东西,但没有看到它。我纠正了这个例子。 – wallyk 2010-05-04 06:15:05

+0

感谢您提出这种方法。不过,如果你真的可以说出我在使用“|”做错了,运算符代码中,我无法在日志文件中获取日期时间 – decisive 2010-05-04 07:41:48

2

管机构被用来传递一个程序的输出作为输入提供给下一个节目。我想你的情况下&& separator会更合适。

尝试,让CMD处理多条语句的执行:

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

嗨,感谢您的建议。使用&&将不会服务我的目的我使用“|”因为它会让我在日志中输出为

+0

恢复命令行的顺序:'echo ...> file && command ... >> file'。我从来没有广泛使用Windows命令shell,但在Linux中,您的方法(通过'echo'管道不起作用) – 2010-05-04 08:38:30