最近寫了兩個小程式都要調用Windows自帶的命令行程式,一個是調用Openfiles.exe查詢正在編輯的共用文檔,一個是調用DiskPart.exe查詢硬碟狀態。兩種命令行程式調用有點不同,記錄一下。 1.用ProcessStartInfo配置參數調用。 這種是在CMD里直接帶參數輸入的,要註意
最近寫了兩個小程式都要調用Windows自帶的命令行程式,一個是調用Openfiles.exe查詢正在編輯的共用文檔,一個是調用DiskPart.exe查詢硬碟狀態。兩種命令行程式調用有點不同,記錄一下。
1.用ProcessStartInfo配置參數調用。
這種是在CMD里直接帶參數輸入的,要註意的是要處理錯誤輸出,可能同時有錯誤和標準輸出的。
ProcessStartInfo start = new ProcessStartInfo("openfiles");//設置運行的命令行程式,不在系統環境變數的要輸入完整路徑 start.Arguments = "/Query /V /NH /S " + host + " /U " + user + " /P " + passWord; //命令行程式的參數 start.CreateNoWindow = true;//不顯示dos命令行視窗 start.RedirectStandardOutput = true;//標準輸出 start.RedirectStandardInput = true;//標準輸入 start.RedirectStandardError = true;//錯誤輸出 start.UseShellExecute = false;// //指定不使用系統的外殼程式,而是直接啟動被調用程式本身 Process p = Process.Start(start); StreamReader reader = p.StandardOutput;//截取輸出流 errorMSG = p.StandardError.ReadLine(); //讀取錯誤輸出 string result = reader.ReadToEnd(); //讀取標準輸出 p.WaitForExit(); //等待程式執行完退出進程 p.Close(); //關閉進程 reader.Close(); //關閉流
2.用Process..StandardInput.WriteLine方法輸入的。
這類通常可以直接雙擊打開運行等待輸入。要註意需要輸入exit退出後才讀取到輸出的。這種也可以將輸入先寫在單獨的文件然後將文件作為參數輸入,除非經常要修改作測試不然寫參數在文件有乜好?
Process p = new Process(); // new instance of Process class p.StartInfo.UseShellExecute = false; // do not start a new shell p.StartInfo.RedirectStandardOutput = true; // Redirects the on screen results p.StartInfo.FileName = "diskpart.exe"; // executable to run p.StartInfo.RedirectStandardInput = true; // Redirects the input commands p.Start(); // Starts the process p.StandardInput.WriteLine("List volume"); // Issues commands to diskpart p.StandardInput.WriteLine("exit"); //要上面Exit了才能讀取 StreamReader reader = p.StandardOutput;//截取輸出流 string output = null;//每次讀取一行 while (!reader.EndOfStream) { output += Environment.NewLine; } p.WaitForExit(); // Waits for the exe to finish p.Close(); //關閉進程 reader.Close(); //關閉流
參考:
Using DiskPart with C#
https://ndswanson.wordpress.com/2014/08/12/using-diskpart-with-c/