Process.Start 文件名使用 %temp%
-
12-12-2019 - |
题
由于某些奇怪的原因,此代码失败了:
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
财产 那么你必须获取环境变量(使用 GetEnvironmentVariable
方法 在 Environment
班级)并自己执行替换,如下所示:
// 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;
%temp%通过命令shell解析和评估。您可以使用 path.gettemppath()和 path.comnbine 为此目的。
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%\%用户名%\foo.txt")
试试:
string tempPath = Environment.GetEnvironmentVariable("Temp");
.
然后求出:
p.StartInfo.FileName = Path.Combine(tempPath, "SSCERuntime_x86-ENU.msi");
.
casper击败了我的解释,但是这个过程.Start方法基本上将其视为它,而不是作为shell的内容。
不隶属于 StackOverflow