Domanda

Nel mio svn Pre commettere ganci che uso findstr per bloccare determinati tipi di file beign commessi. Ora voglio estendere questo alle directory, in prima istanza \ obj \ directory comunque sto avendo problemi con l'espressione regolare e fuga la \ della dir

Al momento non ho

"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

ho provato con appena \ alla fine, ma che sembra sfuggire alle virgolette come bene?

Tutte le idee?

È stato utile?

Soluzione 4

Ho risolto questo con la seguente formula.

: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

Altri suggerimenti

Empiricamente, uno dei seguenti comandi fa ciò che si vuole:

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

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

Dal momento che si è specificato /R, è necessario anche un backslash prima del . perché sarà altrimenti essere interpretato come un carattere jolly.

Nota a margine: emerge dal mio test che findstr.exe utilizza le regole di quoting un po 'strano utilizzati da biblioteca di MS C, descritti in sito web di Microsoft. In questo caso particolare, la regola pertinente è quello di ricordare che un doppio apice preceduto da un numero pari di backslash viene interpretata come metà delle barre rovesciate. (Sì, è strano, e diventa più strano se si pensa che cmd.exe tratta caratteri a doppio virgolette appositamente troppo ... Citando le cose correttamente su Windows è un mondo di dolore, francamente.)

In un'espressione regolare, backslash dovrebbe essere il doppio sfuggito ad essere correttamente interpretato in una regex Stringa:

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

Ma nel tuo caso, dal momento che il regex dovrebbe corrispondere sia i file e le directory .obj "obj", vorrei suggerire:

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

perché il vostro regex orignal ( ".obj\\") avrebbe rilevato solo directory ".obj", non "obj". Da qui la '?'

Da '' significa qualsiasi carattere, è anche necessario "\\" prima di cambiare la sua interpretazione.

Qual è l'errore che stai ricevendo?

Questa potrebbe essere una falsa pista, ma SVN utilizza / come il separatore percorso, che causa alcuni problemi sotto Windows. Ho dovuto mettere quanto segue in tutti i miei script di aggancio di cambiare / a \:

SET REPOS=%1

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

Avete veramente bisogno di un'espressione regolare in questo caso? Se sei solo alla ricerca della stringa "\ obj \" è possibile utilizzare / C invece di / R per trattare il testo come una stringa corrispondenza letterale:

{command} | findstr /C:\obj\
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top