使用PowerShell进行Ruby无提示安装

时间:2016-12-20 19:08:52

标签: powershell

我正在尝试使用下面通过PowerShell提供的选项以静默模式安装Ruby:

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
}

我收到以下错误:

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

我不确定我是否遗漏了某些内容或只是使用了错误的语法。

2 个答案:

答案 0 :(得分:2)

使用-ArgumentList参数传递参数。

$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 

为了使它更容易理解,使用变量来划分界限。

$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 

此行中还有一个错误:if ($ruby_inst_process -ne 0) Start-Process -PassThru的返回值是Process个对象,而不是简单的数字或字符串。你可能想要的是这个对象的ExitCode属性。

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

答案 1 :(得分:1)

这与powershell如何解释空格有关,它试图将/tasks=assocfiles,modpath作为参数传递给start-process而不是ruby安装程序。这个问题有两个修复方法。第一个是提供-argumentlist参数,如下所示

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

或使用Invoke-Expression代替Start-Process,这会将整个字符串作为单个命令执行

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

请注意,您可能需要使用引用来获得Invoke-Expression上的订单