如何用PowerShell检查指定版本MySQL并实现自动安装
MySQL版本检测与自动安装PowerShell脚本修复
问题概述
需要通过PowerShell实现:检查系统是否已安装指定版本的MySQL,若未安装则启动对应.msi安装包完成安装。目前Go的版本检测与安装功能正常,但MySQL无类似GOPATH的环境变量可直接定位安装路径,现有脚本存在变量引用错误、注册表路径兼容性问题,无法正常完成检测。
现有代码问题点
Check-Is-MySQL-Installed和Install-MySQL函数中错误使用未定义的$mysqlVersion变量,应替换为全局定义的$desiredMySQLVersion- 注册表路径未考虑Windows系统的32/64位兼容性,64位系统上32位MySQL的注册表项会位于
HKLM:\SOFTWARE\Wow6432Node\MySQL AB\MySQL Server x.x.x路径 - 安装启动未添加静默参数,可能导致交互弹窗,影响自动化执行
修正后的完整脚本
$desiredGoVersion = "go1.20.4" $desiredMySQLVersion = "8.0.32.0" function Install-Go { Write-Host "已安装的Go版本不符,开始安装Go $desiredGoVersion。" $installerFileName = $desiredGoVersion, ".windows-amd64.msi" -Join "" $desiredGoInstallerPath = Join-Path $PSScriptRoot -ChildPath "installers" | Join-Path -ChildPath $installerFileName Start-Process -FilePath $desiredGoInstallerPath -Wait Write-Host "Go安装完成。" Check-Is-Go-Installed } function Check-Is-Go-Installed { # 检查指定版本Go是否已安装 $goPath = [System.Environment]::GetEnvironmentVariable("GOPATH", "User") if (-not $goPath) { $goPath = [System.Environment]::GetEnvironmentVariable("GOPATH", "Machine") } if ($goPath) { $goExePath = Join-Path $goPath "bin\go.exe" if (Test-Path $goExePath) { # 获取已安装的Go版本 $installedVersion = & $goExePath version | Select-String -Pattern "go version (.+?) " if ($installedVersion) { $installedVersion = $installedVersion.Matches.Groups[1].Value if ($installedVersion -eq $desiredGoVersion) { Write-Host "Go版本 $desiredGoVersion 已安装。" } else { Install-Go } } else { Write-Host "无法检测已安装的Go版本。" } } } else { Install-Go } } function Install-MySQL{ # 定义MySQL安装包路径 $installerFileName = "mysql-installer-community-", $desiredMySQLVersion, ".msi" -Join "" $desiredMySQLInstallerPath = Join-Path $PSScriptRoot -ChildPath "installers" | Join-Path -ChildPath $installerFileName Write-Host "安装包路径:$desiredMySQLInstallerPath" if (Test-Path $desiredMySQLInstallerPath) { # 静默启动安装(添加/qn参数实现无交互安装) Start-Process -FilePath "msiexec.exe" -Wait -ArgumentList "/i `"$desiredMySQLInstallerPath`" /qn" Write-Host "MySQL版本 $desiredMySQLVersion 安装完成。" Check-Is-MySQL-Installed } else { Write-Host "未找到指定路径的安装包。" } } function Check-Is-MySQL-Installed { # 检查指定版本MySQL是否已安装,兼容32/64位系统 $mysqlRegistryPaths = @( "HKLM:\SOFTWARE\MySQL AB\MySQL Server $desiredMySQLVersion", "HKLM:\SOFTWARE\Wow6432Node\MySQL AB\MySQL Server $desiredMySQLVersion" ) $isInstalled = $false foreach ($path in $mysqlRegistryPaths) { if (Test-Path $path) { $isInstalled = $true break } } if ($isInstalled) { Write-Host "MySQL版本 $desiredMySQLVersion 已安装。" }else{ Write-Host "未安装MySQL版本 $desiredMySQLVersion,开始执行安装..." Install-MySQL } } # 执行检测与安装 # Check-Is-Go-Installed Check-Is-MySQL-Installed
关键修改说明
- 变量修正:将所有
$mysqlVersion替换为全局定义的$desiredMySQLVersion,确保版本一致 - 注册表兼容性:添加
Wow6432Node路径检查,覆盖32位MySQL在64位系统上的注册表位置 - 静默安装优化:改用
msiexec.exe启动安装包,并添加/qn参数实现无交互静默安装,适合自动化场景 - 路径验证完善:在Go的检测中添加
Test-Path验证go.exe是否存在,避免无效路径调用
内容的提问来源于stack exchange,提问作者rminaj
相关产品推荐
相关产品推荐

