2016-12-20 7 views
0

Ich versuche, Rubin im Silent-Modus mit den Optionen unten durch Powershell erwähnt zu installieren:Ruby-Silent-Installation mithilfe von Powershell

echo "Installing Ruby 2.0.0" 
$ruby_inst_process = Start-Process "C:\Users\guest_new\Downloads\rubyinstaller-2.0.0-p648-x64.exe" /silent /tasks='assocfiles,modpath' -PassThru -Wait 
if ($ruby_inst_process -ne 0) 
{ 
    echo "Ruby 2.0.0 installation failed" 
    exit 0 
} 

ich die folgende Störung erhalte:

Start-Process : A positional parameter cannot be found that accepts argument '/tasks=assocfiles,modpath'. 
+ ... t_process = Start-Process "C:\Users\guest_new\Downloads\rubyinstaller- ... 
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [Start-Process], ParameterBindingException 
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand 

Ich bin nicht sicher wenn ich etwas vermisse oder einfach falsche Syntax verwende.

+1

Argumente mit dem Parameter '-ArgumentList' übergeben. '$ ruby_inst_process = Start-Prozess" C: \ Benutzer \ Gast_neu \ Downloads \ rubyinstaller-2.0.0-p648-x64.exe "-ArgumentList"/silent/tasks = 'assoziationsdateien, modpath' "-PassThru -Wait' –

+0

@ RyanBemrose: Das sollte eine Antwort sein, kein Kommentar. – Heinzi

Antwort

1

zu erhalten übergeben Sie Ihre Argumente mit dem -ArgumentList Parameter.

$ruby_inst_process = Start-Process -FilePath "C:\Users\guest_new\Downloads\rubyinstaller-2.0.0-p648-x64.e‌​xe" -ArgumentList "/silent /tasks='assocfiles,modpath'" -PassThru -Wait 

Um es ein wenig einfacher zu verstehen, verwenden Sie Variablen, um die Linie zu brechen.

$exe = "C:\Users\guest_new\Downloads\rubyinstaller-2.0.0-p648-x64.e‌​xe" 
$args = "/silent /tasks='assocfiles,modpath'" 

$ruby_inst_process = Start-Process -FilePath $exe -ArgumentList $args -PassThru -Wait 

Es gibt auch einen Fehler in dieser Zeile: if ($ruby_inst_process -ne 0) Die Rückkehr von Start-Process -PassThru ist ein Process Objekt, nicht eine einfache Zahl oder String. Was Sie wahrscheinlich wollen, ist die ExitCode Eigenschaft für dieses Objekt.

if ($ruby_inst_process.ExitCode -ne 0) { 
    "Ruby 2.0.0 installation failed" 
    exit 0 
} 
+0

Es hat funktioniert und danke. Aber beim Überprüfen des Exit-Werts wird ein anderer Fehler mit dem String-Typ angezeigt. 'Installieren von Ruby 2.0.0 Kann Wert in Typ System.String nicht konvertieren. Bei D: \ VBox Shared \ mcollective_install.ps1: 5 Zeichen: 2 + Write-Host "$ ruby_inst_process" + ~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~ + CategoryInfo: InvalidArgument: (:) [], Runtime + FullyQualifiedErrorId: InvalidCastFromAnyTypeToString Rubin 2.0.0 Installation – Karthi1234

+0

Zwei nits failed': 1) Powershell ähnlich JavaScript des Semikolons Insertion verhält, so setzen Sie immer öffnende geschweifte Klammern in derselben Zeile wie Ihr 'if', nicht die nächste Zeile. 2) Sie müssen Zeichenfolgen nicht mit '+' verketten, um Variablen in PS zu drucken. Fügen Sie es einfach in den String ein wie "der dritte Wert von $ setname ist $ ($ values ​​[2])" –

1

Das hat damit zu tun, wie powershell whitespace interpretiert, es versucht /tasks=assocfiles,modpath als Argument zu starten-Prozess und nicht zum Ruby-Installer übergeben. Es gibt zwei Fixes für dieses Problem. Die erste ist, wie ein -argumentlist Parameter zur Verfügung zu stellen unter

Start-Process "C:\Users\guest_new\Downloads\rubyinstaller-2.0.0-p648-x64.exe" -argumentlist @("/silent","/tasks='assocfiles,modpath'") -PassThru -Wait 

oder durch Invoke-Expression statt Start-Process verwenden, dies führt eine gesamte Zeichenfolge als einen einzigen Befehl

Invoke-Expression ""C:\Users\guest_new\Downloads\rubyinstaller-2.0.0-p648-x64.exe" /silent /tasks='assocfiles,modpath'" 

Hinweis müssen Sie wahrscheinlich mit dem Zitat des spielen Um die Bestellung direkt auf die Invoke-Expression

Verwandte Themen