2010-05-04 61 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