2014-12-06 106 views
2

爲什麼「1.bat」無法成功運行?任何幫助將不勝感激。 「1.bat」創建成功。它可以正常運行,但不能重命名文件。如何編寫「* .bat」文件?

private void button1_Click(object sender, EventArgs e) 
    { 

     string str = System.Environment.CurrentDirectory; 
     str += "\\1.bat"; 
     string txt = ""; 
     txt = "ren *.mp3 *.wav"; 

     StreamWriter sw = new StreamWriter(str,false, Encoding.UTF8); 
     sw.Write(txt); 
     sw.Close(); 

     Process p = new Process(); 
     p.StartInfo.FileName = str; 
     p.StartInfo.Arguments = ""; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     p.Start();   
    } 
+3

你是什麼意思_無法成功運行_?任何異常或錯誤信息? – 2014-12-06 15:17:14

+0

看起來像'\\ 0.bat',而不是'0.bat'。 '\\ 0'是NULL字符,在這種情況下無效。 – 2014-12-06 15:22:24

+0

嘗試在StartInfo上設置UseShellExecute。但是你不需要呼叫一個.bat來批量重命名文件!你可以很容易地用C#編寫代碼。 (你也可能不應該假設你有權寫入當前目錄,並且如果惡意用戶可以在你編寫和執行bat文件之間修改bat文件,那麼存在理論上的攻擊:他們可以讓你以用戶的身份運行任意命令) – Rup 2014-12-06 15:23:05

回答

5

一個問題是您的文件正在使用UTF-8 BOM編寫。嘗試通過Encoding.Default進行測試。或者通過new UTF8Encoding(false)作爲編碼傳遞忽略BOM的UTF-8編碼。

另一個問題(您剛添加到編輯中)是您將UseShellExecute設置爲false。這就要求你傳遞的文件是一個可執行文件。你的文件不是。您需要UseShellExecutetrue以允許shell瞭解如何處理.bat文件。

而另一個可能的問題是,當前目錄可能不是你認爲的那樣。

當遇到像這樣的問題時,根本沒有必要無奈。做一些調試。在批處理文件的末尾添加一個pause,並確保您可以看到控制檯。你會立即發現問題所在。學習如何調試與學習如何編程一樣重要。直到你能做到前者,你才能做到後者。

如果我不得不做這種方式,與外部的過程,我想:

  • 設置UseShellExecutefalse
  • 通過cmd.exe作爲可執行文件。
  • 傳遞要作爲命令行執行的命令。

但是,直接使用C#來做這件事會容易得多,所以不必旋轉外部進程。

+0

你是對的!非常感謝你 :) – 2014-12-06 16:03:09