使用 FINDSTR 在批处理文件中转义反斜杠
-
09-09-2019 - |
题
在我的 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\
不隶属于 StackOverflow