2014-10-27 51 views
0

我有一個需要通過創建命令提示符運行的文件。 基本上這是怎麼回事:C#從資源運行命令提示符

該文件的名稱是UArtCMD.exe,我通過打開它的目錄中的命令提示符並運行編程到它的命令,例如「uartcmd a」使用它。我想要做的是在外部向這個軟件添加一個gui,當我們說,在gui上按下一個按鈕時,它會使用命令提示符運行一個命令。

我已經設法使它沒有任何故障地從我的電腦上運行,但是當我在不同的計算機上安裝軟件時會發生問題。由於UArtCMD是一個外部軟件,它不會在每臺計算機上,所以我試圖做的是將其添加到項目的資源並從那裏運行,問題是我不知道如何去做。

這是我在計算機上運行命令提示符下它具有UArtCMD

public static string executeLine(string command) 
    { 
     string result; 
     try 
     { 
      Process process = Process.Start(new ProcessStartInfo("cmd.exe", "/c " + command) 
      { 
       CreateNoWindow = true, 
       UseShellExecute = false, 
       WorkingDirectory = "C:\\UArtCMD", 
       RedirectStandardError = true, 
       RedirectStandardOutput = true 
      }); 
      process.WaitForExit(); 
      string text = process.StandardOutput.ReadToEnd(); 
      process.Close(); 
      MainWindow.log(text); 
      result = text; 
     } 
     catch (Exception ex) 
     { 
      result = ex.StackTrace; 
     } 
     return result; 
    } 

提前感謝代碼!

如果您需要我添加任何信息或擴展更多的問題,請讓我知道我會很樂意這樣做。

+1

1)您從哪裏提取資源並將您的可執行文件保存到文件系統? 2)我不會使用c:\​​ something作爲工作目錄(具有限制的用戶或UAC可能會阻止此操作) – 2014-10-27 11:24:43

+0

刪除WorkingDirectory屬性,將uARTCMD作爲項目的一部分添加,並將其更改爲「Copy local」 – 2014-10-27 11:25:00

+0

@AdrianoRepetti I不要提取它們,它們在資源中,並且我已經將「複製到輸出目錄」屬性設置爲「始終」,就像SalamiArmy建議的 – Daedalus 2014-10-27 11:34:25

回答

0
  1. 在解決方案中包含對文件UArtCMD.exe的引用(可以位於解決方案結構中的任何位置)。
  2. 將其「複製到輸出目錄」屬性設置爲「始終」。
  3. 將您的進程「WorkingDirectory」屬性設置爲 「Environment.CurrentDirectory」。

現在UArtCMD.exe應該總能找到它的方式進入bin目錄(即使它是由生成代理到一個陌生的輸出目錄生成)和代碼就知道了尋找它在相同的目錄代碼正在運行。

編輯:有關從您的過程對象中刪除「WorkingDirectory」屬性的註釋是有效的,您可以這樣做,而不是將其設置爲「Environment.CurrentDirectory」,它們都執行相同的操作。

+0

它在我的視覺工作室上工作,但是當我發佈它並使用設置時。 exe在另一臺計算機上它不會工作,它會在一些奇怪的地方打開命令提示符:「C:\ Users \ amitl \ AppData \ Local \ Apps \ 2.0 \ CDX6CCR1.79G \ 5WDJ5DCZ.62Y \ rts ... tion_5f66aa7ae274c4f6_0001.0000_826a6715465111b8 \ UArtCMD「 – Daedalus 2014-10-27 12:26:20

+0

如果您在設置」WorkingDirectory「屬性或將其設置爲Environment.CurrentDirectory時遇到問題,則採用更徹底的方法。嘗試將它設置爲:(新的System.Uri(Assembly.GetExecutingAssembly()。CodeBase))。AbsolutePath – SalamiArmy 2014-10-27 12:35:33

+0

Infact「(new System.Uri(Assembly.GetExecutingAssembly()。CodeBase))。AbsolutePath」將包含正在運行的程序集文件名。你真的想要包含的目錄。 「Path.GetDirectoryName」可以爲你解決這個問題。因此,要分配給WorkingDirectory的完整表達式如下所示: ** Path.GetDirectoryName((new System.Uri(Assembly.GetExecutingAssembly()。CodeBase))。AbsolutePath)** 如果您真的想徹底查找UArtCMD.exe相對於正在運行的程序集。 – SalamiArmy 2014-10-27 13:40:11