如何在批处理中调用PowerShell实现SVN预提交钩子正则校验
VisualSVN预提交钩子:整合PowerShell实现复杂提交消息正则校验
问题背景
你在使用VisualSVN的预提交钩子(基于cmd.exe解释器),现有脚本已实现提交消息最小长度校验,需添加两个复杂正则规则的校验:
- 匹配工单关联格式:
\[((Issue|Resolves|Closes|Solves)[:=]\s?)?#?([0-9]+)\](例如[Issue:#123]、[Resolves=456]、[Closes 789]) - 匹配无用户影响格式:
\[[nN]o?-?[uU](ser)?-?[iI](mpact)?\](例如[no-ui]、[NoUserImpact]、[nOU-Impact])
由于cmd的findstr不支持这类复杂正则,需调用PowerShell实现,但之前管道传递输入和返回退出码的方式存在问题。
完整整合脚本
将以下代码整合到你的现有预提交钩子批处理中:
@echo off setlocal enabledelayedexpansion :: 接收VisualSVN传入的仓库路径和事务ID set "REPOS=%1" set "TXN=%2" :: -------------------------- :: 1. 现有提交消息最小长度校验 :: -------------------------- set "commitMsg=" :: 捕获提交消息的所有内容(支持多行) for /f "delims=" %%a in ('svnlook log "%REPOS%" -t "%TXN%"') do ( set "commitMsg=!commitMsg!%%a" ) :: 校验空消息 if "!commitMsg!"=="" ( echo 错误:提交消息不能为空!>&2 exit 1 ) :: 校验最小长度(这里设为10,可根据需求修改) if "!commitMsg:~0,10!"=="" ( echo 错误:提交消息长度不能少于10个字符!>&2 exit 1 ) :: -------------------------- :: 2. 新增复杂正则校验 :: -------------------------- :: 通过管道将提交消息传给PowerShell执行正则匹配 svnlook log "%REPOS%" -t "%TXN%" | powershell -Command "$fullMsg = @($input) -join [Environment]::NewLine; $ticketPattern = '\[((Issue|Resolves|Closes|Solves)[:=]\s?)?#?([0-9]+)\]'; $noImpactPattern = '\[[nN]o?-?[uU](ser)?-?[iI](mpact)?\]'; if ($fullMsg -match $ticketPattern -or $fullMsg -match $noImpactPattern) { exit 0 } else { exit 1 }" :: 检查PowerShell的退出码,非0则阻止提交 if %errorlevel% neq 0 ( echo 错误:提交消息必须包含以下格式之一:>&2 echo - 关联工单:例如 [Issue:#123], [Resolves=456], [Closes 789], [Solves: 101112]>&2 echo - 无用户影响:例如 [no-ui], [NoUserImpact], [nOU-Impact]>&2 exit 1 ) :: 所有校验通过,允许提交 exit 0
关键细节解释
提交消息的完整捕获
- 用
for /f循环捕获svnlook log的输出,拼接成完整的提交消息字符串,支持多行内容。 - 启用
enabledelayedexpansion确保循环内变量拼接正常工作。
- 用
PowerShell正则逻辑
@($input) -join [Environment]::NewLine:将管道传入的每行提交消息拼接成完整的多行字符串,避免丢失换行内容。- 定义两个正则模式,分别匹配工单关联和无用户影响格式。
- 匹配成功返回
exit 0,失败返回exit 1,供批处理通过%errorlevel%判断结果。
错误输出处理
- 所有错误提示用
>&2重定向到标准错误流,确保VisualSVN能正确捕获并显示给用户。
- 所有错误提示用
注意事项
- 确保VisualSVN服务器的运行账号拥有执行PowerShell的权限(默认配置下已具备)。
- 正则表达式中的转义符无需在批处理中额外处理,PowerShell会正确解析双引号内的正则规则。
- 若需调整正则规则或最小长度要求,直接修改对应变量即可。
内容的提问来源于stack exchange,提问作者Stewart
相关产品推荐
相关产品推荐

