我正在尝试使用下面通过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
我不确定我是否遗漏了某些内容或只是使用了错误的语法。
答案 0 :(得分:2)
使用-ArgumentList
参数传递参数。
$ruby_inst_process = Start-Process -FilePath "C:\Users\guest_new\Downloads\rubyinstaller-2.0.0-p648-x64.exe" -ArgumentList "/silent /tasks='assocfiles,modpath'" -PassThru -Wait
为了使它更容易理解,使用变量来划分界限。
$exe = "C:\Users\guest_new\Downloads\rubyinstaller-2.0.0-p648-x64.exe"
$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
上的订单