سؤال

كيف يمكنني أن أذهب حول استبدال كل علامات الاقتباس المزدوجة في معلمات ملف دفعة بلدي مع اقتباسات مزدوجة هرب؟ هذا هو ملف الدفعي الحالي، الذي يوسع جميع معلمات سطر الأوامر داخل السلسلة:

@echo off
call bash --verbose -c "g++-linux-4.1 %*"

ثم يستخدم هذه السلسلة لإجراء مكالمة إلى Bash Cygwin's Bash، قم بتنفيذ برنامج Linux Cross-compiler. لسوء الحظ، أحصل على معلمات مثل هذه مرت في ملف الدفعي الخاص بي:

"launch-linux-g++.bat" -ftemplate-depth-128 -O3 -finline-functions 
-Wno-inline -Wall  -DNDEBUG   -c 
-o "C:\Users\Me\Documents\Testing\SparseLib\bin\Win32\LinuxRelease\hello.o" 
"c:\Users\Me\Documents\Testing\SparseLib\SparseLib\hello.cpp"

عندما يكون الاقتباس الأول حول المسار الأول الذي تم تمريره مسبقا في إنهاء السلسلة التي يتم تمريرها مسبقا إلى دول مجلس التعاون الخليجي، وتمرير بقية المعلمات مباشرة إلى Bash (والتي تفشل بشكل مذهل.)

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

هل كانت مفيدة؟

المحلول 3

جاءت Google في النهاية مع الإجابة. بناء الجملة لاستبدال السلسلة في دفعة هو هذا:

set v_myvar=replace me
set v_myvar=%v_myvar:ace=icate%

التي تنتج "تكرار لي". يبدو النصي الآن مثل هذا:

@echo off
set v_params=%*
set v_params=%v_params:"=\"%
call bash -c "g++-linux-4.1 %v_params%"

الذي يحل محل جميع مثيلات " مع \", ، هرب بشكل صحيح من أجل باش.

نصائح أخرى

شخصية الهروب في البرامج النصية الدفعية هي ^. وبعد ولكن للحصول على سلاسل مزدوجة نقلت، مضاعفة الاقتباسات:

"string with an embedded "" character"

إجابة إي إيبرليس الخاصة ببساطة وحل فعليا مشكلته المحددة: يستبدل الجميع " مثيلات في قائمة الحجة بأكملها مع \", ، وهذا هو كيف يتطلب bash علامات اقتباس مزدوجة داخل سلسلة مزدوجة يتم تمثيلها.

للإجابة عموما على مسألة كيفية الهروب من الاقتباسات المزدوجة داخل سلسلة مزدوجة المعالجة باستخدام cmd.exe, ، مترجم سطر أوامر Windows (سواء في سطر الأوامر - لا يزال في كثير من الأحيان يسمى خطأ "موجه DOS" - أو في ملف دفعي):انظر أسفل لإلقاء نظرة على Powershell..

TL؛ دكتور:

  • أنت يجب استعمال "" عند تمرير سلسلة إلى آخر) ملف دفعة وأنت مايو استعمال "" مع التطبيقات التي تم إنشاؤها مع مايكروسوفتC / C ++ /. الشبكات التحويل البرمجيات (أي أيضا قبول \")، والتي على ويندوز يشمل بيثون و node.js:

    • مثال: foo.bat "We had 3"" of rain."

    • ينطبق ما يلي على ملفات الدفعات فقط:

      • "" هي الطريقة الوحيدة للحصول على مترجم القيادة (cmd.exe) لعلاج سلسلة كاملة مزدوجة كما هو غير مرتبطة جدال.

      • للأسف، ومع ذلك، لا يتم الاحتفاظ بالقلقات المزدوجة المرفقة فقط (كالمعتاد)، ولكن، وكذلك المضاعفة الهاربين، لذلك الحصول على السلسلة المقصودة هي عملية من خطوتين؛ على سبيل المثال، على افتراض أن السلسلة المزدوجة المقتبسة يتم تمريرها كوسيطة 1، %1:

      • set "str=%~1" يزيل الاقتباسات المرفوعة مزدوجة؛ set "str=%str:""="%" ثم يحول تضاعف الاقتباسات المزدوجة إلى واحد منها.
        تأكد من استخدام أرفق اقتباسات مزدوجة حول أجزاء المهمة لمنع التفسير غير المرغوب فيه للقيم.

  • \" يكون مطلوب - كما الخيار الوحيد - من خلال العديد من البرامج الأخرى, ، (على سبيل المثال، روبي، بيرل، وحتى PowerShell الخاص بشركة Microsoft (!))، ولكن استخدامها غير آمن:

    • \" هو ما العديد من الملفات التنفيذية والمترجمين الفوريين أيضا يتطلب - بما في ذلك PowerShell الخاص بشركات مايكروسوفت عند مرت الأوتار من الخارج - أو، في حالة محامرة مايكروسوفت، الدعم كبديل ل "" - في نهاية المطاف، رغم ذلك، الأمر متروك للبرنامج المستهدف لتحليل قائمة الحجة.
      • مثال: foo.exe "We had 3\" of rain."
    • ومع ذلك، استخدام \" يمكن أن يؤدي إلى تنفيذ غير مرغوب فيه أو التعسفي للأوامر و / أو الإدخال / الإخراج:
      • الأحرف التالية تقدم هذا الخطر: & | < >
      • على سبيل المثال، النتائج التالية في التنفيذ غير المقصود لل ver أمر؛ انظر مزيد من الوظائف أدناه للحصول على تفسير ونقطة الرصاصة التالية لحل الحل البديل:
        • foo.exe "3\" of snow" "& ver."
    • بالنسبة Powershell. على شبابيك, \"" و "^"" هي بدائل قوية ولكن محدودة (انظر القسم "استدعاء CLI PowerShell ..." أدناه).
  • إذا يجب عليك استخدام \", ، هناك فقط 3 آمنة اقتراب, ، والتي هي، ولكن مرهقة جدا: غيض من القبعة تات لمساعدته.

    • باستخدام (ربما انتقائي) تأخر التوسع المتغير في ملف الدفع الخاص بك، يمكنك تخزين الحرفي \" في عامل والرجوع إلى هذا المتغير داخل "..." سلسلة باستخدام !var! بناء الجملة - يرى الجواب المفيد TS.

      • النهج أعلاه، على الرغم من كونه مرهقا، لديه ميزة يمكنك تطبيقه بطريقة منهجية وأنه يعمل بقوة, مع أي مدخلات.
    • فقط مع السلاسل الحرفية - تلك التي لا تنطوي على المتغيرات - هل تحصل على نهج منهجي مماثل: بشكل قاطع ^-هرب الكل cmd.exe metacharacters: " & | < > و - إذا كنت ترغب أيضا في قمع التوسع المتغير - %:
      foo.exe ^"3\^" of snow^" ^"^& ver.^"

    • خلاف ذلك، يجب عليك صياغة سلسلة الخاص بك بناء على الاعتراف بأجزاء من السلسلة cmd.exe تعتبر غير محدد بسبب سوء التفسير \" كما ختام المحددات:

      • في حرفي أجزاء تحتوي على metacharacters قذيفة: ^-إرسالها باستخدام المثال أعلاه، هو & يجب ان يكون ^- التسجيل:
        foo.exe "3\" of snow" "^& ver."

      • في الأجزاء مع %...%المراجع المتغيرة -Style.: ضمان cmd.exe تعتبرهم جزءا من "..." سلسلة و أن القيم المتغيرة لا تحتوي أنفسهم على اقتباسات غير متوازنة - التي ليست ممكنة دائما.

للحصول على معلومات أساسية، اقرأ على.


خلفية

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

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

على النقيض من ذلك، يبدو أن مترجم نظام Windows لا يشبه تزيين قائمة الوسيطة ويمرر ببساطة غير مرتبطة سلسلة تضم الكل الحجج - بما في ذلك نقلا عن الأحرف. - إلى البرنامج المستهدف.
ومع ذلك، بعض تتم معالجة المسبق قبل أن يتم تمرير السلسلة الفردية إلى البرنامج المستهدف: ^ الهروب من chars. تتم إزالة سلاسل مزدوجة مقتبسة (يهربون من السحر التالي.)، والمراجع المتغيرة (على سبيل المثال، %USERNAME%) نكون interpolited أول.

وبالتالي، على عكس UNIX، فإن مسؤولية البرنامج المستهدف لتحليل تحليل سلسلة الحجج وتقسيمها إلى حجج فردية تتم إزالتها. هكذا، يمكن أن تتطلب البرامج المختلفة بشكل افتراضي طرق مختلفة و لا توجد آلية فرز واحدة مضمون للعمل مع جميع البرامج - https://stackoverflow.com/a/4094897/45375. يحتوي على خلفية ممتازة على الفوضى الذي هو تحليل سطر الأوامر Windows.

في التمرين، \" شائع جدا، ولكن غير آمن, ، كما ذكر أعلاه:

حيث cmd.exe نفسه لا يتعرف \" كما هرب اقتباس مزدوج، يمكن أن تؤدي إلى سوء فهم الرموز في وقت لاحق في سطر الأوامر كما غير محدد ويحتمل أن يفسرهم كما أوامر و / أو توجيهات الإدخال / الإخراج.
باختصار: الأسطح المشكلة، إذا اتبع أي من الأحرف التالية فتح أو غير متوازن \": & | < >; ؛ علي سبيل المثال:

foo.exe "3\" of snow" "& ver."

cmd.exe يرى الرموز التالية، الناتجة عن سوء تفسير \" كقسم مزدوج منتظم:

  • "3\"
  • of
  • snow" "
  • راحة: & ver.

حيث cmd.exe يعتقد أن & ver. يكون غير محدد, ، يفسر ذلك & (مشغل التسلسل الأمريكي)، تليها اسم أمر لتنفيذ (ver. - ال . يتم تجاهلها؛ ver إقرار cmd.exeمعلومات الإصدار).
التأثير العام هو:

  • أولا، foo.exe يتم استدعاء مع الأول 3 الرموز فقط.
  • ثم، القيادة ver يتم تنفيذ.

حتى في الحالات التي لا تضر فيها الأمر العرضي أي ضرر، لن يعمل الأمر العام كصمما، بالنظر إلى أن جميع الحجج يتم تمريرها إليها.

العديد من المترجمين / المترجمين الفوريين تعترف فقط \" - على سبيل المثال، مترجم GNU C / C ++، Python، Perl، Ruby، حتى PowerShell الخاصة ب Microsoft عند الاحتجاج من cmd.exe - و، باستثناء Powershell مع \"", ، بالنسبة لهم لا يوجد حل بسيط لهذه المشكلة.
في الأساس، عليك أن تعرف مقدما، أي أجزاء من سطر الأوامر تسيء تفسيرها على أنها غير مستفادة، وعلى ^- سكيب كل مثيلات & | < > في تلك الأجزاء.

على نقيض ذلك، استخدام "" آمن, ، لكن هو للأسف المدعوم فقط من الملفات التنفيذية القائمة على Microsoft-Compiler وملفات الدفعات (في حالة ملفات الدفعات، مع ناقش Quirks أعلاه)، والتي لا تستثني ملحوظ Powershell. - انظر القسم التالي.


استدعاء كلي باورشيل من cmd.exe أو قذائف مثل posix:

ملاحظة: انظر القسم السفلي لكيفية التعامل مع الاقتباس في داخل Powershell.

Powershell., ، عند الاحتجاج من الخارج - على سبيل المثال، من cmd.exe, ، سواء من سطر الأوامر أو ملف دفعي - تعترف. فقط \" وعلى ويندوز أيضا """ وأكثر قوة \"" / "^"" (رغم أن داخليا يستخدم Powershell. ` كما شخصية الهروب في سلاسل مزدوجة ونقلت كما تقبل "" - انظر القسم السفلي):

على شبابيك, ، الاتصال من cmd.exe / ملف دفعي:

  • "" فرامل, ، لأنه غير مدعوم بشكل أساسي:

    • powershell -c " ""ab c"".length " -> خطأ "السلسلة مفقودة المنهي"
  • \" و """ الشغل في المبدأ, ، ولكن ليست كذلك آمنة:

    • powershell -c " \"ab c\".length " يعمل كما المقصود: مخرجات 5 (لاحظ ال 2 المساحات)
    • لكنها ليست آمنة، ل cmd.exe Metacharacters كسر الأمر، ما لم يكن هرب:
      powershell -c " \"a& c\".length " فرامل, ، بسبب &, ، والتي يجب أن تهرب كما ^&
  • \"" يكون آمنة, ، لكن تطبيع بيضاء داخلية, ، والتي يمكن أن تكون غير مرغمة:

    • powershell -c " \""a& c\"".length " المخرجات 4(!)، لأن المسافاتتين تطبيعها إلى 1.
  • "^"" هو الخيار الأفضل ل نوافذ Powershell. خاصة, ، حيث هو كل من الحفاظ على المسبق، لكن مع Powershell. النواة (على ويندوز) هو نفسه \"", ، أي Whitespace-تطبيع. وبعد الائتمان يذهب إلى Venryx. لاكتشاف هذا النهج.

    • powershell -c " "^""a& c"^"".length " ويعمل: لا يكسر - على الرغم من & - و المخرجات 5, ، أي، المسافة المحفوظة بشكل صحيح بيضاء.

    • Powershell. النواة: pwsh -c " "^""a& c"^"".length " ويعمل, ، ولكن النواتج 4, ، بمعنى آخر تطبيع Whitespace., ، كما \"" هل.

على منصات مثل UNIX (لينكس، ماكوس)، الاتصال Powershell. النواةCLI، pwsh من قذيفة مثل posix مثل bash:

أنت يجب استعمال \", ، والتي، ولكن كل من آمنة ومسافة تبدي الحفاظ عليها:

$ pwsh -c " \"a&  c|\".length" # OK: 5

معلومات ذات صله

  • ^ لا يمكن إلا أن تستخدم شخصية الهروب في غير محدد سلاسل - داخل سلاسل مزدوجة نقلت، ^ ليس خاصا وتعامل كحرفي.

    • مذكرة قانونية: استخدام ^ في المعلمات مرت إلى call بيان مكسور (هذا ينطبق على كلا الاستخدامات call: استدعاء ملف دفعي آخر أو ثنائي، ودعوة روتين فرعي في نفس ملف دفعي):
      • ^ الحالات في نقلت مزدوجة القيم تضاعفت بشكل غير مفهوم, ، تغيير القيمة التي يتم تمريرها: على سبيل المثال، إذا كان متغير %v% يحتوي على القيمة الحرفية a^b, call :foo "%v%" يعين "a^^b"(!) ل %1 (المعلمة الأولى) في الروتين الفرعي :foo.
      • غير محدد استخدام ^ مع call يكون كسر تماما في هذا ^ لم يعد بإمكان استخدامه للهروب من الأحرف الخاصة: على سبيل المثال، call foo.cmd a^&b استراحات بهدوء (بدلا من تمرير حرفية a&b جدا foo.cmd, ، كما سيكون الحال دون call) - foo.cmd لم يتم استدعاء حتى الآن (!)، على الأقل في نظام التشغيل Windows 7.
  • الهروب من حرفية % هي حالة خاصة, ، لسوء الحظ، والتي يتطلب بناء جملة متميز اعتمادا على ما إذا كانت سلسلة محددة على سطر الأوامر ضد. داخل ملف دفعة; ؛ يرى https://stackoverflow.com/a/31420292/45375.

    • اختصار ذلك: داخل ملف دفعي، استخدم %%. وبعد في سطر الأوامر، % لا يمكن هربها، ولكن إذا وضعت ^ في البداية، تنتهي، أو داخل اسم متغير في غير محدد سلسلة (على سبيل المثال، echo %^foo%)، يمكنك منع التوسع المتغير (الاستيفاء)؛ % تعامل مثيلات سطر الأوامر التي ليست جزءا من مرجع متغير كحرف (على سبيل المثال، 100%).
  • عموما، للعمل بأمان مع قيم متغيرة قد تحتوي على مسافات وأحرف خاصة:

    • مهمة: أرفق على حد سواء الاسم المتغير والقيمة في غير مرتبطة زوج من اقتباسات مزدوجة; ؛ على سبيل المثال، set "v=a & b" يعين القيمة الحرفية a & b إلى المتغير %v% (على نقيض ذلك، set v="a & b" سيجعل اقتباسات مزدوجة من القيمة). الهروب من حرفية % مثيلات %% (يعمل فقط في ملفات الدفعات - انظر أعلاه).
    • مرجع: مراجع متغير مزدوج الاقتباس للتأكد من أن قيمتها غير محتويات؛ على سبيل المثال، echo "%v%" لا يخضع قيمة %v% إلى الاستيفاء والمطبوعات "a & b" (ولكن لاحظ أن الاقتباسات المزدوجة مطبوعة دائما أيضا). على نقيض ذلك، echo %v% يمر حرفيا a ل echo, ، تفسر & كمشغل تسلسل الأمر، وبالتالي يحاول تنفيذ الأمر باسم b.
      لاحظ أيضا تحذير أعلاه إعادة استخدام ^ مع ال call بيان.
    • خارجي تعتني البرامج عادة بإزالة أرفق اقتباسات مزدوجة حول المعلمات، ولكن، كما لوحظ، في ملفات الدفعات عليك القيام بذلك بنفسك (على سبيل المثال، %~1 لإزالة مرفق اقتباسات مزدوجة من المعلمة الأولى)، ولحزن، لا توجد طريقة مباشرة أعرفها للحصول عليها echo لطباعة قيمة متغيرة بأمانة بدون أرفق مزدوج الاقتباس.
      • نيل عروض أ forالحل الباسد الذي يعمل طالما أن القيمة لا يوجد لديه اقتباسات مضمنة مزدوجة; ؛ على سبيل المثال:
        set "var=^&')|;,%!" for /f "delims=" %%v in ("%var%") do echo %%~v
  • cmd.exe هل ليس تعرف غير مرتبطة-يقتبس كمحددات سلسلة - يتم التعامل معها كضروات ولا يمكن استخدامها بشكل عام لتحديد سلاسل مع المسافة البيضاء المدمجة؛ أيضا، يتبع أن الرموز التي تتخلص من اقتباسات واحدة وأي رموز بينهما يتم التعامل معها على أنها غير مستفادة بها cmd.exe وتفسير وفقا لذلك.

    • ومع ذلك، بالنظر إلى أن البرامج المستهدفة تؤدي في نهاية المطاف إلى تحليل الحجة الخاصة بها، فإن بعض البرامج مثل روبي تعترف بأسلوتات واحدة مقتبسة حتى على ويندوز؛ على النقيض من ذلك، C / C ++ الملفات التنفيذية، Perl و Python ليس التعرف عليها.
      حتى إذا كان يدعمها البرنامج المستهدف، فليس من المستحسن استخدام سلاسل واحدة مقتبسة، بالنظر إلى أن محتوياتها غير محمية من الترجمة الشفوية غير المرغوب فيها cmd.exe.

نقلا عن ذلك داخل بوبرشيل:

نوافذ Powershell. هي قذيفة أكثر تقدما بكثير من cmd.exe, ، وكان جزء من النوافذ لسنوات عديدة الآن (و Powershell Core. جلبت تجربة PowerShell إلى Macos و Linux أيضا).

بوبرشيل يعمل باستمرار داخليا فيما يتعلق اقتباس:

  • داخل سلاسل مزدوجة نقلت، واستخدام `" أو "" للهروب من اقتباسات مزدوجة
  • داخل سلاسل واحدة مقتبسة، واستخدام '' للهروب من اقتباسات واحدة

يعمل هذا على سطر أوامر PowerShell وعند تمرير المعلمات إلى البرامج النصية PowerShell أو وظائف من داخل Powershell.

(كما هو موضح أعلاه، اجتياز اقتباس مزدوج هربا إلى PowerShell من الخارج يستوجب \" أو، أكثر قوة، \"" - لا شيء آخر يعمل).

للأسف، عند الاحتجاج خارجي برامج من PowerShell، واجهت الحاجة إلى كلا من استيعاب قواعد اقتباس PowerShell الخاصة و للهروب من أجل استهداف برنامج:

تمت مناقشة هذا السلوك الإشكالي وتمخيصه مشكلة مستندات جيثب

مزدوج-Quotes داخل مزدوجسلاسل quoted.:

النظر في سلسلة "3`" of rain", ، الذي يترجم PowerShell-Internally إلى حرفي 3" of rain.

إذا كنت ترغب في تمرير هذه السلسلة إلى برنامج خارجي، يجب عليك تطبيق الهروب من البرنامج المستهدف بالإضافة الى إلى Powershell's; ؛ قل أنك تريد اجتياز السلسلة إلى برنامج C، والذي يتوقع أن يتم هرب علامات اقتباس مضمنة مزدوجة كما \":

foo.exe "3\`" of rain"

لاحظ كيف على حد سواء `" - لجعل Powershell سعيدة - و ال \ - لجعل البرنامج المستهدف سعيد - يجب أن يكون حاضرا.

ينطبق المنطق نفسه على استدعاء ملف دفعي، حيث "" لابد من استخدامه:

foo.bat "3`"`" of rain"

على النقيض من ذلك، تضمين غير مرتبطة-Quotes في أ مزدوجسلسلة من quoted. لا يتطلب أي هروب على الإطلاق.

أعزب-Quotes داخل غير مرتبطةسلاسل quoted. فعل ليس يتطلب إضافي الهروب؛ انصح '2'' of snow', ، وهو تمثيل PowerShell " 2' of snow.

foo.exe '2'' of snow'
foo.bat '2'' of snow'

يقوم Powershell بترجمة سلاسل واحدة مقتبسة إلى مقتبستين قبل تمريرها إلى البرنامج المستهدف.

ومع ذلك، مزدوج-Quotes داخل غير مرتبطةسلاسل quoted., ، والتي لا تحتاج الهرب ل Powershell., ، لا تزال بحاجة إلى أن تهرب من أجل البرنامج المستهدف:

foo.exe '3\" of rain'
foo.bat '3"" of rain'

Powershell. v3. قدم السحر --% اختيار, ، يسمى إيقاف تحليل رمز, الذي يخفف من بعض الألم، من خلال اجتياز أي شيء بعد ذلك غير رسمي إلى البرنامج المستهدف، حفظ ل cmd.exeمراجع متغير البيئة (على سبيل المثال، %USERNAME%)، أي نكون موسع؛ على سبيل المثال:

foo.exe --% "3\" of rain" -u %USERNAME%

لاحظ كيف تهرب من embedded " كما \" بالنسبة للبرنامج المستهدف فقط (وليس أيضا ب PowerShell كما \`") كافي.

ومع ذلك، هذا النهج:

  • لا يسمح الهروب % الشخصيات من أجل تجنب التوسعات المتغيرة البيئة.
  • يمنع مباشرة استخدام متغيرات PowerShell وتعبيرات؛ بدلا من ذلك، يجب أن يتم بناء سطر الأوامر في متغير سلسلة في الخطوة الأولى، ثم استدعاء Invoke-Expression في ثانية.

وبالتالي، على الرغم من أن العديد من التقدم، فإن PowerShell لم يصنع أسهل بكثير عند استدعاء البرامج الخارجية. ومع ذلك، أدخلت دعم سلاسل واحدة مقتبسة.

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

كإضافة إلى إجابة mkment0 الممتازة:

تقريبا جميع الملفات التنفيذية قبول \" كما هرب ". وبعد الاستخدام الآمن في CMD ومع ذلك ممكن فقط باستخدام DelayedExPansion.
لإرسال براء حرفي " إلى بعض العملية، تعيين \" إلى متغير بيئة، ثم استخدم هذا المتغير، كلما كنت بحاجة إلى تمرير أسعار. مثال:

SETLOCAL ENABLEDELAYEDEXPANSION
set q=\"
child "malicious argument!q!&whoami"

ملحوظة SETLOCAL ENABLEDELAYEDEXPANSION يبدو أنه يعمل فقط ضمن ملفات الدفعات. للحصول على تأخرته في جلسة تفاعلية، ابدأ cmd /V:ON.

إذا لم يعمل BatchFile الخاص بك مع syseedexpansion، فيمكنك تمكينه مؤقتا:

::region without DELAYEDEXPANSION

SETLOCAL ENABLEDELAYEDEXPANSION
::region with DELAYEDEXPANSION
set q=\"
echoarg.exe "ab !q! & echo danger"
ENDLOCAL

::region without DELAYEDEXPANSION

إذا كنت ترغب في تمرير المحتوى الديناميكي من متغير يحتوي على علامات اقتباس مضت "" يمكنك استبدال. "" مع \" على التوسع:

SETLOCAL ENABLEDELAYEDEXPANSION
foo.exe "danger & bar=region with !dynamic_content:""=\"! & danger"
ENDLOCAL

هذا الاستبدال غير آمن %...% توسيع النمط!

في حالة واردة bash -c "g++-linux-4.1 !v_params:"=\"!" هو النسخة الآمنة.


إذا لسبب ما، فإن تمكين التأخير مؤقتا ليس خيارا، اقرأ:

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

لتحقيق ذلك، يسبق واحد أي اقتباس مع قائرة (^")، ونقلت التي يجب أن تصل إلى عملية الطفل حيث يجب أن يتم الضغط على حرفي مع رد فعل عنيف (\^"). الكل يجب أن يتم هرب شخصيات Shell Meta مع ^ كذلك، على سبيل المثال & => ^&; | => ^|; > => ^>; ؛ إلخ.

مثال:

child ^"malicious argument\^"^&whoami^"

مصدر: يقتبس الجميع وسيطات سطر الأوامر بطريقة خاطئة, ، انظر "طريقة أفضل للاقتباس"


لتمرير المحتوى الديناميكي، يحتاج المرء إلى ضمان ما يلي:
يجب مراعاة جزء الأمر الذي يحتوي على المتغير "اقتباس" cmd.exe (هذا مستحيل إذا كان يمكن أن يحتوي المتغير على علامات اقتباس - لا تكتب %var:""=\"%). لتحقيق ذلك، آخر " قبل المتغير والأول " بعد المتغير ليس كذلك ^- التسجيل. CMD-Metacharacters بين هذين " يجب أن لا تهرب. مثال:

foo.exe ^"danger ^& bar=\"region with %dynamic_content% & danger\"^"

هذا ليس آمنا، إذا %dynamic_content% يمكن أن تحتوي على اقتباسات لا مثيل لها.

على سبيل المثال أداة التشغيل الآلي لمحرك غير واقعي تشغيل من ملف دفعي - هذا عملت بالنسبة لي

على سبيل المثال: -cmdline = "-Messaging" -Device = Device -AddCMDLine = "- SessionID = Sessionowner -Sonner = 'Owner'SeName =' Build '-DataProvidermode = Local -Logcmds =' LogCommodity Off 'execcmds =' قائمة الأتمتة ؛ تشغيل اختبارات + مفصولة + بواسطة + T1 + T2؛ إنهاء "-RUN

آمل أن يساعد هذا شخص ما، عملت بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top