Windows批处理脚本异常:无论VPN版本是否最新均执行重装问题排查
VPN GPO部署脚本版本判断问题排查
问题描述
我正在编写用于GPO部署的VPN脚本,需要实现以下功能:
- 通过注册表查询目标PC上已安装的VPN软件版本
- 若版本非最新(最新为v6.3.1-376),则卸载旧版本并安装最新版
- 若版本已是最新,不执行任何操作
- 结束脚本
目前脚本的注册表查询环节存在问题:无论VPN版本是否为最新,都会执行卸载重装操作。
原脚本
@echo off :10 REM Check installed version of VPN client, end if current - v6.3.1-376 - update if not current for /f "skip=2 tokens=2" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\VPNClient" /v "Version"') do set "keyValue=%%i" if not "keyValue%" == "6.3.1-376" goto 20 else goto 999 :20 REM Uninstall old version of VPN client start /wait MsiExec.exe /X{62BC3D77-3D5D-4821-B162-5BF52C6B11AF} /quiet /norestart goto :30 :30 REM Install current version of VPN client - v6.3.1-376 pushd "\\ourdomain.com\Directory_Containing_The_Installer" start /wait msiexec /i vpnclientinstaller.msi /quiet /norestart popd goto 999 :999 end
注册表查询结果
执行的注册表查询命令:
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\VPNClient" /v "Version"
命令提示符输出:
Version REG_SZ 6.3.1-376
修改后的脚本
@echo off :10 REM Check installed version of GlobalProtect client, end if current - v6.3.1-376 - update if not current for /f "skip=3 tokens=3" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\VPNClient" /v "Version"') do set "keyValue=%%i" if not "%keyValue%" == "6.3.1-376" (goto 20) else goto 999 :20 REM Uninstall old version of VPN client start /wait MsiExec.exe /X{62BC3D77-3D5D-4821-B162-5BF52C6B11AF} /quiet /norestart goto :30 :30 REM Install current version of VPN client - v6.3.1-376 pushd "\\ourdomain.com\Directory_Containing_The_Installer" start /wait msiexec /i vpnclientinstaller.msi /quiet /norestart popd goto 999 :999 end
问题排查与修复
你遗漏了几个关键问题,导致版本判断逻辑始终走卸载重装分支:
注册表查询的
skip参数错误
实际执行reg query时,会先输出一行注册表路径的表头,再输出版本数据行:HKEY_LOCAL_MACHINE\SOFTWARE\VPNClient Version REG_SZ 6.3.1-376你修改后的脚本用了
skip=3,会跳过所有有效行,导致keyValue变量未被赋值(始终为空),自然和目标版本不匹配,触发卸载重装。正确的skip值应为1(跳过表头行)。可选兼容性优化(避免后续踩坑)
- 64位系统中,32位软件的注册表项会被重定向到
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\VPNClient,脚本可以增加对该路径的查询,兼容两种系统环境。 - 脚本开头先初始化
keyValue变量为空,避免环境中残留的旧变量影响判断。
- 64位系统中,32位软件的注册表项会被重定向到
最终修复后的脚本
@echo off set "keyValue=" :10 REM Check installed version of VPN client, end if current - v6.3.1-376 - update if not current REM 先查询64位注册表路径 for /f "skip=1 tokens=3" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\VPNClient" /v "Version" 2^>nul') do set "keyValue=%%i" REM 如果64位路径没找到,查询32位路径 if not defined keyValue ( for /f "skip=1 tokens=3" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\VPNClient" /v "Version" 2^>nul') do set "keyValue=%%i" ) REM 判断版本是否为最新 if not "%keyValue%" == "6.3.1-376" goto 20 else goto 999 :20 REM Uninstall old version of VPN client start /wait MsiExec.exe /X{62BC3D77-3D5D-4821-B162-5BF52C6B11AF} /quiet /norestart goto :30 :30 REM Install current version of VPN client - v6.3.1-376 pushd "\\ourdomain.com\Directory_Containing_The_Installer" start /wait msiexec /i vpnclientinstaller.msi /quiet /norestart popd goto 999 :999 end
内容的提问来源于stack exchange,提问作者DomingoSneed
相关产品推荐
相关产品推荐

