2011-08-29 39 views
0

在我正在處理的C++/CLI代碼的2部分中,程序需要運行不同的可執行文件,並將其STDOUT輸出重定向到文件。其嘗試有兩種不同的方式,目前只有其中的一種可行。該程序正在Windows XP上運行。有沒有更好的方式來重定向標準輸出在C++/CLI然後用系統()?

第一部分組裝很長的char *是最終看起來是這樣的:

char* exepath = "start/B /D\\root\\bin \\root\\bin\\process.exe 1>\\root\\logs\\process_STDOUT.txt" 

然後代碼只需調用

Status = system(exepath); 

這工作得很好:這兩個試驗process.exe和按預期創建process_STDOUT.txt文件。

第二部分嘗試使用ProcessStartInfo對象進行相同的操作。它成功啓動process.exe,但尚未創建重定向的輸出.txt文件。這是該代碼的簡化版本:

Process p = gcnew Process(); 
ProcessStartInfo^ s = gcnew ProcessStartInfo(); 
s->FileName   = "\\root\\bin\\process.exe"; 
s->WindowStyle  = ProcessWindowStyle::Hidden; 
s->CreateNoWindow = true; 
s->UseShellExecute = false; 
s->Arguments  = "1>\\root\\logs\\process_STDOUT.txt"; 
p->StartInfo  = s; 
p->Start(); 

我在做這個代碼有問題嗎?如果沒有,是回到只是調用系統(exepath)我唯一的選擇還是有其他的?

回答

2

system函數調用系統的命令行interpreter,它在Windows上通常是cmd.exe這是解析I/O重定向語法的程序。你開始的節目不知道>的含義;它將它解釋爲實際命令行參數的第一個字符。 (想想看 - ?。有有史以來在命令行程序的命令行重定向代碼不,當然不亦沒有process.exe的作者)

所以這是爲什麼你的ProcessStartInfo方法不重定向I/O。爲此,請參閱有關redirecting stdin and stdout in .Net的問題。

由於您無論如何都將輸出重定向到文件,因此您當前的system代碼應該沒問題。當您想要在程序中而不是文件中收集輸出時,需要更多編程方式的重定向。

1

結賬this文章。值得注意:

/* Setup Redirect */ 
processStartInfo.RedirectStandardError = true; 
processStartInfo.RedirectStandardInput = true; 
processStartInfo.RedirectStandardOutput = true; 

/* Capture Output */ 
StreamWriter inputWriter = process.StandardInput; 
StreamReader outputReader = process.StandardOutput; 
StreamReader errorReader = process.StandardError; 
process.WaitForExit(); 

傳遞"1>\\root\\logs\\process_STDOUT.txt"作爲參數是不一樣的重定向

0

「管道命令」不是作爲一個參數傳遞給程序; shell解釋它並且程序本身不知道它的輸出被重定向到一個文件。所以你不想把這樣的東西當作論據。

但是,Program類具有StandardOutputStandardError流屬性以幫助您捕獲輸出。您只需指定(在您的ProcessStartInfo對象中)您要重定向輸出。

s->RedirectStandardOutput = true; 
s->RedirectStandardError = true; 

過去的這一點,你就可以使用p->StandardOutputp->StandardError獲得流的輸出。

相關問題