在程式裡呼叫命令列程式

2021-04-23 23:12:06 字數 1872 閱讀 9061

在程式裡呼叫命令列程式,一位cnblog的仁兄寫的

process早就有辦法了, 只不過我沒有注意.

如呼叫乙個命令列:"cmd /c dir c:/winnt"; 把結果放到乙個字串裡.

processstartinfo psi 

=new

processstartinfo(

"cmd", 

"/c dir c:/winnt

");

psi.redirectstandardoutput 

=true

; psi.useshellexecute 

=false

; process p 

=process.start(psi);

output 

=p.standardoutput.readtoend();

p.waitforexit();

注意那個waitforexit()一定要放到readtoend之後. msdn裡這樣說:

process元件通過管道與子程序通訊。如果子程序寫入管道的資料多得足以填滿緩衝區,則子程序將一直會阻塞到父程序從管道讀取資料時為止。如果應用程式將所有輸出讀取到標準錯誤和標準輸出,則這會導致死鎖。

意思就是: 如果waitforexit在前, 那麼如果資料太多而超出緩衝期大小, 子程式就會等著消費者把資料讀出來, 可是這時候由於waitforexit正在阻塞, 做為消費者的過程式readtoend無法執行, 因而導致了死鎖.

除了上面的, 還可以用程式互動:

processstartinfo psi 

=new

processstartinfo(

"cmd

");

psi.redirectstandardoutput 

=true

; psi.redirectstandardinput 

=true

; psi.useshellexecute 

=false

; process p 

=process.start(psi);

p.standardinput.writeline(

@"dir c:/winnt

");

p.standardinput.writeline(

@"ver

");

p.standardinput.writeline(

@"exit

");

output 

=p.standardoutput.readtoend();

p.waitforexit();

重定義了stdin, 執行cmd程式, 進入了命令列互動, 然後向標準輸入裡寫若干個命令, 回車, 有意思, 執行了! 最後千萬別忘記了用"exit"命令中斷cmd的執行, 不然後面的readtoend時, 永遠也不會讀到end, 程式又阻塞在這裡不會退出. 

最後, msdn提到了standarderror, 如果同時重定向了stdout和stderr, 那麼不當的方式也會出現死鎖: 如:

string

output 

=p.standardoutput.readtoend();

string

error 

=p.standarderror.readtoend();

p.waitforexit();

msdn說程式先讀了stdout, 完了之後再讀stderr, 如果子程序在執行時向stderr寫了內容, 那麼就會死鎖. 我想了一會兒, 沒想明白. 如果程式在兩個流裡都寫入了, 那麼第乙個讀stdout的動作完成之前, stderror的內容留著不就行了? 但是沒有時間試了.

msdn建議用兩個執行緒來處理不同重定向流.  這是個好辦法.

C 呼叫命令列程式

using system using system.collections.generic using system.linq using system.text using system.diagnostics 執行cmd命令 會顯示命令視窗 指定應用程式的完整路徑 執行命令列引數 static ...

CMD 如何批量呼叫命令列程式

最近在研究守望先鋒的解包,然後中途有乙個步驟,將00c檔案通過乙個命令列程式轉為obj格式。但是我遇到乙個問題,這個命令列程式一次只能轉換乙個檔案,而00c檔案足足有7400個以上,這就難倒我了。固然這個命令列程式有著原始碼,但是對於比較弱雞的我來說,沒有什麼辦法。後來在朋友的指點下,發現了解決辦法...

C語言 在命令列編譯執行程式

開始 1.在mac和linux上寫c語言之前,首先要看看是否安裝了編譯器 在終端下輸入gcc後回車進行檢測,如果安裝過,將提示 clang error no input files 沒有輸入檔案 在centos下直接yum y install gcc gcc c y表示將自動選擇y 2.現在開始愉快...