由于某些奇怪的原因,此代码失败了:

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

这还有以下额外好处

  1. 适用于任何环境变量(%APPDATA%、%COMMONPROGRAMFILES% 等),并且
  2. 在字符串中的任何位置工作(例如"%temp%\%用户名%\foo.txt")

试试:

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

然后求出:

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

casper击败了我的解释,但是这个过程.Start方法基本上将其视为它,而不是作为shell的内容。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top