如何通过PowerShell自动化下载安装SQL Server 2016 Express版
问题根因
- 相对路径不识别:你传入的配置文件为相对路径,Chocolatey调用SQL安装程序时的工作目录是包的临时缓存目录,而非执行choco命令的当前目录,导致安装程序找不到自定义配置文件,直接加载默认参数触发实例名冲突。
- 参数转义错误:PowerShell环境下执行choco命令时引号转义逻辑异常,导致
/ConfigurationFile参数未被正确传递给Chocolatey安装包。
修复后的Chocolatey实现方案
修改后的脚本如下,核心是使用绝对路径存储配置文件,修正参数转义逻辑:
$chocopath = 'c:\programdata\chocolatey' if (-not (Test-Path $chocopath)) { Set-ExecutionPolicy RemoteSigned -Force iex ((New-Object Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) } # 用系统临时目录的绝对路径存储配置文件,避免路径识别问题 $configPath = Join-Path $env:TEMP "SQL2016ExpressConfig.ini" Set-Content -Value $Source -Path $configPath -Force # 正确转义引号,传递配置文件绝对路径 choco install mssqlserver2016expressadv --params="/ConfigurationFile=`"$configPath`"" -y # 清理临时配置文件 Remove-Item $configPath -Force
注意:请确保你的配置文件内容中已包含/IACCEPTSQLSERVERLICENSETERMS、/ACTION=install、/Q三类必填静默参数,否则安装流程会异常中断。
原生PowerShell无依赖实现方案
如果不想依赖Chocolatey,可以直接通过原生PowerShell实现全自动化安装,可控性更高:
# 自行替换为SQL Server 2016 Express Advanced版官方离线安装包下载地址 $installerUrl = "<官方安装包下载地址>" $installerPath = Join-Path $env:TEMP "SQLEXPRADV2016_x64_ENU.exe" $configPath = Join-Path $env:TEMP "SQL2016Config.ini" $extractPath = Join-Path $env:TEMP "SQL2016Installer" # 下载安装包 Invoke-WebRequest -Uri $installerUrl -OutFile $installerPath -UseBasicParsing # 生成自定义配置文件,可根据需求调整参数 $configContent = @" [OPTIONS] ACTION="Install" IACCEPTSQLSERVERLICENSETERMS="True" QUIET="True" UPDATEENABLED="False" INSTANCEID="你的自定义实例ID" INSTANCENAME="你的自定义实例名" # 可在此处追加其他所需安装参数 "@ Set-Content -Path $configPath -Value $configContent -Force # 解压安装包 Start-Process -FilePath $installerPath -ArgumentList "/x:`"$extractPath`" /q" -Wait # 执行静默安装 Start-Process -FilePath (Join-Path $extractPath "setup.exe") -ArgumentList "/ConfigurationFile=`"$configPath`"" -Wait # 清理所有临时文件 Remove-Item $installerPath -Force Remove-Item $extractPath -Recurse -Force Remove-Item $configPath -Force
内容的提问来源于stack exchange,提问作者NARESH GOVINDARAJ
相关产品推荐
相关产品推荐

