【问题标题】:Run external application with no .exe extension运行不带 .exe 扩展名的外部应用程序
【发布时间】:2011-03-26 23:24:43
【问题描述】:

我知道如何在 C# System.Diagnostics.Process.Start(executableName); 中运行外部应用程序,但是如果我要运行的应用程序的扩展名无法被 Windows 识别为可执行文件的扩展名,该怎么办。就我而言,它是application.bin

【问题讨论】:

    标签: c# .net process


    【解决方案1】:

    关键是在启动进程之前将Process.StartInfo.UseShellExecute属性设置为false,例如:

    System.Diagnostics.Process p = new System.Diagnostics.Process();
    p.StartInfo.FileName = @"c:\tmp\test.bin";
    p.StartInfo.UseShellExecute  = false;
    p.Start();
    

    这将直接启动该过程:而不是通过“让我们尝试找出指定文件扩展名的可执行文件”的shell逻辑,文件将被认为是可执行文件本身。

    实现相同结果的另一种语法可能是:

    var processStartInfo = new ProcessStartInfo
    {
        FileName = @"c:\tmp\test.bin",
        UseShellExecute = false
    };
    Process.Start(processStartInfo);
    

    【讨论】:

    • 这仅在您完全限定文件路径时才有效。如果您允许 Windows 搜索文件的 PATH 环境变量,它将为它搜索的每个文件夹附加一个“.exe”。可悲的是,这对我正在处理的项目来说很痛苦,因为该位置完全取决于用户文件中设置的PATH。我必须手动查找文件并将StartInfo.FileName 属性设置为完全限定路径。
    • 啊...原来有一个古老的 DOS 技巧可以做到这一点:在文件名的末尾添加一个句点,Windows 将查找没有扩展名的文件。设置 StartInfo.FileName="[appname]."它会避免在末尾添加“.exe”。
    【解决方案2】:

    接下来是@yelnic。尝试使用cmd.exe /C myapp,当我想从Process.Start() 中获得更多信息时,我发现它非常有用。

    using (Process process = Process.Start("cmd.exe") 
    {
       // `cmd` variable can contain your executable without an `exe` extension
       process.Arguments = String.Format("/C \"{0} {1}\"", cmd, String.Join(" ", args));
       process.UseShellExecute  = false;
       process.RedirectStandardOutput = true;
       process.Start();
       process.WaitForExit();
       output = process.StandardOutput.ReadToEnd();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 2020-03-18
      • 1970-01-01
      相关资源
      最近更新 更多