2013-02-12 14 views
6

Sto tentando di installare Java utilizzando la modalità silenziosa e inoltre di specificare una directory di installazione che contenga spazi. Quando faccio questo, si apre la finestra di dialogo "Windows Installer" che indica che uno dei parametri non è corretto. Se utilizzo il nome del percorso breve, funziona correttamente, ma preferirei non utilizzare il nome della directory breve, perché questo è il valore che viene memorizzato nel Registro di sistema.Installazione di Java con installazione invisibile in una directory con spazi

Il comando Voglio usare ...

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

questo visualizza la finestra di dialogo di Windows Installer.

Quando uso ...

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

Questo funziona.

NOTA: "Programmi (x86)" è solo un esempio. Questo è installato sui siti dei client e scelgono la directory di installazione, quindi dobbiamo essere in grado di supportare qualsiasi directory che possono specificare.

Qualche idea su come eseguire un'installazione invisibile, ma utilizzare ancora il nome del percorso lungo?

UPDATE:

ho pensato di condividere la soluzione finale. Una cosa interessante che ho trovato che volevo condividere è che è possibile sopprimere il riavvio automatico dell'installazione e restituisce un codice di uscita di 3010. Pertanto è possibile rinviare il riavvio in un altro momento. Ecco il codice (riscritto un po 'per eliminare un po' di nostra astrazione)

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

Hai provato% Programmi%? – vqdave

+0

Mi scuso per non essere stato chiaro. "Program Files (x86)" è solo un esempio. Ho cambiato la domanda per riflettere correttamente questo. –

risposta

5

Ricordo incontrare questo problema prima ....

È necessario utilizzare le virgolette quando si passa percorsi per la programma di installazione se i percorsi hanno spazi. Poiché il percorso arg è già tra virgolette, è necessario eseguire lo escape di ciascuna virgoletta con una "\" per farla passare attraverso . Così il comando sarà

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

di riferimento:

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

Mi chiedo ogni settimana che cosa sia un **** le a MS ha avuto l'idea sciocca di nominare una directory "Program Files (x86)" usata spesso. – Ingo

+1

Non prendere questo nel modo sbagliato ma, voglio * baciarti * tu :) –

+1

@Ingo Difficilmente è un problema rispetto alla sintassi della shell "awesome" e alla gestione uniforme di quote/argomenti di cmd.exe e, di fatto, l'intero sottosistema utilizzato per invocare un programma .. tranne, non. –

Problemi correlati