Escapando uma barra invertida no arquivo em lotes usando FINDSTR
-
09-09-2019 - |
Pergunta
Na minha svn Pré cometer ganchos eu uso findstr para bloquear certos tipos de arquivo beign cometido. Agora eu quero estender isso para diretórios, em primeira instância \ obj \ diretórios no entanto eu estou tendo problemas com a expressão regular e escapando a \ do dir
Atualmente tenho
"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
Eu tentei com apenas \ no final, mas que parece escapar as aspas duplas bem?
Alguma idéia?
Solução 4
Eu resolvi isso usando o seguinte.
: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
Outras dicas
Empiricamente, um dos seguintes comandos faz o que quiser:
... | findstr /R \.obj\\
... | findstr /R "\.obj\\\\"
Uma vez que você especificou /R
, você também precisa de um barra invertida antes do .
porque, caso contrário, ser interpretado como um carácter universal.
Nota lateral: parece de meus testes que usos Findstr.exe as regras citando um pouco estranhas utilizadas por biblioteca C do MS, descrito em da Microsoft site . Neste caso específico, a regra em questão é a mencionar que um caractere de aspas duplas precedido por um número par de barras invertidas é interpretado como metade do número de barras invertidas. (Sim, é estranho, e fica mais estranho quando você percebe que cmd.exe trata caracteres de aspas duplas especialmente também ... Citando as coisas corretamente no Windows é um mundo de dor, francamente.)
Em um regexp, barra invertida devem ser dupla escapou de ser correctamente interpretada de regex Cadeia:
FindStr /R "\\.obj\\\\"
Mas no seu caso, uma vez que seu regex deve corresponder ambos os arquivos e diretórios .obj
"obj
", gostaria de sugerir:
FindStr /R "\\.?obj\\\\?"
porque seu regex orignal ( ".obj\\
") apenas teria detectado ".obj
" diretório, não "obj
". Daí a '?
'
Uma vez que ''. meios qualquer personagem, você também precisa "\\
" antes de mudar a sua interpretação.
O que é o erro que você está recebendo?
Este pode ser um arenque vermelho, mas SVN usa /
como o seperator caminho, o que faz com que alguns problemas no Windows. Eu tive que colocar o seguinte em todos os meus scripts de gancho para a mudança /
para \
:
SET REPOS=%1
:: Transform forward-slashes to back-slashes for Windows
SET REPOS=%REPOS:/=^\%
Você realmente precisa de uma expressão regular neste caso? Se você está apenas procurando o substring "\ obj \" você pode usar / C, em vez de / R para tratar o texto como uma string literal jogo:
{command} | findstr /C:\obj\