3

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

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

5 回答 5

4

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

如果您想使用环境变量来构建FileName属性,那么您必须获取环境变量(使用class上的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");
于 2012-03-12T22:04:39.027 回答
1

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

var temp = Environment.GetEnvironmentVariable("temp");
var fileName = Path.Combine(temp, "SSCERuntime_x86-ENU.msi");
p.StartInfo.FileName = fileName;
于 2012-03-12T22:05:19.910 回答
0

%TEMP% 由 Command Shell 解析和评估。为此,您可以使用Path.GetTempPath()Path.Combine

p.StartInfo.FileName = Path.Combine(Path.GetTempPath(), @"SSCERuntime_x86-ENU.msi");
于 2012-03-12T22:03:44.370 回答
0

试试这个:

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

然后将其连接到:

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

Casper 在解释上打败了我,但 Process.Start 方法基本上是按字面意思对待它,而不是像 shell 那样对它进行插入。

于 2012-03-12T22:03:55.640 回答
0

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

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

这具有额外的好处

  1. 适用于任何环境变量(%APPDATA%、%COMMONPROGRAMFILES% 等),以及
  2. 在字符串中的任何位置工作(例如“%temp%\%username%\foo.txt”)
于 2012-03-12T22:06:54.160 回答