2010-09-01 108 views
10

我需要用一些參數啓動命令窗口並在其中運行更多命令。啓動命令窗口並在裏面運行命令

例如,啓動test.cmd並運行mkdir。

我可以用processstartinfo啓動test.cmd,但我不知道如何運行更多的命令。我可以將更多參數傳遞給test.cmd進程嗎?

我該如何解決這個問題?

無法添加評論來回答...所以寫在這裏。

Andrea,這就是我一直在尋找的東西。然而,上面的代碼不適合我。

我正在啓動一個test.cmd,它是新的命令環境(如razzle構建環境),我需要運行更多的命令。

psi.FileName = @"c:\test.cmd"; 
psi.Arguments = @"arg0 arg1 arg2"; 

psi.RedirectStandardInput = true; 
psi.RedirectStandardOutput = true; 
psi.CreateNoWindow = true; 
psi.UseShellExecute = false; 

Process p = new Process(); 
p.StartInfo = psi; 
p.Start(); 
p.StandardInput.WriteLine(@"dir>c:\results.txt"); 
p.StandardInput.WriteLine(@"dir>c:\results2.txt"); 
+0

我認爲你必須要離開PSI .FileName和psi.Arguments在我的代碼中,只是做一個p.StandardInput.WriteLine(@「c:\ test.cmd arg0 arg1 arg2」); – 2010-09-01 18:00:11

+0

謝謝我試過了,它工作。但是,有了這個我試圖讀取控制檯日誌,它不會返回我需要的輸出。這是我的完整代碼,以供澄清。 我期待的是command123的輸出。 – user393148 2010-09-01 19:58:03

+0

進程p = new Process(); p.StartInfo = psi; p.Start(); p.StandardInput.WriteLine(@「c:\ test。CMD ARG1 ARG2 &&坎德拉/ DC:\ TESTDIR \樣品&& command123/C 「); p.StandardInput.WriteLine(@」 退出「); 串輸出= p.StandardOutput.ReadToEnd(); p.WaitForExit (); – user393148 2010-09-01 19:59:12

回答

11

您可以使用進程 標準輸入向cmd.exe發送更多命令。你必須重定向它,這種方式:

var startInfo = new ProcessStartInfo 
        { 
         FileName = "cmd.exe", 
         RedirectStandardInput = true, 
         RedirectStandardOutput = true, 
         UseShellExecute = false, 
         CreateNoWindow = true 
        }; 

var process = new Process {StartInfo = startInfo}; 

process.Start(); 
process.StandardInput.WriteLine(@"dir>c:\results.txt"); 
process.StandardInput.WriteLine(@"dir>c:\results2.txt"); 
process.StandardInput.WriteLine("exit"); 

process.WaitForExit(); 

記得寫「退出」作爲您的最後一個命令,否則CMD過程不正確終止......

+0

添加我對問題部分的評論。 – user393148 2010-09-01 17:41:29

0

你想達到什麼目的?你是否真的需要打開一個命令窗口,或者你需要簡單地創建一個目錄,例如?

mkdir是一個Windows可執行文件 - 您可以像啓動相同的方式啓動該程序cmd - 無需首先啓動命令窗口過程。

您也可以創建一個包含您想要運行的所有命令的批處理文件,然後使用您已經使用的Process和ProcessStartInfo類來啓動它。

+0

Winston,mkdir只是一個例子,我啓動了一個新的cmd環境(基本上存儲一個預設的env變量),我想運行進一步的命令。Andrea的答案應該可以解決我的問題,但似乎沒有爲我工作。 – user393148 2010-09-01 17:24:31

1

/c參數爲cmd

ProcessStartInfo start = new ProcessStartInfo("cmd.exe", "/c pause"); 
Process.Start(start); 

pause只是你可以運行的代碼示例)

但對於創建一個目錄,你可以做到這一點,從C#大多數其他文件操作直接

System.IO.Directory.CreateDirectory(@"c:\foo\bar"); 

啓動CMD只有當你有一些你不想在c#中複製的大蝙蝠文件時,纔有用c#。

1

也許this的帖子很有幫助。你是這個意思嗎?