进程.使用%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();
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");
这有的额外好处
- 为任何环境变量(%APPDATA%、%COMMONPROGRAMPFILES%等)工作,以及
- 在字符串中的任何位置工作(例如"%temp%''%username%''foo.txt")
试试这个:
string tempPath = Environment.GetEnvironmentVariable("Temp");
然后插入:
p.StartInfo.FileName = Path.Combine(tempPath, "SSCERuntime_x86-ENU.msi");
Casper在解释上把我打得落花流水,但Process.Start方法基本上是从字面上处理它,而不是像shell那样插入它。