FINDSTRを使用してバッチファイルでバックスラッシュをエスケープ
-
09-09-2019 - |
質問
私のsvnで前私が犯しbeign特定の種類のファイルをブロックするためにfindstrの使用フックをコミットします。 私は正規表現に問題があるとdirの\
をエスケープしていますが、私は今、OBJ \ディレクトリ\最初のインスタンスでは、ディレクトリにこれを拡張したいです現在、私が持っている
"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
私は最後に\を試してみましたが、それは同様に二重引用符をエスケープするようですか?
任意のアイデア?
解決 4
私は次のように使用して、これを解決しました。
: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
他のヒント
経験的には、次のいずれかのコマンドは、あなたが欲しいものを行います。
... | findstr /R \.obj\\
... | findstr /R "\.obj\\\\"
あなたは/R
を指定したので、それはそれ以外の場合は、ワイルドカード文字として解釈されますので、あなたも.
の前にバックスラッシュを必要とします。
サイドノート:それは<のhref = "http://msdn.microsoft.com/en-us/library/に説明findstr.exeはMSのCライブラリで使用されるやや奇妙な引用規則を使用しています私のテストから表示されますa1y7w461.aspx」のrel = "nofollowをnoreferrer"> MicrosoftのWebサイトに。この特定のケースでは、関連するルールは、バックスラッシュの偶数が先行二重引用符は、半分のような多くのバックスラッシュであると解釈されることを言及するものです。 (はい、それは奇妙だ、とあなたはcmd.exeの特別あまりにも二重引用符文字を扱います... Windows上で適切なものを引用することは率直に言って、痛みの世界であることを認識したときに、それは奇妙取得します。)
正規表現では、バックスラッシュは、二重正しく文字列の正規表現で解釈されるようにエスケープする必要があります:
FindStr /R "\\.obj\\\\"
しかし、あなたの正規表現は.obj
ファイルと「obj
」ディレクトリの両方に一致する必要がありますので、あなたのケースでは、私がお勧めします:
FindStr /R "\\.?obj\\\\?"
あなたのorignal正規表現( ".obj\\
")は、唯一の ".obj
" ディレクトリではなく、 "obj
" を検出していたので。したがって、 '?
'
以来 ''それはその解釈を変更する前に、任意の文字は、あなたも「\\
を」必要があることを意味します。
あなたが取得しているエラーは何ですか?
これは赤ニシンかもしれませんが、SVNはWindowsでいくつかの問題が発生し、パスの区切り文字として/
を使用しています。私は/
する\
を変更するためにすべての私のフックスクリプトに次のように入れていた。
SET REPOS=%1
:: Transform forward-slashes to back-slashes for Windows
SET REPOS=%REPOS:/=^\%
あなたが実際にこの場合の正規表現は必要ですか?
:あなただけの「\ OBJ \」あなたはリテラル一致文字列としてテキストを処理する代わりに、/ Rの/ Cを使用することができ、サブストリングを探しているなら{command} | findstr /C:\obj\