2012-03-12 31 views
3

對於一些奇怪的reaseon驗證碼失敗:的Process.Start文件名使用%TEMP%

p.StartInfo.FileName = @"%temp%\SSCERuntime_x86-ENU.msi"; 

這個代碼更迭:

p.StartInfo.FileName = @"C:\Users\USERNAME\AppData\Local\Temp\SSCERuntime_x86-ENU.msi"; 

是否有任何理由我失蹤?

注意我剛纔複製的路徑,我不認爲代碼的其餘部分是必要的,但我會把它無論如何:

Process p = new Process(); 
p.StartInfo.FileName = @"%temp%\SSCERuntime_x86-ENU.msi"; 
p.StartInfo.Arguments = "/passive"; 
p.Start(); 
+0

也許你需要什麼: http://stackoverflow.com/questions/4348003/using-environment-variable-in-a-file-路徑 – Alex 2012-03-12 22:03:53

+0

請參閱http:// stackoverflow。com/questions/1013383/how-can-an-application-access-the-environment-variable-set-by-another-applicatio 進程啓動不擴展環境變量。 – Chriseyre2000 2012-03-12 22:03:55

+0

發帖之前我還沒有找到它(我一直在尋找一段時間) – Diego 2012-03-12 22:06:10

回答

4

Process class不擴展字符串與環境變量(即%temp%)。

如果你想使用環境變量來構建FileName property那麼你就必須獲得環境變量(使用上Environment classGetEnvironmentVariable method),並自己進行替換,就像這樣:

// Construct the path. 
string temp = Environment.GetEnvironmentVariable("temp"); 
string path = Path.Combine(temp, "SSCERuntime_x86-ENU.msi"); 

// Launch the process. 
Process p = new Process(); 
p.StartInfo.FileName = path; 
p.StartInfo.Arguments = "/passive"; 
p.Start(); 

另外,您可以使用ExpandEnvironmentVariables method與原始字符串,如下所示:

p.StartInfo.FileName = 
    Environment.ExpandEnvironmentVariables(@"%temp%\SSCERuntime_x86-ENU.msi"); 
0

%TEMP%被解析並通過命令行界面評估。爲此,您可以使用使用Path.GetTempPath()Path.Combine。在

string tempPath = Environment.GetEnvironmentVariable("Temp"); 

然後CONCAT它:

p.StartInfo.FileName = Path.Combine(Path.GetTempPath(), @"SSCERuntime_x86-ENU.msi"); 
+0

太棒了!謝謝!順便說一句:我改變了string.Concat爲Path.Combine,我認爲在這裏更合適。 – Diego 2012-03-12 22:05:08

+1

當您處理文件或路徑名時,Path.Combine幾乎總是比string.Concat更合適;它爲你執行所有路徑(和驅動器)分隔符邏輯,然後執行一個字符串。無論如何,請聯繫。 – 2012-03-12 22:08:31

+0

已更新:) – 2012-03-12 22:08:51

0

試試這個

p.StartInfo.FileName = Path.Combine(tempPath, "SSCERuntime_x86-ENU.msi"); 

卡斯帕打我就交代了一拳,但方法的Process.Start基本上對待它,而不是字面將其作爲外殼來使用。

1

字符串的%temp%部分被按字面解釋,而不是被替換爲適當的環境變量。你需要手動展開

var temp = Environment.GetEnvironmentVariable("temp"); 
var fileName = Path.Combine(temp, "SSCERuntime_x86-ENU.msi"); 
p.StartInfo.FileName = fileName; 
0

可以使用Environment.ExpandEnvironmentVariables爲字符串內展開環境變量,然後傳遞到Process類:

p.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%temp%\SSCERuntime_x86-ENU.msi"); 

這有

的增值收益
  1. 工作於任何環境變量(%APPDATA%,%COMMONPROGRAMFILES%,等等),和
  2. 工作字符串中的任何位置(例如「%temp%\%USERNAME%\ foo.txt的」)
相關問題