2012-02-15 189 views
0

我知道我的標題與StackOverflow中的其他人一樣,但我的意圖是其他。在C#中使用相同的ProcessStartInfo實例執行多個命令(使用BCP)

我創建了一個C#函數,它使用BCP命令爲我的數據庫中的每個表創建BCP文件。下面的代碼是一個示例,是函數的一部分。

List<string> tables = GetTables(); // a function which takes all tables from my database 

string command = @"bcp ADatabase.dbo.{0} out {0}.bcp -n -Usa -Ppassword"; 

ProcessStartInfo processInfo = null; 
    try { 
     foreach (string table in tables) { 
      command = string.Format(command, table); 
      processInfo = new ProcessStartInfo("cmd", "/c " + command); 
      processInfo.RedirectStandardOutput = true; 
      processInfo.CreateNoWindow = false; 
      Process process = new Process(); 
      process.StartInfo = processInfo; 
      process.Start(); 
      string result = process.StandardOutput.ReadToEnd(); 
      Console.WriteLine(result); 
     } 
    } catch (Exception e) { 
     Console.WriteLine(e.Message); 
    } 

我想避免執行多個窗口,我想在同一個窗口中執行每個命令行。

我的代碼是好的還是替代?

感謝

回答

2

我不確定是否有辦法打開一個命令窗口,然後繼續發佈命令給它,如果有人有一個聰明的方法做到這一點,這將是很好的。

您可以使用Streamwriter編寫一個包含您想要的所有命令的批處理文件,然後運行該批處理文件。那至少只會打開一個進程。

StreamWriter sw = new StreamWriter("MyBatchFile.bat"); 
      string command = @"bcp ADatabase.dbo.{0} out {0}.bcp -n -Usa -%1"; 
      ProcessStartInfo processInfo = null; 
      try 
      { 
       foreach (string table in tables) 
       { 
        command = string.Format(command, table); 
        sw.WriteLine(command);           
       } 
       sw.Flush(); 
       sw.Close(); 
       processInfo = new ProcessStartInfo("cmd", "/c MyBatchFile.Bat Ppassword"); 
       processInfo.RedirectStandardOutput = true; 
       processInfo.CreateNoWindow = false; 
       Process process = new Process(); 
       process.StartInfo = processInfo; 
       process.Start(); 
       string result = process.StandardOutput.ReadToEnd(); 
       Console.WriteLine(result); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 

批處理文件在命令行中的「%1」,所以,當你開始你的程序中通過數據庫的密碼到批處理文件

ProcessStartInfo("cmd", "/c MyBatchFile.Bat Ppassword"); 

這應該確保,如果任何人都可以找到批處理文件,它只有%1的密碼。

不知道這是不是你有什麼更好的已經...但它只是打開一個命令行窗口:)

馬丁

0

一個非常簡單的選擇是使用&&運營商建立一個龐大的命令。這裏有一個片段來說明這個想法:cmd /c echo hello && echo world。這裏的缺點是,如果你的任務失敗了,找出哪一個任務有點困難。

您可以隨時將命令寫入本地* .bat文件,然後處理該文件。然後,如果出現故障,您可以更好地瞭解故障發生的位置,並且您希望將cmd參數從/c切換到/k,以便您可以保持該窗口處於打開狀態以查看發生了什麼。