如何在运行.exe时使用安装参数和-wait

时间:2017-05-12 20:23:17

标签: powershell

我想安装SQLServer2014SP1,然后安装SQL数据工具。我需要它在安装SQL数据工具之前等待SP1完成。

以下是我一直在尝试的内容:

Write-Host "Launching SQL SP 1 ..."
Start-Process "\\mynetworkpath\SQLServer2014SP1.exe" -wait /qs /IAcceptSQLServerLicenseTerms /Action=Patch /AllInstances 

Write-Host "Lauching SQL Server Data Tools install ..."
& "\\mynetworthpath\SSDTBI_x86_ENU.exe" /ACTION=INSTALL /FEATURES=SSDTBI,SNAC_SDK /Q /IACCEPTSQLSERVERLICENSETERMS

我尝试了-wait/安装参数的不同组合,但是我发现SP1安装失败的一般错误,或者它将完成,SSDT安装永远不会启动。

如果有更好的方法,我愿意接受建议。它确实必须自动化。

1 个答案:

答案 0 :(得分:4)

您的 Start-Process 来电的语法存在缺陷;尝试以下方法:

# Define executable
$exe = '\\mynetworkpath\SQLServer2014SP1.exe'
# Define *array* of arguments
$args = '/qs', '/IAcceptSQLServerLicenseTerms', '/Action=Patch', '/AllInstances'

Start-Process -Wait $exe -ArgumentList $args

中间变量并非严格需要,但为了便于阅读,我选择它们并说明参数如何适合Start-Process语法:
传递参数必须作为数组传递给-ArgumentList-Args)参数。

-Wait选项在继续执行下一个命令之前等待指定可执行文件创建的进程终止。当然,这只能按预期工作,如果该过程不会异步生成其他进程来完成实际工作 - 我不知道你的特定可执行文件是否属于这种情况。

使用文字参数,您可以执行以下操作,这需要较少的引用:

Start-Process -Wait \\mynetworkpath\SQLServer2014SP1.exe -ArgumentList `
  /qs, /IAcceptSQLServerLicenseTerms, /Action=Patch, /AllInstances        

但是,一般情况下,您需要注意PowerShell对未引用或双引号参数的预先解释(例如,不引用,的使用被解释为数组构造运算符) ,比cmd.exe更广泛 - 见我的this answer