windows - شرح - ما هو ملف bat




الطابع الدفعة الهروب (3)

حرف الهروب للدفعة هو حرف الإقحام ( ^ ). إذا كنت تريد تضمين أي من أحرف خطوط الأنابيب في النص البرمجي ، فستحتاج إلى بادئة الحرف مع علامة الإقحام:

:: Won't work:
@echo Syntax: MyCommand > [file]

:: Will work:
@echo Syntax: MyCommand ^> [file]

أنا ماهرا إلى حد ما في كتابة البرامج النصية دفعة لويندوز ، ولكن حتى بعد كل هذه السنين كيف يلوح لي الحروف الهروب بشكل صحيح. من الصعب بشكل خاص عند محاولة معرفة الطريقة الصحيحة للهروب من تعبير عادي للاستخدام مع sed. هل هناك أي أداة يمكن أن تساعدني؟ ربما شيء يسمح لي باللصق في سلسلة "عادية" وينشر النسخة التي خرجت بشكل صحيح من تلك السلسلة؟

تحديث: أنا متردد في إعطاء مثال لأنني لا أبحث عن إجابة عن كيفية الهروب لسلسلة محددة. أنا أيضا لا أبحث عن حل يعمل من أجل تطبيق واحد محدد. أنا أبحث عن أداة تساعدني في الحصول على صيغة الهروب الصحيحة لكل سلسلة أحتاجها للهروب بغض النظر عن الأداة التي قد تستهلكها من سطر الأوامر.

أن يقال إن regex أريد حقا هو

(^.*)(Form Product=")([^"]*") FormType="[^"]*" FormID="([0-9][0-9]*)".*$

خذ هذا المعنى الحقيقي (أي غير ملغى بقدر ما يتعلق بـ BATCH) وقم ssed "[email protected] --- Insert escaped regex here --- @http://psph/\1/\[email protected]" "%~1" في بعض بناء الجملة مثل ssed "[email protected] --- Insert escaped regex here --- @http://psph/\1/\[email protected]" "%~1" وأخيراً تهرب منه ... مرة أخرى ، هل هناك أي أداة يمكن أن تساعد في الهروب من أي سلسلة لاستخدامها في سطر الأوامر BATCH؟

ملاحظة: هناك الكثير من الاستثناءات لالبناء الهروب من BATCH الذي سأستقر حتى على ورقة الغش الجيدة.


حل بسيط للحفاظ على جميع وسائط سطر الأوامر هو استخدام %* : تقوم بإرجاع سطر الأوامر بأكمله بدءًا من وسيطة سطر الأوامر الأولى (في Windows NT 4 ، %* يتضمن أيضًا كافة المسافات البادئة) واستبعاد أي إعادة توجيه الإخراج.


يمكنك ببساطة استخدام ملف خارجي كمدخل لسيد.

أو استخدام السلاسل مباشرة في دفعات ، من المستحسن استخدام التوسع المتأخر.

setlocal DisableDelayedExpansion
set "regEx=s/^#*$/""/g"
setlocal EnableDelayedExpansion
sed !regEx! file.txt

تحرير: كيفية استخدام سلاسل غير معدلة مع مجموعة

يستخدم هذا findstr للحصول على السلسلة مباشرة من الدُفعة وإعادتها إلى متغير النتيجة.
لذلك يمكنك استخدام سلسلة Sed كما هي.

@echo off
setlocal
REM SedString1#(^.*)(Form Product=")([^"]*") FormType="[^"]*" FormID="([0-9][0-9]*)".*$

call :GetSEDString result SedString1
setLocal EnableDelayedExpansion
echo the sedString is !result!
sed !result!
goto :eof

:GetSEDString <resultVar> <searchName>
:: Search the own batch file for <searchName> in a line with "REM <searchName>#"
:: Return all after the "#" without any modification
setLocal DisableDelayedExpansion
for /f "usebackq tokens=* delims=" %%G in (`findstr /n /c:"REM %~2#" "%~f0"`) do (
    set "str=%%G"
)
setLocal EnableDelayedExpansion
set "str=!str:*#=!"

for /F "delims=" %%A in ("!str!") DO (
  endlocal
  endlocal
  set "%~1=%%A"
  goto :eof
)

goto :eof




batch-file