Frage

In meinem svn Pre verpflichten Haken ich findstr verwenden, um bestimmte Dateitypen zu blockieren begangen beign. Ich möchte nun dieses auf Verzeichnisse erweitern, in der ersten Instanz \ obj \ Verzeichnisse aber ich Probleme mit dem regulären Ausdruck habe und Flucht aus dem \ den dir

Zur Zeit habe ich

"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

Ich habe am Ende mit nur \ versucht, aber das scheint die doppelten Anführungszeichen als auch zu entkommen?

Irgendwelche Ideen?

War es hilfreich?

Lösung 4

Ich löste dies die folgende Verwendung.

: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

Andere Tipps

Empirisch eine der beiden folgenden Befehle tut, was Sie wollen:

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

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

Da Sie /R angegeben, müssen Sie auch einen umgekehrten Schrägstrich vor dem ., weil es sonst als Platzhalter interpretiert werden.

Randbemerkung: es scheint aus meinen Tests, die findstr.exe die etwas seltsamen zitierte Regeln von MS des C-Bibliothek verwendet wird, verwendet, auf Microsoft-Website . In diesem speziellen Fall ist die entsprechende Regel derjenige zu erwähnen, dass ein doppeltes Anführungszeichen durch eine gerade Anzahl von Schrägstrichen vorangestellt ist halb so viele Schrägstriche zu interpretieren. (Ja, es ist seltsam, und es wird seltsamer, wenn man bedenkt, dass cmd.exe speziell auch doppelte Anführungszeichen behandelt ... Dinge richtig auf Windows ist eine Welt des Schmerzes Zitiert, ehrlich gesagt.)

In einem regexp sollte Backslash sein entkam doppelt korrekt in einem String Regex interpretiert werden:

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

Aber in Ihrem Fall, da Ihre regex beide .obj Dateien entsprechen sollte und „obj“ Verzeichnisse, würde ich vorschlagen:

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

, weil Ihre Orignal regex ( ".obj\\") habe nur erkannt ".obj" Verzeichnis, nicht "obj". Daraus ergibt sich die '?'

Seit '' bedeutet ein beliebiges Zeichen, die Sie brauchen „\\“ auch, bevor er seine Interpretation zu ändern.

Was ist der Fehler, Sie bekommen?

Dies kann eine falsche Fährte sein, aber SVN verwendet / als Pfad seperator, die einige Probleme unter Windows verursacht. Ich hatte die folgenden in allen meinen Hook-Scripts setzen / zu ändern \:

SET REPOS=%1

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

Sie benötigen tatsächlich einen regulären Ausdruck in diesem Fall? Wenn Sie nur für die Teilzeichen searching „\ obj \“ können Sie / C statt / R den Text als eine wörtliche Übereinstimmung Zeichenfolge zu behandeln:

{command} | findstr /C:\obj\
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top