2009-02-26 9 views
2

Dans mes raccourcis svn Pre commit, j'utilise findstr pour bloquer certains types de fichiers validés par beign. 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 dirEchappement d'une barre oblique inverse dans un fichier batch à l'aide de FINDSTR

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 

j'ai essayé avec juste \ à la fin, mais cela semble échapper à la double guillemets aussi bien?

Des idées?

Répondre

1

Je résolus 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 
+0

pas de devis! (autour de l'expression régulière de FINDSTR) Brilliant ;-) +1 – VonC

+0

Pourquoi ne pas utiliser% VISUALSVN_SERVER% variable d'environnement? – bahrep

1

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

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

Mais dans votre cas, puisque votre regex doit correspondre à la fois .obj fichiers et répertoires « obj », je suggère:

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

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

Depuis '.' signifie n'importe quel caractère, vous avez également besoin de "\\" avant de changer son interprétation.

+0

En raison des règles étranges soumissionnez, vos exemples ne travail - vous devez doubler le nombre de barres obliques inverses avant tout caractère de guillemets doubles.En outre, vous devriez mettre une barre oblique inverse avant le "." pour indiquer qu'il devrait être traité littéralement, plutôt que comme un joker. –

+0

Certes, j'ai mis à jour la réponse – VonC

+0

Vous n'avez pas testé cela. Le backslash avant le "." doit être un backslash * simple *, et les 4 antislashs à la fin deviennent 2 si vous ajoutez un "?" avant la dernière double-citation. Les règles de citation sont assez étranges, je vous l'accorde. –

3

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.

Note de côté: il ressort de mes tests que findstr.exe utilise les règles de citation quelque peu étranges utilisées par la bibliothèque C de MS, décrites au Microsoft's website. Dans ce cas particulier, la règle pertinente est celle mentionnant qu'un caractère de guillemets précédé d'un nombre pair de barres obliques inverses est interprété comme étant deux fois moins de barres obliques inverses. (Oui, c'est bizarre, et ça devient plus bizarre quand vous réalisez que cmd.exe traite les caractères de guillemets aussi spécialement ... Citer les choses correctement sur Windows est un monde de douleur, franchement.)

+0

Plus précis regexp (J'ai mis à jour ma propre réponse). +1 – VonC

1

Quelle est l'erreur? Revenir?

Cela peut être un reflet rouge, mais SVN utilise / comme séparateur de chemin d'accès, ce qui provoque certains 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:/=^\% 
0

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\ 
Questions connexes