Tôi có ứng dụng C# tầm thường sau đây chỉ đơn giản là cố gắng để khởi động "jconsole.exe", mà trên máy tính của tôi nằm trong C: \ Programs \ jdk16 \ bin.Process.Start() và biến môi trường 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);
}
}
}
}
Nếu biến môi trường PATH của tôi được thiết lập để
c:\windows;c:\windows\sytem32;c:\programs\jdk16\bin
nó hoạt động hoàn hảo. Tuy nhiên, nếu biến môi trường PATH được đặt thành
c:\windows;c:\windows\sytem32;c:\\programs\jdk16\bin
(lưu ý hai dấu gạch chéo ngược giữa "c:" và "chương trình"), nó không có ngoại lệ 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)
Điều thú vị là, trong cửa sổ lệnh cùng một nơi tôi chạy chương trình .NET và nhận được ngoại lệ, tôi có thể chỉ cần gõ "jconsole.exe", và chương trình sẽ bắt đầu. Windows dường như không gặp khó khăn trong việc tìm kiếm tệp thực thi với dấu gạch chéo ngược kép trong PATH, nhưng Process.Start() thực hiện.
Tại sao dấu gạch chéo ngược phụ trong PATH gây ra sự cố và cách tôi có thể khắc phục sự cố? Tôi không biết nơi mà các tập tin thực thi tôi muốn gọi sẽ được đặt tại thời gian chạy, vì vậy tôi muốn dựa vào biến PATH.
Có hai cách để bắt đầu một file EXE, bạn đang thử nghiệm cả hai cách. Ứng dụng của bạn sử dụng ShellExecuteEx(), trình thông dịch dòng lệnh sử dụng CreateProcess(). Bạn có thể chơi với thuộc tính ProcessStartInfo.UseShellExecute. Không có nhiều điểm đáng lo ngại về cách họ giải thích biến môi trường PATH một cách khác nhau, bạn biết cách khắc phục vấn đề. –