3

在我的 svn Pre commit 钩子中,我使用 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

6 回答 6

3

根据经验,以下任一命令都可以执行您想要的操作:

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

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

由于您指定/R了 ,因此您还需要在 the 之前添加一个反斜杠,.否则它将被解释为通配符。

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

于 2009-02-26T15:07:51.633 回答
1

在正则表达式中,反斜杠应该被双重转义以在字符串正则表达式中正确解释:

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

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

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

因为您的原始正则表达式(“ .obj\\”)只会检测到“ .obj”目录,而不是“ obj”。因此' ?'

自从 '。' 表示任何字符,您还需要\\在它之前添加“”来更改其解释。

于 2009-02-26T14:44:10.770 回答
1

你得到什么错误?

这可能是一个红鲱鱼,但SVN/用作路径分隔符,这会导致Windows下的一些问题。我必须在所有钩子脚本中添加以下内容才能更改/\

SET REPOS=%1

:: Transform forward-slashes to back-slashes for Windows
SET REPOS=%REPOS:/=^\%
于 2009-02-26T15:19:17.753 回答
1

我使用以下方法解决了这个问题。

: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
于 2009-02-26T16:46:54.987 回答
0

在这种情况下你真的需要一个正则表达式吗?如果您只是搜索子字符串“\obj\”,则可以使用 /C 而不是 /R 将文本视为文字匹配字符串:

{command} | findstr /C:\obj\
于 2009-08-22T20:38:23.317 回答
0

在 findstr 由两个字符序列组成的情况下,\"搜索字符串必须是\\\\"(四个反斜杠)。

于 2021-04-12T08:05:27.400 回答