Ошибка в Process.Start() - система не может найти указанный файл
Я использую следующий код для запуска процесса 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
. Тот же код при запуске без указания учетных данных пользователя работает нормально. Я не уверен, почему он выбрасывает эту ошибку.
Может кто-нибудь объяснит?
Ответы
Ответ 1
Попробуйте заменить код инициализации следующим образом:
ProcessStartInfo info
= new ProcessStartInfo(@"C:\Program Files\Internet Explorer\iexplore.exe");
Использование не полного пути к файлу в Process.Start
работает только в том случае, если файл находится в папке System32.
Ответ 2
Вы не можете использовать имя файла, например iexplore
, потому что путь к интернет-проводнику не указан в переменной среды PATH
для системы или пользователя.
Однако любой путь, введенный в переменную среды 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;
Как вы можете видеть, вы можете использовать другие 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);
Ответ 3
Кроме того, если ваш каталог PATH заключен в кавычки, он будет работать из командной строки, но вы получите то же сообщение об ошибке
т.е. это вызывает проблему с Process.Start(), не находящим ваш exe:
PATH="C:\my program\bin";c:\windows\system32
Может быть, это помогает кому-то.
Ответ 4
Вы можете использовать следующее, чтобы получить полный путь к вашей программе следующим образом:
Environment.CurrentDirectory