Экранирование обратной косой черты в командном файле с использованием FINDSTR - PullRequest
3 голосов
/ 26 февраля 2009

В моих хуках svn Pre commit я использую findstr для блокировки определенных типов файлов beign commit. Теперь я хочу распространить это на каталоги, в первую очередь на каталоги \ 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

Я пробовал только с \ в конце, но это, кажется, также избегает двойных кавычек?

Есть идеи?

Ответы [ 5 ]

3 голосов
/ 26 февраля 2009

Эмпирически, любая из следующих команд делает то, что вы хотите:

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

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

Поскольку вы указали /R, вам также потребуется обратная косая черта перед ., так как в противном случае он будет интерпретироваться как подстановочный знак.

Примечание: из моих тестов выясняется, что findstr.exe использует несколько странные правила цитирования, используемые библиотекой C MS, описанные на веб-сайте Microsoft . В этом конкретном случае соответствующим правилом является упоминание о том, что символ двойной кавычки, которому предшествует четное число обратных косых черт, интерпретируется как вдвое меньше обратных косых черт. (Да, это странно, и становится еще более странным, когда вы понимаете, что cmd.exe также обрабатывает символы двойных кавычек, особенно ... Правильное цитирование в Windows - это, конечно, боль, правда.)

1 голос
/ 26 февраля 2009

Я решил это, используя следующее.

: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
1 голос
/ 26 февраля 2009

Какую ошибку вы получаете?

Это может быть красная сельдь, но SVN использует / в качестве разделителя пути, что вызывает некоторые проблемы в Windows. Мне пришлось добавить во все мои скрипты ловушек следующее, чтобы изменить / на \:

SET REPOS=%1

:: Transform forward-slashes to back-slashes for Windows
SET REPOS=%REPOS:/=^\%
1 голос
/ 26 февраля 2009

В регулярном выражении обратный слеш должен быть дважды экранирован, чтобы правильно интерпретироваться в регулярном выражении String:

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

Но в вашем случае, поскольку ваше регулярное выражение должно совпадать с .obj файлами и каталогами "obj", я бы предложил:

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

потому что ваше регулярное выражение (".obj\\") обнаружило бы только каталог ".obj", а не "obj". Отсюда '?'

С '.' означает любой символ, вам также нужно "\\", чтобы изменить его интерпретацию.

0 голосов
/ 23 августа 2009

Вам действительно нужно регулярное выражение в этом случае? Если вы просто ищете подстроку "\ obj \", вы можете использовать / C вместо / R, чтобы обработать текст как строку с литеральным соответствием:

{command} | findstr /C:\obj\
...