الرمز المكافئ لـ NEQ أو LSS أو GTR ، إلخ في ملفات Windows الدفعية




batch-file if-statement (2)

في الدُفعات ، أستخدم دائمًا == عند استخدام الأمر if . (على سبيل المثال: if "19"=="3" echo My computer doesnt know maths )

ماذا عن كل الآخرين ( LSS ، LEQ ، NEQ ، إلخ)؟ ليس هناك شيء مثل != ل NEQ ، أو أنا أفكر يونكس؟

السبب في أنني أرغب في استخدام الرموز هو أنني اعتقدت أن شخصًا ما قد قال إما أن رموز النص أو الأرقام كانت أكثر فاعلية من استخدام أشكال النص.

وفي كلتا الحالتين ، ما زلت أود أن أعرف. شكر.


السبب في عدم استخدام عوامل التشغيل > هو وجود معاني خاصة في البرامج النصية للصدف. > يستخدم لإعادة توجيه الإخراج ؛ < تستخدم لإعادة توجيه المدخلات ، إلخ.

الوثائق من Microsoft ، تسرد العوامل التالية:

Operator | Description
EQU      | equal to
NEQ      | not equal to
LSS      | less than
LEQ      | less than or equal to
GTR      | greater than
GEQ      | greater than or equal to

بالإضافة إلى أنه not يتم استخدام الكلمة "إنكار شرط".

السبب في أنني أرغب في استخدام الرموز هو أنني اعتقدت أن هناك من قال إن الرموز أو الأرقام كانت أكثر فاعلية من استخدام أشكال النص.

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


يحتوي الأمر Windows الداخلي IF افتراضيًا على عاملين فقط:

  1. == الذي يعمل على مقارنة سلسلة من الوسيطتين على المساواة ، أي استخدام strcmp بشرط أن يكون صحيحًا عند إرجاع strcmp 0.
  2. not بالاقتران مع == لعكس نتيجة مقارنة السلسلة على المساواة ، أي أن الشرط صحيح إذا كانت السلاسل المقارنة غير متساوية.

لذلك سطر الأوامر:

if "19"=="3" echo My computer doesn't know maths

يعمل strcmp مع السلاسل "19" و "3" مما يعني أن تدفقات البايت المقارنة ست عشرية 22 31 39 22 00 و 22 33 22 00 . لا يتم إزالة علامات الاقتباس المزدوجة قبل تشغيل مقارنة السلسلة. يتم تضمينها في مقارنة السلسلة.

مساعدة للأمر إذا كان الإخراج قيد التشغيل في نافذة موجه الأوامر ، فإن الأمر if /? . تشرح هذه المساعدة جميع الخيارات وعوامل التشغيل الإضافية التي يمكن استخدامها في تمكين امتدادات الأوامر بشكل افتراضي.

يوجد خيار /I لمقارنة الوسيطتين غير متحسسة لحالة الأحرف باستخدام stricmp بدلاً من strcmp .

مثال:

if /I not "%~1" == "/I" echo First argument is neither /i nor /I.

ومع امتدادات الأوامر الممكّنة ، توجد عوامل تشغيل مقارنة إضافية: EQU و NEQ و LSS و LEQ و GTR و GEQ

تستخدم أقواس الزاوية < و > في سطر أوامر Windows كمشغلين لإعادة التوجيه . لذلك لا يمكن استخدامها كمشغلين مقارنة بشرط IF . أيضا علامة تعجب ! غير متاح كمشغل لأنه يعني بداية / نهاية مرجع متغير بيئة على تمكين توسيع متغير بيئة مؤخر. تشغيل set /? و setlocal /? و endlocal /? للحصول على تفاصيل حول التغير المتغير في البيئة المتأخرة.

يحاول مترجم أوامر Windows تحويل كلا سلاسل وسيطة إلى أعداد صحيحة موقعة 32 بت باستخدام strtol مع base 0 (الاكتشاف التلقائي للقاعدة) عند استخدام EQU و NEQ و LSS و LEQ و GTR و GEQ . يتم إجراء مقارنة عدد صحيح إذا كان ذلك ناجحًا لكلا سلسلتي الوسيطتين لأن السلاسل المقارنة بين رقمين عشريين أو أرقام ست عشرية تبدأ بأرقام 0x أو ثمانية تبدأ بـ 0 . خلاف ذلك ، تتم مقارنة strcmp الوسيطتين مرة أخرى مع strcmp ويتم تطبيق عامل المقارنة على النتيجة الصحيحة لهذه الوظيفة.

يحتاج تحويل كل من وسيطات السلسلة إلى أعداد صحيحة 32 بت موقعة إلى بعض الإرشادات الإضافية للمعالج (بعض النانوثانية أو الجزئية بالاعتماد على أداء وحدة المعالجة المركزية). وبالتالي فإن المقارنة الصحيحة هي أبطأ قليلاً ، ولكنها ليست أبطأ بشكل ملحوظ بالفعل.

أمثلة:

if 014 EQU 12 echo Octal number 014 is equal decimal number 12.
if 0x0C EQU 12 echo Hexadecimal number 0C is equal decimal number 12.
if /I 0X0C EQU 014 Hexadecimal number 0C is equal octal number 014.

يتم تجاهل الخيار /I عند استخدام عامل مقارنة بخلاف == وتتألف كلتا السلاسل فقط من أرقام رقمية حيث يمكن أن يكون الحرف الأول أيضًا واصلة يتم تفسيرها على أنها علامة ناقص. ثبت هذا من خلال السطر الثالث أعلاه.

إذا كانت إحدى الوسيطتين مرفقة بعلامات اقتباس مزدوجة عند استخدام EQU أو NEQ أو LSS أو LEQ أو GTR أو GEQ أو أي من السلسلتين ليست سلسلة تمثل رقمًا صحيحًا ، GEQ المقارنة دائمًا باستخدام strcmp أو stricmp اعتمادا على استخدام /I ترجع strcmp و stricmp عددًا صحيحًا كنتيجة يمكن أن تكون رقمًا سالبًا أو صفرًا أو رقمًا موجبًا. تتم مقارنة نتيجة الأعداد الصحيحة هذه بالقيمة الصحيحة 0 وفقًا للمشغل المستخدم.

أمثلة:

if 010 NEQ "10" echo String 010 is not equal string "10".
if "100" LSS "20" echo String "100" is less than string "20".

الحرف الثاني 1 على الجانب الأيسر له قيمة رمز منخفضة (49 = 0x31) كحرف ثاني 2 على الجانب الأيمن (50 = 0x32) مما يؤدي إلى إرجاع strcmp لقيمة سالبة مما يؤدي إلى function result LSS 0 .

يرجى ملاحظة أن متغيرات بيئة Windows تكون دائمًا من نوع سلسلة وتحتاج إلى تحويلها دائمًا من سلسلة إلى عدد صحيح عند استخدام عدد صحيح أو عدد صحيح.

من المستحسن في معظم الحالات استخدام string1 == string2 أو not string1 == string2 بدلاً من string1 EQU string2 أو string1 NEQ string2 على مقارنة سلسلتين لا تمثل قيم عدد صحيح لاستخدام strcmp أو stricmp مباشرة. بخلاف ذلك ، عند مقارنة السلاسل مع EQU أو NEQ يتم إهدار بعض NEQ أو الميكروثانية من خلال السماح لمعالج أوامر Windows أولاً باستخدام strtol الذي فشل في تحويل أحد strtol للمقارنة ومن ثم يعمل cmd.exe تشغيل strcmp أو stricmp كما سيتم تنفيذه على الفور على استخدام المشغل == .

حقيقة واحدة أكثر أهمية:

تتم معالجة سلسلة بدلاً من مقارنة عدد صحيح على استخدام المقارنات EQU و NEQ و LSS و LEQ و GTR و GEQ بواسطة cmd.exe عند تنفيذ شرط IF فقط في حالة GEQ إحدى الوسيطتين على حرف غير صالح. ومع ذلك ، يتم إجراء مقارنة عدد صحيح على شرط خارج النطاق مثل وسيطة واحدة أقل من -2147483648 أو أكبر من 2147483647 كما تمت مناقشته في نتائج غريبة مع IF .

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

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if "%~1" == "" ( set "FileName=%~f0" ) else set "FileName=%~1"
for %%I in ("%FileName%") do set "FileSize=000000000000000%%~zI"
if "%FileSize:~-16%" GEQ "0000002147483648" (
    echo "%FileName%" is greater or equal 2 GiB.
) else echo "%FileName%" is less than 2 GiB.
endlocal
pause

يتم تعيين حجم ملف الملف الذي يتم تمرير الاسم إلى ملف الدُفعات به إلى متغير البيئة FileSize كسلسلة تحتوي دائمًا على 15 رقمًا إضافيًا على الأقل في البداية.

ثم يتم مقارنة سلسلة FileSize مع آخر 16 رقمًا مع السلسلة 0000002147483648 تمثل 2 0000002147483648 في البايت. يقارن strcmp بايت متساوية الطول بالبايت حيث يمكن لكل بايت من السلسلتين المقارنتين أن يحتوي فقط على القيم الست عشرية من 0x30 إلى 0x39. ترجع strcmp الفور بقيمة سالبة إذا كانت البايت الحالي من السلسلة اليسرى أقل من البايت الحالي من السلسلة اليمنى مما يعني أن حجم الملف أقل من 2 غيغا بايت. ترجع strcmp الفور بقيمة موجبة إذا كانت البايت الحالي من السلسلة اليسرى أكبر من البايت الحالي من السلسلة اليمنى مما يعني أن حجم الملف أكبر من 2 غيغا بايت. strcmp العوائد مع صفر على السلاسل اثنين متطابقة 100 ٪ مما يعني أن حجم الملف هو بالضبط 2 غيغابايت.

يرجى ملاحظة أن مقارنة القيم باستخدام مقارنة السلسلة تتطلب أن تحتوي كلتا القيمتين على نفس عدد الأرقام للحصول على نتيجة دقيقة. يجب أن تكون سلسلة القيمة ذات الأرقام الأقل معدة مسبقًا بقيمة 0 .





cmd