Process.Start文件名使用%temp%

时间:2012-03-12 22:00:37

标签: c# path filenames processstartinfo start-process

对于某些奇怪的请求,此代码失败:

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

5 个答案:

答案 0 :(得分:4)

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

如果您想使用环境变量来构建FileName property,那么您必须获取环境变量(使用GetEnvironmentVariable method上的Environment class)并自行执行替换,像这样:

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

命令Shell解析和评估

%TEMP%。您可以使用Path.GetTempPath()Path.Combine来实现此目的。

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

答案 3 :(得分:0)

试试这个:

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

然后结束:

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

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

答案 4 :(得分:0)

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

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

这具有

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