سؤال

في My SVN Pre Worn Hooks، أستخدم FindSstr لمنع أنواع الملفات التي ارتكبتها بعض أنواع الملفات. أرغب الآن في تمديد هذا الأمر إلى الدلائل، في المقال الأول obj directory، لكن لدي مشاكل في التعبير العادي والهروب من من Dir

حاليا لدي

"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, ، تحتاج أيضا إلى الخلفية قبل . لأنه سيتم تفسيره على أنه حرف بدل.

ملاحظة جانبية: يبدو من اختباراتي التي يستخدمها FindStr.exe قواعد اقتباس غريبة إلى حد ما المستخدمة من قبل مكتبة MS's C، الموصوفة موقع مايكروسوفت. وبعد في هذه الحالة بالذات، فإن القاعدة ذات الصلة هي الواحدة التي تذكر أن حرف اقتباس مزدوج يسبقه عددا من الخلفية يتم تفسيره هو نصف كثيرة. (نعم، إنه غريب، ويحصل على Weirder عند إدراك أن CMD.EXE يعالج أحرفا مزدوجة الاقتباس خصيصا أيضا ... نقلا عن الأشياء بشكل صحيح على Windows هو عالم من الألم، بصراحة.)

في regexp، يجب أن يكون الخلفية المزدوجة مضاعفة لتفسيرها بشكل صحيح في سلسلة Regex:

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

ولكن في حالتك، نظرا لأن Regex الخاص بك يجب أن تتطابق .obj الملفات و "obj"الدلائل، أود أن أقترح:

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

لأن regex orignal الخاص بك (".obj\\") قد اكتشفت فقط".obj"الدليل، وليس"obj". وبالتالي"?'

حيث '.' يعني أي شخصية، تحتاج أيضا "\\"قبل ذلك لتغيير تفسيرها.

ما الخطأ الذي تحصل عليه؟

قد يكون هذا رنجة حمراء، لكن SVN يستخدم / كمسار Seperator، مما يؤدي إلى بعض المشاكل تحت Windows. اضطررت إلى وضع ما يلي في جميع البرامج النصية الخاصة بي للتغيير / ل \:

SET REPOS=%1

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

هل تحتاج فعلا إلى تعبير منتظم في هذه الحالة؟ إذا كنت تبحث فقط عن Substring " obj " يمكنك استخدام / c بدلا من / r لعلاج النص كسلسلة مطابقة حرفية:

{command} | findstr /C:\obj\
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top