Process.Start文件名使用%temp%

对于一些奇怪的reaseon这个代码失败:

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(); 

Process类不会使用环境变量(即%temp% )扩展字符串。

如果要使用环境变量来构建FileName属性,则必须获取环境变量(使用Environment类上的GetEnvironmentVariable方法 )并GetEnvironmentVariable执行替换,如下所示:

 // 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方法与原始字符串一起使用,如下所示:

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

字符串的%temp%部分按字面解释,而不是用适当的环境变量替换。 您需要手动展开它

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

命令shell程序解析和评估%TEMP%。 您可以使用Path.GetTempPath()和Path.Combine来实现此目的。

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

您可以使用Environment.ExpandEnvironmentVariables来扩展字符串中的环境变量,然后将其传递给Process类:

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

这有额外的好处

  1. 适用于任何环境变量(%APPDATA%,%COMMONPROGRAMFILES%等)和
  2. 在字符串中的任何位置工作(例如“%temp%\%username%\ foo.txt”)

试试这个:

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

然后结束:

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

卡斯帕在解释上打败了我,但是Process.Start方法基本上是对它进行处理而不是像shell一样对其进行处理。