Question

Dans mon svn avant de commettre des crochets que j'utilise findstr pour bloquer certains types de fichiers beign engagés. Je veux maintenant l'étendre aux répertoires, en première instance \ obj \ répertoires mais je rencontre des problèmes avec l'expression régulière et Echapper à la \ du répertoire

Actuellement je

"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

Je l'ai essayé avec juste \, à la fin, mais qui semble échapper aux guillemets doubles aussi bien?

Des idées?

Était-ce utile?

La solution 4

Je résolu ce problème en utilisant ce qui suit.

: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

Autres conseils

Empiriquement, l'une des commandes suivantes fait ce que vous voulez:

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

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

Depuis que vous avez spécifié /R, vous avez également besoin d'une barre oblique inverse avant le . car il autrement interprété comme un caractère générique.

Side note: il ressort de mes tests que findstr.exe utilise les règles un peu étranges citant utilisées par la bibliothèque de MS C, décrites sur site web de Microsoft . Dans ce cas particulier, la règle pertinente est celle de mentionner qu'un double guillemet précédé d'un nombre pair de antislashs est interprété comme la moitié autant antislashs. (Oui, il est bizarre, et il devient plus étrange quand on sait que cmd.exe traite les caractères à double citation spécialement trop ... les choses correctement sur Citation Windows est un monde de douleur, franchement.)

Dans une expression rationnelle, backslash devrait être le double échappé à interpréter correctement dans une chaîne regex:

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

Mais dans votre cas, puisque votre regex doit correspondre à la fois des fichiers et des répertoires .obj « de obj », je dirais:

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

parce que votre Orignal regex ( ".obj\\") n'aurait détecté répertoire ".obj", pas "obj". D'où le '?'

Depuis '' signifie tout caractère, vous avez aussi besoin « \\ » avant de changer son interprétation.

Quelle est l'erreur que vous obtenez?

Cela peut être un hareng rouge, mais SVN utilise / comme le chemin seperator, ce qui provoque des problèmes sous Windows. Je devais mettre ce qui suit dans tous mes scripts crochet pour changer / à \:

SET REPOS=%1

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

Avez-vous réellement besoin d'une expression régulière dans ce cas? Si vous êtes juste la recherche de la sous-chaîne « \ obj \ » vous pouvez utiliser / C au lieu de / R pour traiter le texte comme une chaîne de correspondance littérale:

{command} | findstr /C:\obj\
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top