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");
这有额外的好处
- 适用于任何环境变量(%APPDATA%,%COMMONPROGRAMFILES%等)和
- 在字符串中的任何位置工作(例如“%temp%\%username%\ foo.txt”)
试试这个:
string tempPath = Environment.GetEnvironmentVariable("Temp");
然后结束:
p.StartInfo.FileName = Path.Combine(tempPath, "SSCERuntime_x86-ENU.msi");
卡斯帕在解释上打败了我,但是Process.Start方法基本上是对它进行处理而不是像shell一样对其进行处理。