【问题标题】:Error in Process.Start() -- The system cannot find the file specifiedProcess.Start() 中的错误——系统找不到指定的文件
【发布时间】:2011-01-23 01:41:55
【问题描述】:

我正在使用以下代码来触发 iexplore 进程。这是在一个简单的控制台应用程序中完成的。

public static void StartIExplorer()
{
    var info = new ProcessStartInfo("iexplore");
    info.UseShellExecute = false;
    info.RedirectStandardInput = true;
    info.RedirectStandardOutput = true;
    info.RedirectStandardError = true;

    string password = "password";
    SecureString securePassword = new SecureString();

    for (int i = 0; i < password.Length; i++)
        securePassword.AppendChar(Convert.ToChar(password[i]));

    info.UserName = "userName";
    info.Password = securePassword;
    info.Domain = "domain";

    try
    {
        Process.Start(info);
    }
    catch (System.ComponentModel.Win32Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

上面的代码抛出错误The system cannot find the file specified。在不指定用户凭据的情况下运行相同的代码可以正常工作。我不确定它为什么会抛出这个错误。

谁能解释一下?

【问题讨论】:

    标签: c# .net process


    【解决方案1】:

    尝试将您的初始化代码替换为:

    ProcessStartInfo info 
        = new ProcessStartInfo(@"C:\Program Files\Internet Explorer\iexplore.exe");
    

    Process.Start 上使用非完整文件路径仅适用于在 System32 文件夹中找到该文件的情况。

    【讨论】:

    • 我们应该指定完整的文件名,因为 UseShellExecute 设置为 false。
    • @Rashmi Pandit - 是的,我们应该这样做。我之前已经遇到过同样的问题:)。不要忘记接受并投票赞成答案:)
    • 当然,您应该真正将其替换为用户系统上程序的实际路径。并不总是有 C: 驱动器,程序文件夹也不总是拼写为“Program Files”。
    • -1 代码可能运行良好,但给出的原因完全错误。
    • @Fraser 我鼓励大家也验证一下 cmets 讨论中的信息
    【解决方案2】:

    您不能单独使用像 iexplore 这样的文件名,因为系统或用户的 PATH 环境变量中没有列出 Internet Explorer 的路径。

    但是,在PATH 环境变量中输入的任何路径都允许您仅使用文件名来执行它。

    System32 在这方面并不特殊,因为 any 目录可以添加到 PATH 变量中。每条路径都由分号简单地分隔。

    例如,我的路径环境变量中有c:\ffmpeg\bin\c:\nmap\bin\,所以我可以执行new ProcessStartInfo("nmap", "-foo")new ProcessStartInfo("ffplay", "-bar") 之类的操作

    实际的PATH 变量在我的机器上看起来像这样。

    %SystemRoot%\system32;C:\FFPlay\bin;C:\nmap\bin;
    

    如您所见,您可以使用其他system variables,例如%SystemRoot%在环境变量中构建和构造路径。

    所以 - 如果您添加类似“%PROGRAMFILES%\Internet Explorer;”的路径到您的PATH 变量,您将能够使用ProcessStartInfo("iexplore");

    如果您不想更改 PATH,则只需使用系统变量,例如 %PROGRAMFILES%%SystemRoot%,然后在需要时在代码中扩展它。即

    string path = Environment.ExpandEnvironmentVariables(
           @"%PROGRAMFILES%\Internet Explorer\iexplore.exe");
    var info = new ProcessStartInfo(path);
    

    【讨论】:

    • 你能解释一下@是什么意思吗,为什么它是红色的,即使它在引号之外?
    • @kingfrito_5005 它将字符串标记为字符串文字,以便忽略通常被解释为转义字符的任何内容。这样您就不需要双反斜杠路径 - "\\path\\without" vs @"\path\with"
    • 谢谢!在寻找完全不同的东西的同时发现这些有用的新信息真是太有趣了!
    【解决方案3】:

    另外,如果您的 PATH 的目录用引号括起来,它将在命令提示符下运行,但您会收到相同的错误消息

    即这会导致 Process.Start() 找不到您的 exe:

    PATH="C:\my program\bin";c:\windows\system32
    

    也许它对某人有帮助。

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,但没有一个解决方案对我有用,因为消息The system cannot find the file specified 在某些特殊情况下可能会产生误导。

      就我而言,我将Notepad++registry redirect 结合用于notepad.exe。不幸的是,我在注册表中的 Notepad++ 路径是错误的。

      所以事实上The system cannot find the file specified 的消息告诉我,它找不到与文件类型(*.txt) 关联的应用程序(Notepad++),而不是文件本身。

      【讨论】:

        【解决方案5】:

        我知道它有点老了,虽然这个问题已经接受了答案,但我认为它的答案并不完全。

        假设我们要在这里运行一个进程C:\Program Files\SomeWhere\SomeProcess.exe

        一种方法是硬编码绝对路径:

        new ProcessStartInfo(@"C:\Program Files\SomeWhere\SomeProcess.exe")
        

        另一种方式(推荐的方式)是只使用进程名:

        new ProcessStartInfo("SomeProcess.exe")
        

        第二种方式需要将进程目录注册到环境变量Path变量中。确保将其添加到系统变量而不是当前用户变量,这允许您的应用访问此变量.

        【讨论】:

          【解决方案6】:

          您可以使用以下方法获取程序的完整路径,如下所示:

          Environment.CurrentDirectory
          

          【讨论】:

          • 这不会为您提供程序的路径。这为您提供了当前目录,这是完全不同的。当前目录可以不同启动,在程序执行过程中可以随时改变。
          猜你喜欢
          • 1970-01-01
          • 2019-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-07
          • 2016-09-19
          • 2012-03-02
          相关资源
          最近更新 更多