2009-02-26 7 views
2

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

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

"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 

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

Любые идеи?

ответ

1

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

: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 
+0

нет кавычек! (вокруг регулярного выражения FINDSTR) Brilliant ;-) +1 – VonC

+0

Почему бы не использовать переменную среды% VISUALSVN_SERVER%? – bahrep

1

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

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

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

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

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

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

+0

Из-за странное котирование правил, ваши примеры не будут работа - вам нужно удвоить количество обратных косых черт перед любым символом двойной кавычки.Кроме того, перед «.» Следует поместить обратную косую черту. чтобы указать, что это следует рассматривать буквально, а не как шаблон. –

+0

Правда, я обновил ответ – VonC

+0

Вы не испытали это. Обратная косая черта перед "." должен быть * одиночным * обратным слэшем, а 4 обратных косых черт в конце становятся 2, если вы добавляете «?» перед окончательной двойной кавычкой. Правила цитирования довольно странные, я вам даю. –

3

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

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

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

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

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

+0

Более точное регулярное выражение (у меня есть собственный ответ). +1 – VonC

1

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

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

SET REPOS=%1 

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

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

{command} | findstr /C:\obj\ 

 Смежные вопросы

  • Нет связанных вопросов^_^