التعامل مع علامات الاقتباس في البرامج النصية الدفعية لنظام التشغيل Windows

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

سؤال

في ملف دفعي Windows، عند القيام بما يلي:

set myvar="c:\my music & videos"

المتغير myvar يتم تخزينها مع علامات الاقتباس المدرجة.بصراحة أجد ذلك غبيًا جدًا.علامات الاقتباس هي فقط لمعرفة أين تبدأ السلسلة وتنتهي، وليس ليتم تخزينها كجزء من القيمة نفسها.
كيف يمكنني منع حدوث ذلك؟

شكرًا.

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

المحلول

set "myvar=c:\my music & videos"

لاحظ علامات الاقتباس تبدأ قبل myvar. انها فعلا بهذه البساطة. ملاحظة جانبية: myvar لا يمكن ردد بعد ذلك إلا أنها ملفوفة في الاقتباس لأن وسيتم قراءة كفاصل الأوامر، لكنه سوف لا تزال تعمل كمسار

http://ss64.com/nt/set.html تحت عنوان "أسماء المتغيرات يمكن تشمل مساحات "

نصائح أخرى

وهذه هي الطريقة الصحيحة للقيام بذلك:

set "myvar=c:\my music & videos"

وسوف يتم تضمين علامات الاقتباس في قيمة المتغير.

يعتمد ذلك على الطريقة التي تريد بها استخدام المتغير.إذا كنت تريد فقط استخدام قيمة المتغير بدون علامات الاقتباس، فيمكنك استخدام إما التوسيع المؤجل واستبدال السلسلة، أو for يأمر:

@echo OFF
SETLOCAL enabledelayedexpansion

set myvar="C:\my music & videos"

كما ينص andynormancx، فإن علامات الاقتباس مطلوبة نظرًا لأن السلسلة تحتوي على &.أو يمكنك الهروب منه باستخدام ^, ، لكنني أعتقد أن الاقتباسات أكثر نظافة قليلاً.

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

@echo !myvar:"=!
>>> C:\my music & videos

يمكنك أيضًا استخدام for يأمر:

for /f "tokens=* delims=" %%P in (%myvar%) do (
    @echo %%P
)
>>> C:\my music & videos

ومع ذلك، إذا كنت تريد استخدام المتغير في أمر ما، فيجب عليك استخدام القيمة المقتبسة أو وضع قيمة المتغير بين علامتي اقتباس:

  1. استخدام استبدال السلسلة والتوسيع المؤجل لاستخدام قيمة المتغير بدون علامات الاقتباس، ولكن استخدم المتغير في أمر:

    @echo OFF
    SETLOCAL enabledelayedexpansion
    
    set myvar="C:\my music & videos"
    md %myvar%
    @echo !myvar:"=! created.
    
  2. باستخدام for لاستخدام قيمة المتغير بدون علامات الاقتباس، ولكن سيتعين عليك إحاطة المتغير بعلامات الاقتباس عند استخدامه في الأوامر:

    @echo OFF
    set myvar="C:\my music & videos"
    
    for /f "tokens=* delims=" %%P in (%myvar%) do (
        md "%%P"
        @echo %%P created.
    )
    

باختصار، لا توجد طريقة نظيفة لاستخدام مسار أو اسم ملف يحتوي على مسافات مضمنة و/أو &في ملف دفعي.

استخدم ل JScript.

وقبل عدة أقمار (أي حوالي 8 سنوات يعطي أو يأخذ) كنت أعمل على مشروع C ++ / VB6 كبير، وكان لي بت مختلفة من دفعة سيناريو للقيام أجزاء من الإنشاء.

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

ووكسر ما يقرب من قلبي، والحصول على كل تلك النصوص صغيرة تعمل معا، على أجهزة مختلفة، مع الاجهزة مختلفة قليلا، الآلهة أيها كان المروعة - المتغيرات وضع سيما وفاة المعلمة. وكانت هشة حقا، وأدنى شيء من شأنه أن كسرها وتتطلب 30 دقيقة من التغيير والتبديل للحصول على الذهاب مرة أخرى.

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

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

يتيح لك مترجم أوامر Windows استخدام علامات الاقتباس حول أمر المجموعة بالكامل (صالح في كل إصدار من Windows NT من NT 4.0 إلى Windows 2012 R2)

يجب كتابة البرنامج النصي الخاص بك على النحو التالي:

@echo OFF

set "myvar=C:\my music & videos"

ثم يمكنك وضع علامات الاقتباس حول المتغيرات حسب الحاجة.

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

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

على سبيل المثالكلاهما صالح من الناحية الفنية، ولكن يمكن أن يكون لديك مسافات زائدة، لذا فهي ليست ممارسة جيدة:

set myvar=some text   
set myvar="some text" 

على سبيل المثالتعتبر كلتا الطريقتين أدناه من الطرق الجيدة لإعداد المتغيرات في مترجم أوامر Windows، إلا أن طريقة الاقتباس المزدوج هي الأفضل:

set "myvar=Some text"
(set myvar=Some value)

كلاهما لا يترك أي شيء لتفسير أن المتغير سيحتوي على البيانات التي تبحث عنها بالضبط.

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

وبالتالي، سوف تستخدم:

set myvar="c:\my music & videos"

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

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

صدى المتغير مع الاقتباسات:

Echo."%myvar%"

صدى المتغير بدون علامات الاقتباس:

Echo.%myvar:&=^&%
<nul SET /P="%myvar%"

في السيناريوهين أعلاه، يمكنك تكرار السلسلة بدون علامات الاقتباس بشكل جيد.مثال الإخراج أدناه:

C:\Admin>    Echo.%myvar:&=^&%
C:\my music & videos

C:\Admin>    <nul SET /P="%myvar%"
C:\my music & videos
C:\Admin>

وحاول استخدام حرف الهروب '^'، منها مثلا.

set myvar=c:\my music ^& videos

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

set myvar=c:\my music ^^^& videos

أنت يجب احصل على علامتي الاقتباس إذا كان النص الذي تقوم بتعيينه يتضمن أحرفًا معينة، بما في ذلك &.إذا لم يتضمن النص الخاص بك & فإنك لن تحتاج إلى الاقتباسات.

على سبيل المثال، إذا كان النص مجرد "c:\my music"، فيمكنك القيام بما يلي:

set myvar = c:\my music

ولكن لأن النص الخاص بك يحتوي على & كنت في حاجة الى الاقتباسات.

يحرر:

أو كما يقول ديف في إجابته يمكنك الهروب من الشخصيات المشكلة ^^^, ، ولكن حذار من هذا النهج كما & ليست الشخصية الوحيدة التي تحتاج للهروب منها.من الناحية العملية، من الأسهل بكثير الالتزام بالاقتباسات بدلاً من الهروب من كل الشخصيات التي تسبب المشكلة.

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