كيف يمكنني حماية علامات الاقتباس في ملف دفعي؟

StackOverflow https://stackoverflow.com/questions/130698

  •  02-07-2019
  •  | 
  •  

سؤال

أريد أن أختتم أ بيرل بطانة واحدة في ملف دفعي.للحصول على مثال (تافه)، في غلاف Unix، يمكنني أن أقتبس أمرًا مثل هذا:

perl -e 'print localtime() . "\n"'

لكن DOS يخنق ذلك برسالة الخطأ المفيدة هذه:

لا يمكن العثور على فاصل السلسلة "'" في أي مكان قبل EOF عند -e السطر 1.

ما هي أفضل طريقة للقيام بذلك داخل ملف الخفافيش?

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

المحلول

بالنسبة لأشياء Perl على نظام التشغيل Windows، أحاول استخدام الاقتباس المعمم قدر الإمكان حتى لا أصاب بمتلازمة المسواك المائلة.أقوم بحفظ علامات الاقتباس للأشياء التي يحتاجها DOS:

perl -e "print scalar localtime() . qq(\n)"

إذا كنت تحتاج فقط إلى سطر جديد في نهاية الطباعة، فيمكنك السماح لـ -l التبديل تفعل ذلك بالنسبة لك:

perl -le "print scalar localtime()"

للتعرف على الأشياء الرائعة الأخرى التي يمكنك القيام بها باستخدام المفاتيح، راجع com.perlrun توثيق.

نصائح أخرى

في "موجه DOS" لنظام التشغيل Windows (cmd.exe)، تحتاج إلى استخدام علامات الاقتباس المزدوجة وليس علامات الاقتباس المفردة.بالنسبة لكود Perl المقتبس، يمنحك Perl الكثير من الخيارات.ثلاثة هي:

perl -e "print localtime() . qq(\n)"
perl -e "print localtime() . $/"
perl -le "print ''.localtime()"

إذا كان لديك Perl 5.10 أو أحدث:

perl -E "say scalar localtime()"

شكرا ل ج.ف.سيباستيانتعليق.

بالنسبة للملفات الدفعية العامة ضمن Windows NT+، فإن الحرف ^ يهرب من الكثير من الأشياء (<>|&)، ولكن بالنسبة لعلامات الاقتباس، فإن مضاعفتها تعمل بشكل عجيب:

C:\>perl -e "print localtime() . ""\n"""
Thu Oct  2 09:17:32 2008

أولاً، أي إجابة تحصل عليها تكون خاصة بالأمر، لأن غلاف DOS لا يقوم بتحليل سطر الأوامر كما يفعل UNIQ؛يقوم بتمرير السلسلة غير المحللة بالكامل إلى الأمر، الذي يقوم بأي تقسيم.ومع ذلك، إذا كنت تستخدم /subsystem:console، فإن وقت تشغيل C يوفر التقسيم قبل استدعاء main()، وتستخدم معظم الأوامر هذا.

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

perl -e "print localtime() . ""\n"""

في DOS، يمكنك استخدام "" حول أمر Perl الخاص بك.لا تقوم قذيفة DOS بعمل علامات اقتباس مفردة مثل قذيفة Unix العادية:

perl -e "print localtime();"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top