PowerShell脚本检测模块不存在则安装后自启 反复执行故障求助
问题根因
- 原脚本运行
setup.exe时未申请管理员权限,若安装需要写入系统目录/注册表,普通权限下会静默安装失败,导致始终检测不到模块 - 未校验
setup.exe的安装退出码,即使安装出错也会直接重启脚本进入死循环 - 部分MSI安装包会新增
PSModulePath系统环境变量,旧会话未刷新环境变量时会识别不到已安装的模块
修正后的完整代码
$mypath = $MyInvocation.MyCommand.Path $parentPath = Split-Path $mypath -Parent $setupPath = Join-Path $parentPath "setup.exe" # 刷新PSModulePath环境变量,避免读取旧缓存 $env:PSModulePath = [System.Environment]::GetEnvironmentVariable("PSModulePath","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("PSModulePath","User") if (Get-Module -ListAvailable -Name ActiveRolesManagementShell) { Write-Host "QAD 已安装" pause exit 0 } else { Write-Host "正在安装QAD..." # 运行安装包时申请管理员权限,等待安装完成并获取退出码 $installProcess = Start-Process -FilePath $setupPath -Verb Runas -Wait -PassThru # 校验安装结果 if ($installProcess.ExitCode -ne 0) { Write-Host "QAD安装失败,退出码:$($installProcess.ExitCode)" pause exit 1 } Write-Host "QAD安装完成,正在以管理员权限重启脚本..." # 重启脚本 $arguments = "-File `"$mypath`" $($MyInvocation.UnboundArguments)" Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $arguments exit 0 }
改动说明
- 使用
Join-Path拼接路径,避免路径分隔符错误 - 每次启动脚本先刷新
PSModulePath环境变量,确保能读取到新安装的模块路径 - 运行
setup.exe时增加-Verb Runas参数申请管理员权限,避免权限不足导致安装失败 - 增加安装退出码校验,安装失败直接终止脚本,避免进入死循环
- 安装完成后原脚本直接退出,避免残留进程干扰
内容的提问来源于stack exchange,提问作者Fluffarmy223
相关产品推荐
相关产品推荐

