Mam następujące trywialne aplikacji C#, która po prostu próbuje uruchomić "jconsole.exe", który na moim komputerze znajduje się w C: \ Programs \ jdk16 \ bin.Zmienna środowiskowa Process.Start() i PATH
using System;
using System.Diagnostics;
namespace dnet {
public class dnet {
static void Main(string[] args) {
try {
Process.Start("jconsole.exe");
Console.WriteLine("Success!");
} catch (Exception e) {
Console.WriteLine("{0} Exception caught.", e);
}
}
}
}
Jeśli moja zmienna środowiskowa PATH jest ustawiona na
c:\windows;c:\windows\sytem32;c:\programs\jdk16\bin
działa idealnie. Jednakże, jeśli zmienna środowiskowa PATH jest ustawiona na
c:\windows;c:\windows\sytem32;c:\\programs\jdk16\bin
(zwrócić uwagę na dwie backslashy pomiędzy „C:” i „programy”), to nie z wyjątkiem win32.
System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified
at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
at dnet.dnet.Main(String[] args)
Co ciekawe, w tym samym wierszu polecenia, gdzie mogę uruchomić program .NET i uzyskać wyjątek, mogę po prostu wpisać „jconsole.exe”, a program zostanie uruchomiony. Wygląda na to, że system Windows nie ma problemu ze znalezieniem pliku wykonywalnego z podwójnym odwróconym ukośnikiem w zmiennej PATH, ale funkcja Process.Start() działa.
Dlaczego dodatkowy ukośnik odwrotny w PATH powoduje problemy i jak mogę obejść problem? Nie wiem, gdzie plik wykonywalny, który chcę wywołać, będzie umiejscowiony w czasie wykonywania, więc wolałbym polegać na zmiennej PATH.
Istnieją dwa sposoby, aby uruchomić EXE, testujesz obie strony. Twoja aplikacja używa ShellExecuteEx(), interpreter wiersza poleceń używa CreateProcess(). Możesz grać z właściwością ProcessStartInfo. UseShellExecute. Nie ma sensu martwić się o to, jak inaczej interpretują zmienną środowiskową PATH, wiesz, jak rozwiązać problem. –