进程.使用%temp%启动文件名

本文关键字:文件名 启动 %temp% 使用 进程 | 更新日期: 2023-09-27 18:27:28

对于一些奇怪的研究,此代码失败:

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

进程.使用%temp%启动文件名

Process类不使用环境变量(即%temp%)展开字符串。

如果您想使用环境变量来构建FileName属性,那么您必须获取环境变量(在Environment类上使用GetEnvironmentVariable方法)并自己执行替换,如下所示:

// 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%由命令行外壳程序解析和评估。为此,您可以使用Path.GetTempPath()和Path.Combine。

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%、%COMMONPROGRAMPFILES%等)工作,以及
  2. 在字符串中的任何位置工作(例如"%temp%''%username%''foo.txt")

试试这个:

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

然后插入:

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

Casper在解释上把我打得落花流水,但Process.Start方法基本上是从字面上处理它,而不是像shell那样插入它。