You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在批处理中调用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

关键细节解释

  1. 提交消息的完整捕获

    • 用for /f循环捕获svnlook log的输出,拼接成完整的提交消息字符串,支持多行内容。
    • 启用enabledelayedexpansion确保循环内变量拼接正常工作。
  2. PowerShell正则逻辑

    • @($input) -join [Environment]::NewLine:将管道传入的每行提交消息拼接成完整的多行字符串,避免丢失换行内容。
    • 定义两个正则模式,分别匹配工单关联和无用户影响格式。
    • 匹配成功返回exit 0,失败返回exit 1,供批处理通过%errorlevel%判断结果。
  3. 错误输出处理

    • 所有错误提示用>&2重定向到标准错误流,确保VisualSVN能正确捕获并显示给用户。

注意事项

  • 确保VisualSVN服务器的运行账号拥有执行PowerShell的权限(默认配置下已具备)。
  • 正则表达式中的转义符无需在批处理中额外处理,PowerShell会正确解析双引号内的正则规则。
  • 若需调整正则规则或最小长度要求,直接修改对应变量即可。

内容的提问来源于stack exchange,提问作者Stewart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:23:21