2016-01-15 224 views
1

我試圖以管理員身份運行cmd命令。但CMD窗口意外關閉。如果CMD窗口停留,我可以看到錯誤。我試圖使用process.WaitForExit();C#以管理員身份運行CMD

我試圖以管理員身份運行代碼zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

這是我的代碼。

 //The command that we want to run 
     string subCommand = zipAlignPath + " -v 4 "; 

     //The arguments to the command that we want to run 
     string subCommandArgs = apkPath + " release_aligned.apk"; 

     //I am wrapping everything in a CMD /K command so that I can see the output and so that it stays up after executing 
     //Note: arguments in the sub command need to have their backslashes escaped which is taken care of below 
     string subCommandFinal = @"cmd /K \""" + subCommand.Replace(@"\", @"\\") + " " + subCommandArgs.Replace(@"\", @"\\") + @"\"""; 

     //Run the runas command directly 
     ProcessStartInfo procStartInfo = new ProcessStartInfo("runas.exe"); 

     //Create our arguments 
     string finalArgs = @"/env /user:Administrator """ + subCommandFinal + @""""; 
     procStartInfo.Arguments = finalArgs; 

     //command contains the command to be executed in cmd 
     using (System.Diagnostics.Process proc = new System.Diagnostics.Process()) 
     { 
      proc.StartInfo = procStartInfo; 
      proc.Start(); 

     } 

有沒有辦法讓CMD窗口保持運行/顯示?

+0

這是最有可能造成所有這些以及與string.replace'「'和\ –

回答

0

捕獲從流程的輸出(S):

proc.StartInfo = procStartInfo; 
proc.StartInfo.RedirectStandardError = true; 
proc.StartInfo.RedirectStandardOutput = true; 
proc.Start() 
// string output = proc.StandardOutput.ReadToEnd(); 
string error = proc.StandardError.ReadToEnd(); 
proc.WaitForExit(); 

然後做與輸出的東西。

注意:您不應該嘗試同時讀取兩個流,因爲存在死鎖問題。您可以爲其中的一個或兩個添加異步閱讀,或者只是來回切換,直到完成故障排除。

1

您正在從runas.exe可執行文件開始進程。這不是如何提升流程。

相反,您需要使用shell執行來啓動您的可執行文件,但使用runas動詞。沿着這些線路:

ProcessStartInfo psi = new ProcessStartInfo(...); // your command here 
psi.UseShellExecute = true; 
psi.Verb = "runas"; 
Process.Start(psi); 
+0

你爲什麼要傳遞三個問題點作爲ProcessStartInfo()的構造參數?對不起,我是C#的初學者。 – Isuru

+1

這是給你填寫你的命令,我專注於提升並假設你知道你想運行什麼。 「cmd.exe」代替'...' –

+0

加上psi.Verb =「runas」;然後變成管理員?或者什麼可執行屬性來設置? –

0

下面的方法確實有效...

private void runCMDFile() 
{ 
    string path = @"C:\Users\username\Desktop\yourFile.cmd"; 

    Process proc = new Process();       

    proc.StartInfo.FileName = path; 
    proc.StartInfo.UseShellExecute = true; 
    proc.StartInfo.CreateNoWindow = false; 
    proc.StartInfo.RedirectStandardOutput = false; 
    proc.StartInfo.Verb = "runas";       
    proc.Start(); 
    proc.WaitForExit(); 
} 
相關問題