Экранирование обратной косой черты в пакетном файле с помощью FINDSTR

StackOverflow https://stackoverflow.com/questions/590748

Вопрос

В моих перехватах предварительной фиксации svn я использую findstr для блокировки не зафиксированных определенных типов файлов.Теперь я хочу распространить это на каталоги, в первом экземпляре \obj \ directories однако у меня возникают проблемы с регулярным выражением и экранированием \ из каталога

В настоящее время у меня есть

"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.Мне пришлось включить следующее во все мои скрипты hook, чтобы изменить / Для \:

SET REPOS=%1

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

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

{command} | findstr /C:\obj\
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top