Process.Start() 中出现错误 -- 系统找不到指定的文件。

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。当不指定用户凭据运行相同的代码时,代码可以正常工作。我不确定为什么会出现这个错误。

请有人能够解释一下吗?

6个回答

67

试着用以下代码替换你的初始化代码:

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

Process.Start 方法中使用非完整文件路径仅在找到文件位于 System32 文件夹中时才有效。


4
如果UseShellExecute被设置为false,我们应该指定完整的文件名。 - Rashmi Pandit
@Rashmi Pandit - 是的,我们应该这样做。我之前也遇到了同样的问题 :)。别忘了接受并点赞答案 :) - Jojo Sardez
6
当然,你应该用用户系统上实际的程序路径来替换它。并非总是有C:驱动器,程序文件夹的拼写也不总是“Program Files”。 - Rob Kennedy
9
代码可能能够正常工作,但给出的原因完全错误。 - Fraser
2
@Fraser 我鼓励大家在评论讨论中验证信息。 - nik.shornikov
显示剩余2条评论

15

由于系统或用户的环境变量中未列出 Internet Explorer 的路径,因此您不能单独使用文件名 iexplore

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

System32 在这方面并不特殊,因为可以将任何目录添加到 PATH 变量中,每个路径由分号分隔。

例如,我在我的路径环境变量中有c:\ffmpeg\bin\c:\nmap\bin\,因此我可以执行像new ProcessStartInfo("nmap", "-foo")new ProcessStartInfo("ffplay", "-bar")这样的操作.

在我的计算机上,实际的PATH变量如下所示:

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

正如您所看到的,您可以使用其他系统变量构建环境变量中的路径,例如%SystemRoot%

因此,如果您将类似于“%PROGRAMFILES%\Internet Explorer;”这样的路径添加到您的PATH变量中,您就可以使用ProcessStartInfo("iexplore");

如果您不想更改您的PATH,那么只需使用诸如%PROGRAMFILES%%SystemRoot%之类的系统变量,并在代码中需要时进行扩展。例如:

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

2
你能解释一下 @ 的作用吗?为什么它在引号外面却是红色的? - kingfrito_5005
2
@kingfrito_5005 它将字符串标记为字符串字面量,以便通常被解释为转义字符的任何内容都被忽略。这样你就不需要在路径中双重反斜杠 - "\path\without" 与 @"\path\with"。 - Fraser
谢谢!在寻找完全不同的东西时发现这些有用的新信息真是太有趣了! - kingfrito_5005

0

我曾经遇到过同样的问题,但是所有的解决方案都不适用于我,因为在某些特殊情况下,信息“系统找不到指定的文件”可能会误导人。

在我的情况下,我使用Notepad++注册表重定向相结合,用于notepad.exe。不幸的是,我在注册表中的Notepad++路径是错误的。

因此,实际上信息“系统找不到指定的文件”告诉我,它无法找到与文件类型(*.txt)相关联的应用程序(Notepad++),而不是文件本身。


0

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

也就是说,这会导致Process.Start()无法找到您的exe文件:

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

也许它能帮到某些人。

0

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

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

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

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

另一种方法(推荐的方法)是只使用进程名称:
new ProcessStartInfo("SomeProcess.exe")

第二种方法需要将进程目录注册到环境变量Path中。请确保将其添加到系统变量而不是当前用户变量,这样可以让您的应用程序访问此变量。


-8
您可以使用以下代码获取程序的完整路径,例如:
Environment.CurrentDirectory

3
这并不会给你程序的路径。它提供了当前目录,这是完全不同的东西。当前目录可能与程序启动时不同,并且在程序执行期间随时可能更改。 - James

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