2013-02-12 13 views
6

Próbuję zainstalować Javę w trybie cichym, a także określić katalog instalacyjny zawierający spacje. Kiedy to zrobię, pojawia się okno dialogowe "Instalator Windows", wskazujące, że jeden z parametrów jest niepoprawny. Jeśli używam nazwy krótkiej ścieżki, działa ona poprawnie, ale naprawdę wolałabym nie używać nazwy krótkiego katalogu, ponieważ jest to wartość przechowywana w Rejestrze.Instalowanie środowiska Java z cichą instalacją w katalogu ze spacjami

Komenda chcę użyć ...

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

to wyskakuje okno dialogowe Instalatora Windows.

Gdy używam ...

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

To działa.

UWAGA: "Pliki programów (x86)" to tylko przykład. Jest instalowany na stronach klienta i wybiera katalog instalacyjny, dlatego musimy mieć możliwość obsługi dowolnego katalogu, który mogą określić.

Każdy pomysł, w jaki sposób mogę zrobić cichą instalację, ale nadal używać nazwy długich ścieżek?

UPDATE:

myślałem, że chciałbym podzielić się ostatecznego rozwiązania. Jedną z fajnych rzeczy, które chciałem udostępnić, jest to, że można wyłączyć automatyczne ponowne uruchomienie instalacji i zwraca kod wyjścia 3010. W związku z tym można odłożyć ponowne uruchomienie na inny czas. Oto kod (przepisany trochę wyeliminować kilka naszych własnych abstrakcji)

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

Czy próbowałeś% ProgramFiles%? – vqdave

+0

Przepraszam za brak jasności. "Program Files (x86)" to tylko przykład. Zmieniłem pytanie, aby to właściwie odzwierciedlić. –

Odpowiedz

5

wspominam napotykając ten problem przed ....

Trzeba użyć cudzysłowu przy przejściu ścieżki do instalator, jeśli ścieżki zawierają spacje. Ponieważ argument ścieżka jest już w cudzysłowie, musisz uciec każdy cytat za pomocą \ znaku \ "\", aby przejść przez niego. Więc komenda będzie

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

referencyjny:

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

Zadaję sobie co drugi tydzień, co to jest **** w MS miał głupi pomysł, aby nazwać często używany katalog "Program Files (x86)". – Ingo

+1

Nie rób tego w niewłaściwy sposób, ale chcę cię * pocałować * :) –

+1

@Ingo To prawie nie jest problem w porównaniu z "niesamowitą" składnią powłoki i jednolitym cytowaniem/argumentem obsługi cmd.exe i, w rzeczywistości, cały podsystem użyty do wywołania programu ... z wyjątkiem, nie. –

Powiązane problemy