2011-05-31 73 views

回答

2
string location; 

Process p = new Process; 

location = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) 
[email protected]"\Resources\batchfile.bat"; 

p.StartInfo.FileName = location; 
+1

你可以使用'Path.Combine'爲該concatanation,「最佳」doesen't給你很大的餘地。 – Jodrell 2011-06-01 16:46:14

+0

謝謝Jodrell .. – 2011-06-01 23:27:59

3

你可以把一個批處理文件放在你想要的任何文件系統位置。

雖然它看起來像批處理文件的路徑是錯誤的。具有前導反斜槓的路徑將相對於當前驅動器的根目錄進行解釋。這可能不是你的批處理文件的地方。它可能位於應用程序自己的安裝文件夾的Resources子目錄中。至少,從這些字符串中刪除前導反斜槓。然後他們將被解釋爲相對於您的進程當前的工作目錄。

不過,使用完全限定的路徑會更好。當你不期待的時候,當前的工作目錄有改變的趨勢。

+0

同意 - 但因爲你是從代碼開始,您還可以獲取當前的EXE的位置,無論是工作文件夾中,通過使用System.Reflection.Assembly.GetCallingAssembly()的位置,然後只需追加「Resources \ batchname.bat」即可。 – SqlRyan 2011-05-31 20:14:52

+0

是的,@Rwmnau。我應該更清楚。我的意思是程序應該使用完全合格的路徑*到EXE目錄*(因爲那是資源文件夾的目錄),而不是當前的工作目錄。 – 2011-05-31 20:16:32

+0

謝謝Rob和rwmnau。 System.Reflection.Assembly.GetCallingAssembly()。Location方法還包括(.exe文件)。有沒有辦法截斷它。我想獲得字符串大小和截斷的exe文件的大小...任何更好的sugessions – 2011-05-31 21:38:40

1

(您的C#項目的)資源通常是在編譯時鏈接到您的程序集中的文件。如果你在那裏放置一個批處理文件,你必須在運行時將它解壓縮到像%TEMP%文件夾這樣的文件夾,然後從那裏運行它。

3

您可能希望將.bat文件包含爲嵌入式資源。因此,在Visual Studio中,您將打開文件上的屬性,併爲「構建操作」選擇「Embedded Resource」。

現在爲了有趣的一部分....在您的應用程序中,您需要提取文件並將其寫入磁盤,然後才能在Assembly對象上使用GetManifestResourceStream方法。這有點棘手,因爲您需要將資源名稱傳遞給方法,並且該名稱最終取決於您的程序集名稱空間以及路徑(所以如果您的項目是MyProject,並且您的文件位於Resources\MyBat.bat,那麼資源名稱將是MyProject.Resources.MyBat.bat ...至少我認爲這是正確的)

實際上存在一個關於如何做到這一點的現存問題here,並且有比我要鞭打的更好的代碼示例。 :)

+0

謝謝ckramer ...即時通訊使用這也用於我的圖像等:) – 2011-06-01 23:28:41

相關問題