Ho la seguente applicazione C# banale che tenta semplicemente di avviare "jconsole.exe", che sulla mia macchina si trova in C: \ Programmi \ jdk16 \ bin.Variabile di ambiente Process.Start() e 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);
}
}
}
}
Se la mia variabile d'ambiente PATH è impostata su
c:\windows;c:\windows\sytem32;c:\programs\jdk16\bin
funziona perfettamente. Tuttavia, se la variabile PATH viene impostato
c:\windows;c:\windows\sytem32;c:\\programs\jdk16\bin
(notare le due barre rovesciate tra "c:" e "programmi"), si riesce con un'eccezione 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)
È interessante notare che, nello stesso prompt dei comandi in cui ho eseguito il programma .NET e ottenere l'eccezione, posso semplicemente digitare "jconsole.exe", e il programma si avvierà. Sembra che Windows non abbia problemi a trovare l'eseguibile con il doppio backslash nel PERCORSO, ma Process.Start().
Perché il backsback aggiuntivo nel PERCORSO causa problemi e come posso risolvere il problema? Non so dove si troverà l'eseguibile che voglio chiamare al runtime, quindi preferirei fare affidamento sulla variabile PATH.
Ci sono due modi per avviare un file EXE, si sta testando in entrambe le direzioni. La tua app utilizza ShellExecuteEx(), l'interprete della riga di comando utilizza CreateProcess(). Puoi giocare con la proprietà ProcessStartInfo.UseShellExecute. Non ha molto senso preoccuparsi di come interpretano la variabile d'ambiente PATH in modo diverso, sapete come risolvere il problema. –