在我的 svn Pre commit hooks 中,我使用 findstr 来阻止提交某些文件类型。我现在想将其扩展到目录,首先是 \obj\ 目录,但是我在正则表达式和转义目录的 \ 方面遇到问题

目前我有

"C:\Program Files\VisualSVN Server\bin\svnlook.exe" changed -t %2 %1 | FindStr /R ".obj\\\"
IF %ERRORLEVEL% EQU 1 GOTO OK
echo "obj directories cannot be committed" >&2
exit 1
:OK
exit 0

我尝试过在末尾仅使用 \ 但这似乎也逃脱了双引号?

有任何想法吗?

有帮助吗?

解决方案 4

我解决了这个使用以下。

:CHECKOBJDIRWITHFILES
"C:\Program Files\VisualSVN Server\bin\svnlook.exe" changed -t %2 %1  > "C:\Repositories\SoftwareRepository\hooks\out.txt"
"C:\Program Files\VisualSVN Server\bin\svnlook.exe" changed -t %2 %1 | FindStr /R ./obj/.
echo %ERRORLEVEL% > "C:\Repositories\SoftwareRepository\hooks\error.txt"
IF %ERRORLEVEL% EQU 1 GOTO CHECKOBJDIRWITHOUTFILES
echo "obj directories and their files cannot be committed" >&2
exit 1
:CHECKOBJDIRWITHOUTFILES
"C:\Program Files\VisualSVN Server\bin\svnlook.exe" changed -t %2 %1  > "C:\Repositories\SoftwareRepository\hooks\out.txt"
"C:\Program Files\VisualSVN Server\bin\svnlook.exe" changed -t %2 %1 | FindStr /R ./obj
echo %ERRORLEVEL% > "C:\Repositories\SoftwareRepository\hooks\error.txt"
IF %ERRORLEVEL% EQU 1 GOTO OK
echo "obj directories cannot be committed" >&2
exit 1
:OK
echo %ERRORLEVEL%  >&2
exit 0

其他提示

根据经验,以下任一命令都可以满足您的要求:

... | findstr /R \.obj\\

... | findstr /R "\.obj\\\\"

既然你指定了 /R, ,在之前还需要一个反斜杠 . 因为否则它会被解释为通配符。

边注:从我的测试来看,findstr.exe 使用了 MS 的 C 库所使用的有点奇怪的引用规则,描述于 微软的网站. 。在这种特殊情况下,相关规则提到,前面有偶数个反斜杠的双引号字符被解释为反斜杠数的一半。(是的,这很奇怪,当您意识到 cmd.exe 也特别对待双引号字符时,情况会变得更奇怪......坦率地说,在 Windows 上正确引用事物是一个痛苦的世界。)

在一个正则表达式,反斜线应该是双逃到在字符串的正则表达式被正确解释:

FindStr /R "\\.obj\\\\"

但在你的情况,因为你的正则表达式应该同时匹配.obj文件和“obj”目录,我建议:

FindStr /R "\\.?obj\\\\?"

由于您的一部开拓创新的正则表达式(“.obj\\”)将只检测到“.obj”目录,而不是“obj”。因此, '?'

由于 ''指任何字符,你还需要“\\”它改变它的解释之前。

什么是你得到的错误?

这可以是红色鲱鱼,但SVN使用/作为路径分隔符,这将导致在Windows下的一些问题。我只好把下面在我所有的钩子脚本改变/\

SET REPOS=%1

:: Transform forward-slashes to back-slashes for Windows
SET REPOS=%REPOS:/=^\%

你确实有必要在这种情况下,正则表达式?如果你只是搜索的字符串“\ OBJ \”你可以利用/℃,而不是/ R的文字当作一个字面匹配字符串:

{command} | findstr /C:\obj\
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top