2013-02-12 35 views
6

Tôi đang cố gắng cài đặt Java bằng chế độ im lặng và cũng chỉ định thư mục cài đặt có chứa dấu cách. Khi tôi làm điều này nó bật lên "Windows Installer" hộp thoại chỉ ra một trong các tham số là không chính xác. Nếu tôi sử dụng tên đường dẫn ngắn nó hoạt động chính xác, nhưng tôi thực sự không muốn sử dụng tên thư mục ngắn vì đó là giá trị được lưu trữ trong Registry.Cài đặt Java với cài đặt im lặng vào một thư mục có dấu cách

Lệnh Tôi muốn sử dụng ...

jre-6u39-windows-i586.exe /s INSTALLDIR="C:\Program Files (x86)\Java" 

này bật lên hộp thoại Windows Installer.

Khi tôi sử dụng ...

jre-6u39-windows-i586.exe /s INSTALLDIR=C:\Progra~2\Java 

này hoạt động.

LƯU Ý: "Program Files (x86)" chỉ là một ví dụ. Điều này được cài đặt tại các trang web của khách hàng và họ chọn thư mục cài đặt, do đó chúng tôi phải có khả năng hỗ trợ bất kỳ thư mục nào mà họ có thể chỉ định.

Bất kỳ ý tưởng nào tôi có thể thực hiện cài đặt im lặng nhưng vẫn sử dụng tên đường dẫn dài?

UPDATE:

Tôi nghĩ tôi sẽ chia sẻ giải pháp cuối cùng. Một điều thú vị mà tôi thấy rằng tôi muốn chia sẻ là bạn có thể chặn tự động khởi động lại quá trình cài đặt và nó trả lại mã thoát 3010. Vì vậy, bạn có thể trì hoãn việc khởi động lại vào một thời điểm khác. Đây là mã (viết lại một chút để loại bỏ một loạt các sự trừu tượng của chúng ta)

public bool InstallJava(string installPath, string logFile) 
{ 
    bool rebootRequired = false; 

    string fullLogFileName = Path.Combine(logFile, "JavaInstall.log"); 
    string arguments = string.Format("/s /v\"/qn REBOOT=Suppress INSTALLDIR=\\\"{0}\\\" STATIC=1 /L \\\"{1}\\\"\"", installPath, fullLogFileName); 

    ProcessStartInfo startInfo = new ProcessStartInfo { RedirectStandardError = true, RedirectStandardOutput = true, RedirectStandardInput = true, UseShellExecute = false, CreateNoWindow = true, 
    FileName = "jre-7u25-windows-x64.exe", Arguments = arguments }; 

    var process = Process.Start(startInfo); 
    process.WaitForExit(); 

    if (process.ExitCode == 3010) 
     rebootRequired = true; 

    else if (process.ExitCode != 0) 
    { 
     // This just looks through the list of error codes and returns the appropriate message 
     string expandedMessage = ExpandExitCode(StringResources.JAVA_INSTALL_ERROR, process.ExitCode, fullLogFileName); 
     throw new Exception(expandedMessage); 
    } 

    return rebootRequired; 
} 
+1

Bạn đã cố gắng% ProgramFiles%? – vqdave

+0

Tôi xin lỗi vì không rõ ràng. "Program Files (x86)" chỉ là một ví dụ. Tôi đã thay đổi câu hỏi để phản ánh đúng điều này. –

Trả lời

5

tôi nhớ lại gặp phải vấn đề này trước ....

Bạn cần phải sử dụng dấu ngoặc kép khi đi qua con đường đến trình cài đặt nếu đường dẫn có dấu cách. Bởi vì đường dẫn arg đã có trong dấu ngoặc kép, bạn cần phải thoát khỏi từng trích dẫn bằng dấu '\' để nó được chuyển qua. Vì vậy, lệnh sẽ

 j2re.exe /s /v"/qn INSTALLDIR=\"C:\Program Files\JRE\"" 

tham khảo:

http://docs.oracle.com/javase/1.5.0/docs/guide/deployment/deployment-guide/silent.html

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4966488

+2

Tôi tự hỏi bản thân mình mỗi tuần một điều gì khiến một MS ngớ ngẩn có ý tưởng ngớ ngẩn khi đặt tên cho thư mục thường dùng là "Program Files (x86)". – Ingo

+1

Đừng dùng cách này sai nhưng, tôi muốn * hôn * bạn :) –

+1

@Ingo Đó không phải là vấn đề so với cú pháp shell "tuyệt vời" và xử lý trích dẫn/đối số thống nhất của cmd.exe và trên thực tế, toàn bộ hệ thống phụ được sử dụng để gọi một chương trình .. ngoại trừ, không. –

Các vấn đề liên quan