【问题标题】:Process.Start filename using %temp%Process.Start 文件名使用 %temp%
【发布时间】:2012-03-29 08:18:21
【问题描述】:

由于某些奇怪的原因,此代码失败:

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

【问题讨论】:

标签: c# path filenames processstartinfo start-process


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      %TEMP% 由 Command Shell 解析和评估。为此,您可以使用 Path.GetTempPath()Path.Combine

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

      【讨论】:

      • 太棒了!谢谢! BTW:我把string.Concat换成了Path.Combine,我觉得这里更合适。
      • Path.Combine 在处理文件或路径名时几乎总是比 string.Concat 更合适;它为您执行所有路径(和驱动器)分隔符逻辑,然后执行 string.Contact 无论如何。
      【解决方案4】:

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

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

      这有

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

      【讨论】:

        【解决方案5】:

        试试这个:

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

        然后将其连接到:

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

        Casper 在解释上打败了我,但 Process.Start 方法基本上是按字面意思对待它,而不是像 shell 那样插入它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-16
          • 2011-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-19
          相关资源
          最近更新 更多