对于某些奇怪的请求,此代码失败:
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();
答案 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)
%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");
这具有
的附加好处