سؤال

كما أفهمها، .bat هو اصطلاح التسمية القديم ذو 16 بت، و .cmd مخصص لنظام التشغيل Windows 32 بت، أي بدءًا من NT.لكنني مازلت أرى ملفات ‎.bat في كل مكان، ويبدو أنها تعمل بنفس الطريقة تمامًا باستخدام أي من اللاحقة.على افتراض أن الكود الخاص بي لن يحتاج أبدًا إلى التشغيل على أي شيء أقدم من NT، فهل يهم حقًا الطريقة التي أقوم بها بتسمية الملفات الدفعية الخاصة بي، أم أن هناك بعضًا منها؟ مسكتك ينتظرني باستخدام اللاحقة الخاطئة؟

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

المحلول

من نشر هذه المجموعة الإخبارية بواسطة مارك زبيكوفسكي نفسه:

الاختلافات بين .cmd و .bat بقدر CMD.exe هي:مع تمكين الامتدادات ، سيتم تعيين PATH/APPEND/SET/SET/ASSC في ملفات .cmd..BAT يعين خطأ فقط على الأخطاء.

بمعنى آخر، إذا تم تعيين ERRORLEVEL على القيمة غير 0 ثم قمت بتشغيل أحد هذه الأوامر، فإن ERRORLEVEL الناتج سيكون:

  • تُرك بمفرده بقيمته غير 0 في ملف .bat
  • إعادة التعيين إلى 0 في ملف .cmd.

نصائح أخرى

فيما يلي مجموعة من المعلومات التي تم التحقق منها من الإجابات المختلفة والمراجع المذكورة في هذا الموضوع:

  1. command.com هو معالج أوامر 16 بت تم تقديمه في MS-DOS وتم استخدامه أيضًا في سلسلة أنظمة التشغيل Win9x.
  2. cmd.exe هو معالج أوامر 32 بت في نظام التشغيل Windows NT (تحتوي أنظمة تشغيل Windows 64 بت أيضًا على إصدار 64 بت). cmd.exe لم يكن أبدًا جزءًا من Windows 9x.نشأت في OS/2 الإصدار 1.0، وإصدار OS/2 من cmd بدأ 16 بت (ولكنه كان مع ذلك برنامج وضع محمي مكتمل بأوامر مثل start).ويندوز NT ورثت cmd من OS/2، ولكن إصدار Windows NT Win32 بدأ بإصدار 32 بت.على الرغم من أن نظام التشغيل OS/2 أصبح 32 بت في عام 1992، إلا أنه cmd ظل برنامج OS/2 1.x ذو 16 بت.
  3. ال ComSpec يحدد المتغير env البرنامج الذي يتم تشغيله بواسطة .bat و .cmd نصوص.(بدءًا بـ WinNT، يكون هذا الإعداد الافتراضي هو cmd.exe.)
  4. cmd.exe متوافق مع الإصدارات السابقة command.com.
  5. البرنامج النصي الذي تم تصميمه ل cmd.exe يمكن تسميتها .cmd لمنع التنفيذ العرضي على نظام التشغيل Windows 9x.يعود تاريخ ملحق اسم الملف هذا أيضًا إلى الإصدار 1.0 من نظام التشغيل/2 و1987.

هنا قائمة cmd.exe الميزات التي لا يدعمها command.com:

  • أسماء الملفات الطويلة (تتجاوز التنسيق 8.3)
  • تاريخ الأوامر
  • إكمال علامة التبويب
  • هروب الشخصية: ^ (يسخدم من اجل: \ & | > < ^)
  • مكدس الدليل: PUSHD/POPD
  • حساب الأعداد الصحيحة: SET /A i+=1
  • بحث/استبدال/سلسلة فرعية: SET %varname:expression%
  • استبدال الأوامر: FOR /F (كانت موجودة من قبل، وقد تم تعزيزها)
  • المهام: CALL :label

ترتيب التنفيذ:

إذا كان كلا الإصدارين .bat و.cmd من البرنامج النصي (test.bat، test.cmd) موجودين في نفس المجلد وقمت بتشغيل البرنامج النصي بدون الملحق (اختبار)، فسيتم تشغيل إصدار .bat من البرنامج النصي بشكل افتراضي، حتى على نظام التشغيل Windows 7 64 بت.يتم التحكم في ترتيب التنفيذ بواسطة متغير البيئة PATHEXT.يرى الترتيب الذي يقوم فيه موجه الأوامر بتنفيذ الملفات لمزيد من التفاصيل.

مراجع:

ويكيبيديا: مقارنة قذائف القيادة

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

  • .cmd يمنع التنفيذ غير المقصود على أنظمة غير NT.
  • .cmd تمكن الأوامر المضمنة لتغيير Errorlevel إلى 0 عند النجاح.

يتم تشغيل ملحقات الأوامر بشكل افتراضي في ملفات .bat و.cmd ضمن نظام التشغيل Windows 2000 أو الإصدارات الأحدث.

في عام 2012 وما بعده، أوصي باستخدام .cmd حصريا.

لا - لا يهم على الإطلاق.في NT، يتسبب كل من الامتداد ‎.bat و.cmd في قيام المعالج cmd.exe بمعالجة الملف بنفس الطريقة تمامًا.

معلومات إضافية مثيرة للاهتمام حول Command.com vs.cmd.exe على أنظمة فئة WinNT من MS TechNet (http://technet.microsoft.com/en-us/library/cc723564.aspx):

يكشف هذا السلوك عن ميزة خفية للغاية من Windows NT مهمة للغاية.تم تصميم جهاز MS-DOS SHELL 16 بت (command.com) الذي يشحن مع Windows NT بشكل خاص لنظام التشغيل Windows NT.عندما يتم إدخال أمر للتنفيذ بواسطة هذه القشرة ، فإنه لا ينفذها بالفعل.بدلاً من ذلك ، يقوم بتعبئة نص الأوامر ويرسله إلى قذيفة أمر cmd.exe 32 بت للتنفيذ.نظرًا لأن جميع الأوامر يتم تنفيذها فعليًا بواسطة CMD.exe (قذيفة Command Windows NT) ، فإن قذيفة 16 بت ترث جميع ميزات ومرافق قذيفة Windows NT الكاملة.

يكرر: من الواضح أن استدعاء Command.com يمثل لغزًا معقدًا بعض الشيء؛

قبل عدة أشهر، أثناء سير المشروع، كان علينا معرفة سبب تشغيل بعض البرامج التي أردنا تشغيلها ضمن CMD.EXE، في الواقع، ضمن COMMAND.COM.كان "البرنامج" المعني عبارة عن ملف .BAT قديم جدًا، ولا يزال يعمل يوميًا.

لقد اكتشفنا أن سبب تشغيل الملف الدفعي ضمن COMMAND.COM هو أنه تم تشغيله من ملف .PIF (قديم أيضًا).نظرًا لأن إعدادات تكوين الذاكرة الخاصة المتوفرة فقط من خلال PIF أصبحت غير ذات صلة، فقد قمنا باستبدالها باختصار سطح المكتب التقليدي.

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

نظرًا لأن المنشور الأصلي كان يتعلق بعواقب استخدام .bat أو .cmd لاحقة, ، وليس بالضرورة الأوامر داخل الملف...

أحد الاختلافات الأخرى بين .bat و.cmd هو أنه في حالة وجود ملفين بنفس اسم الملف وكلا الامتدادين، فإن:

  • دخول اسم الملف أو اسم الملفسيقوم .bat في سطر الأوامر بتشغيل ملف .bat

  • لتشغيل ملف .cmd، عليك إدخاله اسم الملف.كمد

ومع ذلك، في نظام التشغيل Windows 7، تحتوي ملفات BAT أيضًا على هذا الاختلاف:إذا قمت بإنشاء ملفات TEST.BAT وTEST.CMD في نفس الدليل، وقمت بتشغيل TEST في هذا الدليل، فسيتم تشغيل ملف BAT.

C:\>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

C:\Temp>echo echo bat > test.bat

C:\Temp>echo echo cmd > test.cmd

C:\Temp>test

C:\Temp>echo bat
bat

C:\Temp>

كل شيء يعمل على دفعات يجب أن يعمل في cmd؛يوفر cmd بعض الامتدادات للتحكم في البيئة.أيضًا، يتم تنفيذ cmd بواسطة مترجم cmd الجديد وبالتالي يجب أن يكون أسرع (غير ملحوظ في الملفات القصيرة) وأكثر ثباتًا أثناء تشغيل الخفافيش ضمن بيئة 16 بت التي تمت محاكاتها من NTVDM

أعتقد أنه إذا قمت بتغيير قيمة متغير البيئة ComSpec إلى %SystemRoot%system32\cmd.exe، فلا يهم إذا كان امتداد الملف هو .BAT أو .CMD.لست متأكدًا، ولكن قد يكون هذا هو الإعداد الافتراضي لنظام التشغيل WinXP والإصدارات الأحدث.

قليلا خارج الموضوع، ولكن هل فكرت مضيف البرمجة النصية لنظام التشغيل Windows؟قد تجدها أجمل.

يختلف تنفيذ ملف .cmd و.bat لأنه في متغير مستوى الخطأ .cmd يمكن تغييره بناءً على أمر يتأثر بامتدادات الأوامر.هذا كل ما في الأمر حقًا.

التمديد لا فرق.توجد اختلافات طفيفة بين COMMAND.COM الذي يتعامل مع الملف مقابل COMMAND.COM.CMD.EXE

هنا فرق واحد اكتشفته: EnableDelayedExpansion يكون مطلوب في .cmd ملفات.
حيث كما في حالة .bat الملفات ضمنية بشكل افتراضي.(ويندوز 10)

dir *? | find /i "FOOBAR"
if ERRORLEVEL 0             (
set result="found"  ) else  (
set result="not found"  )
echo %result%

هذا يعمل في .bat ولكن دائما found في حالة أ .cmd ملف.
تغيير line 2 إلى ما يلي يجعلها تعمل كما هو متوقع:

if %ERRORLEVEL% equ 0       (

وأخيرا بالنسبة ل .cmd الملف يعمل بشكل صحيح:

setLocal EnableDelayedExpansion
...
if !ErrorLevel! equ 1       (
...

فرق:

يتم تحميل ملفات .cmd في الذاكرة قبل تنفيذها.تقوم ملفات .bat بتنفيذ سطر، وقراءة السطر التالي، وتنفيذ هذا السطر...

يمكنك أن تصادف هذا عند تنفيذ ملف نصي ثم تحريره قبل الانتهاء من التنفيذ.سيتم إفساد ملفات الخفافيش بسبب هذا، لكن لن يحدث ذلك مع ملفات cmd.

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