Экранирование обратной косой черты в пакетном файле с помощью FINDSTR
-
09-09-2019 - |
Вопрос
В моих перехватах предварительной фиксации 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\