使用%temp%启动文件的过程。

4

由于某种奇怪的原因,这段代码会失败:

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

可能是你需要的:https://dev59.com/c2855IYBdhLWcg3wbztl - Alex
请参考以下链接:https://dev59.com/HUjSa4cB1Zd3GeqPCRAs进程启动时不会展开环境变量。 - Chriseyre2000
在发布之前,我没有找到它(我已经搜索了一段时间)。 - Diego
5个回答

4

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

1

字符串中的%temp%部分被字面解释,而不是被替换为相应的环境变量。您需要手动展开它。

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

0

%TEMP% 会被命令行解析和评估。您可以使用 Path.GetTempPath()Path.Combine 来实现此目的。

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

太好了!谢谢!顺便说一下:我把string.Concat改成了Path.Combine,我认为这更适合这里。 - Diego
1
在处理文件或路径名时,Path.Combine几乎总是比string.Concat更合适;它为您执行所有路径(和驱动器)分隔符逻辑,然后仍然执行string.Contact。 - Michael Edenfield

0

试试这个:

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

然后将其连接在一起:

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

Casper比我更快地解释了,但Process.Start方法基本上是按照字面意思处理它,而不是像shell那样解释它。

0
你可以使用 Environment.ExpandEnvironmentVariables 来扩展字符串中的环境变量,然后将其传递给 Process 类:
p.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%temp%\SSCERuntime_x86-ENU.msi");

这样做的额外好处是:

  1. 适用于任何环境变量(%APPDATA%,%COMMONPROGRAMFILES%等),并且
  2. 可以在字符串的任何位置使用(例如“%temp%\%username%\foo.txt”)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接