3. أساسيات برمجة VBScript
بعد وصف سياقات التنفيذ المحتملة لنص VBScript، سنناقش الآن اللغة نفسها. من الآن فصاعدًا، سنفترض الشروط التالية:
- حاوية البرنامج النصي هي WSH
- يتم وضع البرنامج النصي في ملف بامتداد .vbs
لتقديم مفهوم ما، نتبع عادةً الخطوات التالية:
- نقدم المفهوم إذا لزم الأمر
- نقدم برنامجًا توضيحيًا مع نتائجه
- نعلق على النتائج والبرنامج إذا لزم الأمر
لا تميز حاويات VBScript بين الأحرف الكبيرة والصغيرة في نص البرنامج النصي. ولذلك، يمكنك كتابة wscript.echo "hello" أو WSCRIPT.ECHO "hello".
تقوم البرامج المعروضة أدناه بعرض الكثير من المخرجات على الشاشة، لذا سنعيد النظر في طرق الإخراج الخاصة بكائن wscript.
3.1. عرض المعلومات
لقد استخدمنا بالفعل طريقة echo الخاصة بكائن wscript، ولكن هناك طرق أخرى للكتابة على الشاشة، كما هو موضح في البرنامج النصي التالي:
البرنامج | النتائج |
![]() |
يجب ملاحظة النقاط التالية:
- يتم التعامل مع أي نص يلي علامة الفاصلة العليا على أنه تعليق في البرنامج النصي ولا يتم تفسيره بواسطة WSH (السطر 1).
- تقوم طريقة echo بطباعة حججها وتنتقل إلى السطر التالي، كما تفعل طريقة writeLine (السطران 2 و6)
- تقوم طريقة write بطباعة حججها ولا تنتقل إلى السطر التالي (السطر 3)
- يتم تمثيل حرف نهاية السطر بتسلسل حرفين ASCII هما 13 و 10. وبالتالي، يتم تمثيل السطر 4 بالتعبير chr(13) & chr(10)، حيث chr(i) هو الحرف ASCII i و & هو عامل ربط السلاسل. وبالتالي، فإن "chat" & "eau" هي السلسلة "chateau".
- يمكن تمثيل حرف نهاية السطر بسهولة أكبر بالثابت vbCRLF (السطر 5)
3.2. : كتابة التعليمات في برنامج VBScript
بشكل افتراضي، تُكتب تعليمات واحدة في كل سطر. ومع ذلك، يمكن كتابة تعليمات متعددة في سطر واحد عن طريق فصلها بالحرف: كما في inst1:inst2:inst3. إذا كان السطر طويلاً جدًا، فيمكن تقسيمه إلى أجزاء. في هذه الحالة، يجب إنهاء الأجزاء المختلفة من التعليمات بالحرفين (مسافة)_. دعونا نعيد النظر في المثال السابق عن طريق إعادة كتابة التعليمات بشكل مختلف:
البرنامج | النتائج |
![]() |
3.3. الكتابة باستخدام دالة msgBox
بينما نستخدم كائن wscript في هذا المستند بشكل حصري تقريبًا لعرض النص على الشاشة، هناك دالة أكثر تطورًا لعرض المعلومات في نافذة. هذه هي دالة msgbox، والتي تُستخدم عمومًا مع ثلاثة معلمات:
msgbox message, icons+buttons, title
- message هو نص الرسالة المراد عرضها
- الرموز والأزرار (اختياري) هو في الواقع رقم يحدد نوع الرمز والأزرار التي سيتم وضعها في نافذة الرسالة. غالبًا ما يكون هذا الرقم مجموع رقمين: الأول يحدد الرمز، والثاني يحدد الأزرار
- العنوان هو النص الذي سيتم وضعه في شريط العنوان في نافذة الرسالة
القيم المستخدمة لتحديد الرمز والأزرار في نافذة العرض هي كما يلي:
الثابت | القيمة | الوصف |
vbOKOnly | 0 | يعرض زر "موافق" فقط. |
vbOKCancel | 1 | يعرض زري "موافق" و"إلغاء". |
vbAbortRetryIgnore | 2 | يعرض أزرار "إلغاء" و"إعادة المحاولة" و"تجاهل". |
vbYesNoCancel | 3 | يعرض أزرار «نعم» و«لا» و«إلغاء». |
vbYesNo | 4 | يعرض زري "نعم" و"لا". |
vbRetryCancel | 5 | يعرض زري "إعادة المحاولة" و"إلغاء". |
vbCritical | 16 | يعرض رمز "رسالة حرجة". |
vbQuestion | 32 | يعرض رمز طلب التحذير. |
vbExclamation | 48 | يعرض رمز رسالة التحذير. |
vbInformation | 64 | يعرض رمز رسالة المعلومات. |
vbDefaultButton1 | 0 | الزر الأول هو الزر الافتراضي. |
vbDefaultButton2 | 256 | الزر الثاني هو الزر الافتراضي. |
vbDefaultButton3 | 512 | الزر الثالث هو الزر الافتراضي. |
vbDefaultButton4 | 768 | الزر الرابع هو الزر الافتراضي. |
vbApplicationModal | 0 | تطبيق نمطي؛ يجب على المستخدم الرد على الرسالة قبل متابعة العمل في التطبيق الحالي. |
vbSystemModal | 4096 | نظام modal؛ يتم تعليق جميع التطبيقات حتى يرد المستخدم على الرسالة. |
فيما يلي بعض الأمثلة:
البرنامج | ||||||||||||||||||||||||
![]() | ||||||||||||||||||||||||
النتائج | ||||||||||||||||||||||||
| ||||||||||||||||||||||||
في بعض الحالات، يتم عرض نافذة معلومات تعمل أيضًا كنافذة إدخال. إذا طُرح سؤال، على سبيل المثال، نريد معرفة ما إذا كان المستخدم قد نقر على زر "نعم" أم زر "لا". تُرجع الدالة msgBox نتيجة لم نستخدمها في البرنامج السابق. هذه النتيجة هي عدد صحيح يمثل الزر الذي نقر عليه المستخدم لإغلاق نافذة العرض:
الثابت | القيمة | الزر المحدد |
vbOK | 1 | موافق |
vbCancel | 2 | إلغاء |
vbAbort | 3 | إلغاء |
vbRetry | 4 | إعادة المحاولة |
vbIgnore | 5 | تجاهل |
vbYes | 6 | نعم |
vbلا | 7 | لا |
يوضح البرنامج التالي كيفية استخدام نتيجة دالة msgBox. يتم عرض نافذة تحتوي على أزرار «نعم» و«لا» و«إلغاء» أربع مرات. يمكنك الرد على النحو التالي:
- انقر فوق "نعم"
- انقر فوق "لا"
- انقر فوق "إلغاء"
- أغلق النافذة دون استخدام أي زر. يوضح البرنامج أن هذا يعادل استخدام زر "إلغاء".
البرنامج | ||||
![]() | ||||
النتائج | ||||
|
3.4. أنواع البيانات التي يمكن استخدامها في VBScript
لا يتعرف VBScript إلا على نوع واحد من البيانات: المتغير. يمكن أن تكون قيمة المتغير رقماً (4، 10.2)، أو سلسلة ("hello")، أو قيمة منطقية (صحيح/خطأ)، أو تاريخاً (#01/01/2002#)، أو عنوان كائن، أو مجموعة من جميع أنواع البيانات هذه موضوعة في بنية تسمى مصفوفة.
دعونا ندرس البرنامج التالي ونتائجه:
البرنامج | النتائج |
![]() |
تعليقات:
- تتطلب عدد من لغات البرمجة (C، C++، باسكال، جافا، C#، إلخ) إعلان المتغير قبل استخدامه. يتضمن هذا الإعلان تحديد اسم المتغير ونوع البيانات التي يمكن أن يحتوي عليها (عدد صحيح، عدد عائم، سلسلة، تاريخ، منطقية، إلخ). يتيح إعلان المتغيرات عدة أمور:
- تحديد مساحة الذاكرة المطلوبة للمتغير، حيث تتطلب أنواع البيانات المختلفة كميات مختلفة من الذاكرة
- التحقق من اتساق البرنامج. على سبيل المثال، إذا كان i عددًا صحيحًا و c سلسلة، فإن ضرب i في c لا معنى له. إذا تم إعلان أنواع المتغيرات i و c من قبل المبرمج، يمكن للبرنامج المسؤول عن تحليل الكود قبل التنفيذ الإبلاغ عن مثل هذا التناقض.
مثل معظم لغات البرمجة النصية ذات النوع الواحد من البيانات (Perl، Python، JavaScript، إلخ)، يسمح VBScript باستخدام المتغيرات دون إعلان. وهذا ما تم في المثال أعلاه.
- لاحظ صيغة أنواع البيانات المختلفة
- 10.2 في السطر 10 (نقطة عشرية، وليست فاصلة). لاحظ أن 10.2 معروض على الشاشة.
- 1.4e-2 في السطر 13 (التعبير العلمي). يتم عرض الرقم 0.014
- [#01/10/2002#] (السطر 26) لتمثيل تاريخ 10 يناير 2002. لذلك تستخدم VBScript التنسيق #mm/dd/yyyy# لتمثيل التاريخ dd من الشهر mm من السنة yyyy
- القيم المنطقية true و false في السطرين 31 و 34. يتم تمثيل هاتين القيمتين على التوالي بالأعداد الصحيحة -1 و 0، كما هو موضح في ناتج السطرين 32 و 35. عندما يتم ربط قيمة منطقية بسلسلة، تصبح هاتان القيمتان السلسلتين "True" و "False" على التوالي، كما هو موضح في السطرين 33 و 36. لاحظ أن عامل التسلسل & يمكن استخدامه لتسلسل أكثر من مجرد سلاسل.
- نظرًا لأن المتغير v ليس له نوع محدد، فيمكنه الاحتفاظ بقيم من أنواع مختلفة على التوالي بمرور الوقت.
3.5. L : الأنواع الفرعية لنوع Variant
فيما يلي ما تقوله الوثائق الرسمية حول أنواع البيانات المختلفة التي يمكن أن يحتوي عليها المتغير:
بالإضافة إلى التمييز البسيط بين الأرقام والسلاسل النصية، يمكن لـ«Variant» التمييز بين أنواع مختلفة من المعلومات الرقمية. على سبيل المثال، تمثل بعض المعلومات الرقمية تاريخًا أو وقتًا. وعندما تُستخدم هذه المعلومات مع بيانات تاريخ أو وقت أخرى، يتم التعبير عن النتيجة دائمًا في صورة تاريخ أو وقت. هناك أيضًا أنواع أخرى من المعلومات الرقمية، تتراوح من القيم المنطقية إلى الأرقام العائمة الكبيرة. هذه الفئات المختلفة من المعلومات التي يمكن أن يحتوي عليها المتغير هي أنواع فرعية. في معظم الحالات، ما عليك سوى وضع بياناتك في متغير، وسيتصرف المتغير بالطريقة الأنسب بناءً على تلك البيانات.
يسرد الجدول التالي الأنواع الفرعية المختلفة التي يمكن أن يحتوي عليها متغير.
النوع الفرعي | الوصف |
فارغ | لم يتم تهيئة المتغير. قيمته هي صفر للمتغيرات الرقمية وسلسلة فارغة ("") للمتغيرات النصية. |
فارغ | يحتوي المتغير عمدًا على بيانات غير صحيحة. |
منطق | |
بايت | يحتوي على عدد صحيح من 0 إلى 255. |
عدد صحيح | يحتوي على عدد صحيح من -32,768 إلى 32,767. |
العملة | من -922,337,203,685,477.5808 إلى 922,337,203,685,477.5807. |
طويل | يحتوي على عدد صحيح من -2,147,483,648 إلى 2,147,483,647. |
أحادي | يحتوي على رقم عائم بدقة مفردة يتراوح من -3.402823E38 إلى -1.401298E-45 للقيم السالبة؛ ومن 1.401298E-45 إلى 3.402823E38 للقيم الموجبة. |
مزدوج | يحتوي على رقم عائم بدقة مزدوجة يتراوح من -1.79769313486232E308 إلى -4.94065645841247E-324 للقيم السالبة؛ من 4.94065645841247E-324 إلى 1.79769313486232E308 للقيم الموجبة. |
التاريخ (الوقت) | يحتوي على رقم يمثل تاريخًا بين 1 يناير 100 و 31 ديسمبر 9999. |
سلسلة | يحتوي على سلسلة ذات طول متغير يقتصر على حوالي 2 مليار حرف. |
كائن | يحتوي على كائن. |
خطأ | يحتوي على رقم خطأ. |
3.6. C : تحديد النوع الدقيق للبيانات الموجودة في متغير
يمكن أن يحتوي متغير من النوع variant على بيانات من أنواع مختلفة. في بعض الأحيان نحتاج إلى معرفة الطبيعة الدقيقة لهذه البيانات. إذا كتبنا product = number1 \* number2 في برنامج، فإننا نفترض أن number1 وnumber2 كلاهما قيمتان رقميتان. في بعض الأحيان لا نكون متأكدين، لأن هذه القيم قد تأتي من إدخال لوحة المفاتيح أو ملف أو مصدر خارجي آخر. يجب علينا إذن التحقق من طبيعة البيانات المخزنة في number1 و number2. تسمح لنا الدالة typename(var) بتحديد نوع البيانات الموجودة في المتغير var. فيما يلي بعض الأمثلة:
البرنامج | النتائج |
![]() |
وظيفة أخرى ممكنة هي vartype(var)، والتي تُرجع رقمًا يمثل نوع البيانات الموجودة في المتغير var:
ثابت | القيمة | الوصف |
vbEmpty | 0 | فارغ (غير مهيأ) |
vbNull | 1 | صفر (لا توجد بيانات صالحة) |
vbInteger | 2 | عدد صحيح |
vbLong | 3 | عدد صحيح طويل |
vbSingle | 4 | رقم عائم بدقة أحادية |
vbDouble | 5 | رقم عائم بدقة مزدوجة |
vbCurrency | 6 | العملة |
vbDate | 7 | التاريخ |
vbString | 8 | سلسلة |
vbObject | 9 | كائن أتمتة |
vbError | 10 | خطأ |
vbBoolean | 11 | منطقية |
vbVariant | 12 | متغير (يستخدم فقط مع مصفوفات المتغيرات) |
vbDataObject | 13 | كائن غير آلي |
vbByte | 17 | بايت |
vbArray | 8192 | مصفوفة |
ملاحظة: يتم تعريف هذه الثوابت بواسطة VBScript. وبالتالي، يمكن استخدام الأسماء في أي مكان في الكود بدلاً من القيم الفعلية.
المعلومات الواردة أعلاه مأخوذة من وثائق VBScript. وقد تكون غير صحيحة في بعض الأحيان، على الأرجح بسبب نسخها ولصقها من وثائق VB. لا تؤدي دالة vartype في VBScript سوى جزء مما هو موصوف أعلاه.
البرنامج السابق، الذي أعيدت كتابته لاستخدام vartype، يعطي النتائج التالية:
البرنامج | النتائج |
![]() |
3.7. D إعلان المتغيرات المستخدمة في البرنامج النصي
ذكرنا أنه ليس من الضروري إعلان المتغيرات التي يستخدمها البرنامج النصي. في هذه الحالة، إذا كتبنا:
1) somme=4
...
2) somme=smme+10
إذا كان هناك خطأ مطبعي — مثل "smme" بدلاً من "somme" — في السطر 2، فلن يبلغ VBScript عن وجود خطأ. سيفترض أن "smme" متغير جديد. سيقوم بإنشائه، وفي سياق السطر 2، سيستخدمه عن طريق تهيئته إلى 0.
قد يكون من الصعب جدًا اكتشاف هذه الأنواع من الأخطاء. لذلك، يُنصح بفرض إعلان المتغيرات باستخدام توجيه option explicit الموضوع في بداية البرنامج النصي. بعد ذلك، يجب إعلان كل متغير باستخدام عبارة dim قبل استخدامه لأول مرة:
option explicit
...
dim somme
1) somme=4
...
2) somme=smme+10
في هذا المثال، سيشير VBScript إلى وجود متغير غير مُعلن smme في 2)، كما هو موضح في المثال التالي:
البرنامج | النتائج |
![]() |
على الرغم من أن المتغيرات لم تُعلن في الغالب في الأمثلة القصيرة الواردة في هذا المستند، فإننا سنحتاج إلى إعلانها بمجرد أن نبدأ في كتابة أول نصوص برمجية ذات مغزى. وعندئذٍ سيتم استخدام التوجيه Option Explicit بشكل منهجي.
3.8. وظائف التحويل
يقوم VBScript بتحويل البيانات المتغيرة إلى سلاسل، وأرقام، وقيم منطقية، وما إلى ذلك، حسب السياق. في معظم الأحيان، يعمل هذا بشكل جيد، ولكنه يؤدي أحيانًا إلى نتائج غير متوقعة، كما سنرى لاحقًا. لذلك قد ترغب في "فرض" نوع بيانات المتغير. يحتوي VBScript على وظائف تحويل تقوم بتحويل تعبير إلى أنواع بيانات مختلفة. فيما يلي بعض منها:
Cint (التعبير) | يحول التعبير إلى عدد صحيح قصير |
Clng (التعبير) | يحول التعبير إلى عدد صحيح طويل |
Cdbl (تعبير) | يحول التعبير إلى عدد مزدوج |
Csng (التعبير) | يحول التعبير إلى عدد عائم بدقة أحادية (single) |
Ccur (التعبير) | يحول التعبير إلى عملة |
فيما يلي بعض الأمثلة:
البرنامج |
![]() |
النتائج |
|
3.9. البيانات المكتوبة على لوحة المفاتيح
يسمح كائن wscript للبرنامج النصي باسترداد البيانات التي تم إدخالها عبر لوحة المفاتيح. تقرأ طريقة wscript.stdin.readLine سطرًا من النص الذي تم إدخاله عبر لوحة المفاتيح وتأكيده بالضغط على مفتاح "Enter". يمكن تعيين هذا السطر المقروء إلى متغير.
البرنامج | النتائج |
![]() | |
التعليقات:
- في عمود النتائج وفي الصف [اكتب اسمك: st]، st هو النص الذي أدخله المستخدم.
إذا كان النص المكتوب على لوحة المفاتيح يمثل رقمًا، فإنه لا يزال يُعامل في المقام الأول كسلسلة من الأحرف، كما هو موضح في المثال أدناه:
البرنامج | النتائج |
![]() |
إذا تم استخدام هذا الرقم في عملية حسابية، فسيقوم VBScript تلقائيًا بتحويل السلسلة إلى رقم، ولكن ليس دائمًا. لنلقِ نظرة على المثال التالي:
البرنامج | النتائج |
![]() |
في النتائج، نرى أن السطر 8 من البرنامج النصي لم يعمل كما هو متوقع، لأن (للأسف) في VBScript، للمُشغِّل + معنيان: جمع رقمين أو تسلسل سلسلتين (يتم ربط السلسلتين معًا). لقد رأينا سابقًا أن الأرقام التي تمت كتابتها على لوحة المفاتيح تمت قراءتها كسلاسل وأن VBScript قام بتحويلها إلى أرقام حسب الحاجة. وقد قام بذلك بشكل صحيح بالنسبة للعمليات -، *، /، التي لا يمكن أن تتضمن سوى أرقام، ولكن ليس بالنسبة لعامل +، الذي يمكن أن يتضمن أيضًا سلاسل. هنا، افترضنا أننا أردنا ربط السلاسل.
يتمثل الحل البسيط لهذه المشكلة في تحويل السلاسل إلى أرقام فور قراءتها، كما هو موضح في التحسين التالي للبرنامج السابق:
البرنامج | النتائج |
![]() |
3.10. S إدخال البيانات باستخدام دالة inputBox
قد ترغب في إدخال البيانات عبر واجهة رسومية بدلاً من لوحة المفاتيح. في هذه الحالة، استخدم دالة inputBox. تقبل هذه الدالة العديد من المعلمات، لكن لا يُستخدم عادةً سوى أول اثنين منها:
response = inputBox(message, title)
- message: السؤال الذي تطرحه على المستخدم
- title (اختياري): العنوان الذي تضعه لنافذة الإدخال
- response: النص الذي يكتبه المستخدم. إذا أغلق المستخدم النافذة دون الرد، تكون response عبارة عن سلسلة فارغة.
فيما يلي مثال نطلب فيه اسم الشخص وعمره. بالنسبة للاسم، ندخل المعلومات ونضغط على "موافق". بالنسبة للعمر، ندخل المعلومات أيضًا ولكننا نضغط على "إلغاء".
البرنامج | ||||
![]() | ||||
النتائج | ||||
|
3.11. : استخدام الكائنات المنظمة
من الممكن إنشاء كائنات ذات طرق وخصائص باستخدام VBScript. لتبسيط الأمور، سنقدم هنا كائنًا له خصائص ولكن بدون طرق. لنفترض شخصًا ما. له العديد من الخصائص التي تميزه: الطول، الوزن، لون البشرة، لون العينين، لون الشعر، إلخ. سنركز على اثنتين فقط: الاسم والعمر. قبل أن تتمكن من استخدام الكائنات، يجب عليك إنشاء القالب الذي سيسمح لك بإنشائها. في VBScript، يتم ذلك باستخدام فئة. يمكن تعريف فئة Person على النحو التالي:
class personne
Dim nom,age
End class
إن عبارة [Dim name, age] هي التي تحدد الخاصيتين لفئة Person. لإنشاء نسخ (تسمى مثيلات) من فئة Person، نكتب:
لماذا لا تكتب
لأن المتغير لا يمكن أن يحتوي على كائن. بل يمكنه فقط أن يحتوي على عنوان الكائن. عندما تكتب set person1 = new person، تحدث سلسلة الأحداث التالية:
- يتم إنشاء كائن Person. وهذا يعني تخصيص ذاكرة له.
- يتم تعيين عنوان كائن person هذا للمتغير person1
وبذلك نحصل على تخطيط الذاكرة التالي للمتغيرين person1 و person2:
![]() |
على سبيل المجاز، يمكننا القول إن person1 هو كائن شخص. يمكننا قبول هذا المجاز إذا تذكرنا أن person1 هو في الواقع عنوان كائن شخص وليس كائن الشخص نفسه.
قلنا إن كائن Person له خاصيتان: الاسم والعمر. كيف نصل إلى هاتين الخاصيتين؟ باستخدام صيغة object.property، كما أوضحنا سابقًا. وبالتالي
person1.name يشير إلى اسم الشخص 1، و person1.age يشير إلى عمره. إليك برنامج قصير لتوضيح ذلك:
البرنامج | النتائج |
![]() |
يمكن تعديل البرنامج السابق على النحو التالي:
البرنامج | النتائج |
![]() |
استخدمنا هنا بنية with ... end with، التي تسمح لنا بـ"استخراج" أسماء الكائنات في التعبيرات. تسمح لنا بنية with p1 ... end with* في الأسطر 9–12 و15–18 باستخدام صيغة .name بدلاً من p1.name* و.age* بدلاً من p1.age*. وهذا يبسط كتابة التعليمات التي يتم فيها استخدام اسم الكائن نفسه بشكل متكرر.
3.12. تعيين قيمة لمتغير
هناك جملتان لتعيين قيمة لمتغير:
- variable=expression
- set variable=expression
يُخصص الشكل 2 للتعبيرات التي تكون نتيجتها مرجع كائن. بالنسبة لجميع أنواع التعبيرات الأخرى، يكون الشكل 1 هو المناسب. والفرق بين الشكلين هو كما يلي:
- في العبارة متغير=تعبير، يتلقى المتغير قيمة. إذا كان v1 و v2 متغيرين، فإن كتابة v1=v2 تعين قيمة v1 إلى v2. وهذا يؤدي إلى تكرار القيمة في موقعين مختلفين. إذا تم تعديل قيمة v2 لاحقًا، تظل قيمة v1 دون تغيير.
![]() |
- في العبارة `set variable=expression`، يُعيَّن لـ `variable` عنوان كائن. إذا كان `v1` و`v2` متغيرين و`v2` هو عنوان كائن `obj2`، فإن كتابة `set v1=v2` تعيّن قيمة `v1` لـ `v2`، أي عنوان الكائن `obj2`. عندما يقوم البرنامج النصي لاحقًا بمعالجة v1 و v2، فإن ما يتم معالجته ليس "قيم" v1 و v2، بل الكائنات التي "يشير إليها" v1 و v2 — في هذه الحالة، الكائن نفسه. نقول إن v1 و v2 هما مرجعان لنفس الكائن، ولا فرق بين معالجته عبر v1 أو v2. بعبارة أخرى، فإن تعديل الكائن المشار إليه بواسطة v2 يؤدي إلى تعديل الكائن المشار إليه بواسطة v1.
![]() |
إليك مثال على ذلك:
البرنامج | النتائج |
![]() |
3.13. E تقييم التعبيرات
المشغلات الرئيسية المستخدمة لتقييم التعبيرات هي كما يلي:
نوع العوامل | المشغلات | مثال |
الحسابية | +، -، *، / | |
مقارنة | <,<= >، >= =,<> | a<>b صحيح إذا كان a لا يساوي b a=b صحيح إذا كان a يساوي b يمكن أن يكون كل من a و b أرقامًا أو سلاسل نصية. في الحالة الأخيرة، تكون string1<string2 إذا كانت string1 تسبق string2 في الترتيب الأبجدي. في مقارنة السلاسل النصية، تأتي الأحرف الكبيرة قبل الأحرف الصغيرة في الترتيب الأبجدي. |
المنطق | و، أو، لا، xor | جميع المعاملات هنا من نوع منطقي. bool1 أو bool2 صحيح إذا كان bool1 أو bool2 صحيحًا bool1 و bool2 صحيح إذا كان كل من bool1 و bool2 صحيحين not bool1 صحيح إذا كان bool1 خطأ، والعكس صحيح bool1 xor bool2 صحيح إذا كان أحد القيم المنطقية bool1 أو bool2 صحيحًا |
التسلسل | &, + | لا يُنصح باستخدام عامل + لتسلسل سلسلتين، حيث يمكن الخلط بين ذلك وبين جمع عددين. لذلك، يجب استخدام عامل & فقط. |
3.14. C : التحكم في تنفيذ البرنامج
3.14.1. E تنفيذ الإجراءات بشكل مشروط
فيما يلي عبارة VBScript المستخدمة لتنفيذ الإجراءات بناءً على صحة الشرط أو خطأه:
يتم تقييم التعبير أولاً. يجب أن يكون لهذا التعبير قيمة منطقية. إذا كان التقييم صحيحًا، يتم تنفيذ الإجراءات الموجودة في كتلة then؛ وإلا، يتم تنفيذ الإجراءات الموجودة في كتلة else، إن وجدت. |
فيما يلي برنامج يوضح أشكالًا مختلفة من عبارة if-then-else:
البرنامج | النتائج |
![]() |
تعليقات:
- في VBScript، يمكنك كتابة instruction1:instruction2:... : instructionn بدلاً من كتابة تعليمة واحدة في كل سطر. تُستخدم هذه الميزة في السطر 10، على سبيل المثال.
3.14.2. E تنفيذ الإجراءات بشكل متكرر
حلقة ذات عدد معروف من التكرارات |
يمكنك الخروج من حلقة for في أي وقت باستخدام عبارة exit for. |
حلقة ذات عدد غير معروف من التكرارات |
يمكنك الخروج من حلقة do-while في أي وقت باستخدام عبارة exit do. |
يوضح البرنامج أدناه هذه النقاط:
البرنامج |
![]() |
النتائج |
|
ملاحظة: خلال مرحلة تطوير البرنامج، من الشائع أن يدخل البرنامج في "حلقة"، أي أنه لا يتوقف أبدًا. عمومًا، ينفذ البرنامج حلقة لا يمكن التحقق من شرط الخروج منها، كما في المثال التالي:
' infinite loop
i=0
Do While 1=1
i=i+1
wscript.echo i
Loop
' another of the same kind
i=0
Do While true
i=i+1
wscript.echo i
Loop
إذا قمت بتشغيل البرنامج السابق، فلن تتوقف الحلقة الأولى من تلقاء نفسها أبدًا. يمكنك إجبارها على التوقف بالضغط على CTRL-C على لوحة المفاتيح (اضغط على مفتاحي CTRL و C في نفس الوقت).
3.14.3. إنهاء تنفيذ البرنامج
تقوم عبارة wscript.quit n بإنهاء البرنامج عن طريق إرجاع رمز خطأ يساوي n. في نظام DOS، يمكن التحقق من رمز الخطأ هذا باستخدام عبارة if ERRORLEVEL n، والتي تعطي نتيجة صحيحة إذا كان رمز الخطأ الذي أرجعه آخر برنامج تم تنفيذه >=n. انظر إلى البرنامج التالي ونتائجه:
![]() |
فور تشغيل البرنامج، يتم إصدار الأوامر الثلاثة التالية في نظام DOS:
يتحقق الأمر DOS 1 مما إذا كان رمز الخطأ الذي أعاده البرنامج >=5. إذا كان الأمر كذلك، فإنه يعرض (echo) 5؛ وإلا، فلا شيء.
يتحقق الأمر DOS 3 مما إذا كان رمز الخطأ الذي أعاده البرنامج >=4. إذا كان الأمر كذلك، فإنه يعرض 4؛ وإلا، فلا شيء.
يتحقق الأمر 5 في DOS مما إذا كان رمز الخطأ الذي أعاده البرنامج >=3. إذا كان الأمر كذلك، فإنه يعرض 3؛ وإلا، فلا شيء.
من النتائج المعروضة، يمكننا استنتاج أن رمز الخطأ الذي أعاده البرنامج كان 4.
3.15. مصفوفات بيانات L s في متغير
يمكن أن يحتوي المتغير T على قائمة من القيم. عندئذ نقول إنه مصفوفة. تتمتع المصفوفة T بخصائص متنوعة:
- نصل إلى العنصر i من المصفوفة T باستخدام الصيغة T(i)، حيث i هو عدد صحيح يُسمى مؤشرًا يتراوح بين 0 و n-1 إذا كانت T تحتوي على n عنصرًا.
- يمكن تحديد مؤشر العنصر الأخير في المصفوفة T باستخدام التعبير ubound(T). يكون عدد العناصر في المصفوفة T عندئذ ubound(T)+1. غالبًا ما يُشار إلى هذا الرقم باسم حجم المصفوفة.
- يمكن تهيئة متغير T بمصفوفة فارغة باستخدام الصيغة T=array() أو بسلسلة من العناصر باستخدام الصيغة T=array(element0, element1, ...., elementn)
- يمكنك إضافة عناصر إلى مصفوفة T تم إنشاؤها بالفعل. للقيام بذلك، استخدم العبارة redim preserve T(N)، حيث N هو الفهرس الجديد للعنصر الأخير في المصفوفة T. تسمى هذه العملية تغيير الحجم (redim). تشير الكلمة الرئيسية preserve إلى أنه أثناء تغيير الحجم هذا، يجب الحفاظ على المحتويات الحالية للمصفوفة. في حالة عدم وجود هذه الكلمة الرئيسية، يتم تغيير حجم T ومسح عناصرها.
- العنصر T(i) من المصفوفة T هو من النوع المتغير (variant) وبالتالي يمكن أن يحتوي على أي قيمة، بما في ذلك مصفوفة أخرى. في هذه الحالة، تشير الترميز T(i)(j) إلى العنصر j من المصفوفة T(i).
يتم توضيح هذه الخصائص المختلفة للمصفوفات من خلال البرنامج التالي:
البرنامج | النتائج |
![]() |
تعليقات
- استخدمنا هنا دالة تسمى join، والتي سيتم شرحها بمزيد من التفصيل أدناه.
3.16. تحديد متغيرات المصفوفات ( )
في VBScript، هناك طريقة أخرى لاستخدام المصفوفة: باستخدام متغير مصفوفة. على عكس المتغيرات القياسية، يجب إعلان مثل هذا المتغير باستخدام عبارة dim. هناك عدة إعلانات ممكنة:
- dim array(n) تعلن عن مصفوفة ثابتة من n+1 عنصر مرقمة من 0 إلى n. لا يمكن تغيير حجم هذا النوع من المصفوفات
- dim array() تعلن عن مصفوفة ديناميكية فارغة. يجب تغيير حجمها للاستخدام مع عبارة redim، بنفس الطريقة المتبعة مع متغير يحتوي على مصفوفة
- dim array(n,m) يعلن عن مصفوفة ثنائية الأبعاد تحتوي على (n+1)*(m+1) عنصرًا. يُشار إلى العنصر (i,j) في المصفوفة بـ array(i,j). لاحظ الفرق عن المتغير، حيث كان سيُشار إلى العنصر نفسه بـ array(i)(j).
لماذا يوجد نوعان من المصفوفات المتشابهة جدًّا في النهاية؟ لا تتطرق وثائق VBScript إلى هذا الأمر ولا تشير إلى ما إذا كان أحدهما أكثر كفاءة من الآخر. من الآن فصاعدًا، سنستخدم المصفوفات داخل متغيرات «variant» بشكل حصري تقريبًا في أمثلةنا. ومع ذلك، تجدر الإشارة إلى أن VBScript مشتقة من لغة Visual Basic، التي تحتوي بدورها على أنواع بيانات محددة (عدد صحيح، عدد مزدوج، منطقية، إلخ). في هذه الحالة، إذا احتجنا إلى استخدام مصفوفة من الأعداد الحقيقية، على سبيل المثال، فسيكون متغير المصفوفة أكثر كفاءة من متغير المتغير. عندئذٍ سنعلن شيئًا مثل dim array(1000) كـ double لإعلان مصفوفة من الأعداد الحقيقية، أو ببساطة dim array() كـ double إذا كانت المصفوفة ديناميكية.
فيما يلي مثال يوضح استخدام متغيرات المصفوفات:
البرنامج | النتائج |
![]() |
3.17. L : وظائف split و join
تسمح لك وظائف split و join بتحويل سلسلة إلى مصفوفة والعكس صحيح:
- إذا كان T مصفوفة و car سلسلة، فإن join(T,car) هي سلسلة تتكون من ربط جميع عناصر المصفوفة T، كل عنصر مفصول عن الذي يليه بالسلسلة car. وبالتالي، فإن join(array(1,2,3),"abcd") ستنتج السلسلة "1abcd2abcd3"
- إذا كان C سلسلة تتكون من تسلسل من الحقول مفصولة بالسلسلة car، فإن الدالة split(C,car) ترجع مصفوفة عناصرها هي الأجزاء الفردية من السلسلة C. وبالتالي، فإن split("1abcd2abcd3", "abcd") سترجع المصفوفة (1,2,3)
فيما يلي مثال:
البرنامج | النتائج |
|
3.18. القواميس
يمكننا الوصول إلى عنصر في مصفوفة T عندما نعرف مؤشره i. ويمكن الوصول إليه عندئذٍ باستخدام الترميز T(i). هناك مصفوفات لا يتم الوصول إلى عناصرها بواسطة مؤشر بل بواسطة سلسلة. ومن الأمثلة النموذجية على هذا النوع من المصفوفات القاموس. فعند البحث عن معنى كلمة ما في "Larousse" أو "Le petit Robert"، نصل إليها عن طريق الكلمة. ويمكننا تمثيل هذا القاموس كمصفوفة من عمودين:
كلمة1 | الوصف1 |
كلمة2 | الوصف2 |
كلمة 3 | الوصف 3 |
.... |
يمكننا بعد ذلك كتابة أشياء مثل:
dictionary("word1") = "description1"
dictionary("word2") = "description2"
...
وهذا مشابه لكيفية عمل المصفوفة، باستثناء أن مؤشرات المصفوفة ليست أعدادًا صحيحة بل سلاسل نصية. يُسمى هذا النوع من المصفوفات "القاموس" (أو المصفوفة الترابطية، أو جدول التجزئة)، وتُسمى مؤشرات السلاسل النصية "مفاتيح القاموس". تُستخدم القواميس بكثرة في عالم الحوسبة. لدينا جميعًا بطاقة ضمان اجتماعي عليها رقم. هذا الرقم يُعرفنا بشكل فريد ويتيح الوصول إلى المعلومات المتعلقة بنا. في النموذج dictionary("key")="information"، سيكون "key" هو رقم الضمان الاجتماعي، و"information" هي جميع المعلومات المخزنة عنا على أجهزة كمبيوتر الضمان الاجتماعي.
في Windows، يوجد كائن ActiveX يسمى "Scripting.Dictionary" يتيح لك إنشاء القواميس وإدارتها. كائن ActiveX هو مكون برمجي يعرض واجهة يمكن استخدامها بواسطة البرامج المكتوبة بلغات مختلفة، طالما أنها تتوافق مع معيار كائن ActiveX. وبالتالي، يمكن استخدام كائن Scripting.Dictionary بواسطة لغات برمجة Windows مثل JavaScript وPerl وPython وC وC++ وVB وVBA وغيرها — وليس فقط VBScript.
1 | يتم إنشاء كائن Scripting.Dictionary باستخدام العبارة التالية set dico=wscript.CreateObject("Scripting.Dictionary") أو ببساطة set dico=CreateObject("Scripting.Dictionary") CreateObject هي طريقة لكائن WScript تُستخدم لإنشاء مثيلات لكائنات ActiveX. يُظهر الإصدار 2 أن wscript يمكن أن يكون كائنًا ضمنيًا. عندما يتعذر "تحويل" طريقة إلى كائن، سيحاول حاوية WSH تحويلها إلى كائن wscript. |
2 | بمجرد إنشاء القاموس، يمكننا إضافة عناصر إليه باستخدام طريقة add: dico.add "key",value سيؤدي ذلك إلى إنشاء إدخال جديد في القاموس مرتبط بالمفتاح "key". القيمة المرتبطة هي متغير يحتوي على أي بيانات. |
3 | لاسترداد القيمة المرتبطة بمفتاح معين، نستخدم طريقة item الخاصة بالقاموس: var = dic.item("key") أو set var = dic.item("key") إذا كانت القيمة المرتبطة بالمفتاح كائنًا. |
4 | يمكن استرداد جميع المفاتيح الموجودة في القاموس في مصفوفة متغيرات باستخدام طريقة `keys`: keys = dic.keys keys هو مصفوفة يمكن تكرار عناصرها. |
5 | يمكن استرداد جميع القيم الموجودة في القاموس في مصفوفة متغيرة باستخدام طريقة items: القيم = dic.items items هي مصفوفة يمكن تكرار عناصرها. |
6 | يمكن التحقق من وجود مفتاح باستخدام طريقة exists: dico.exists("key") تكون صحيحة إذا كان المفتاح "key" موجودًا في القاموس |
7 | يمكنك إزالة إدخال من القاموس (مفتاح+قيمة) باستخدام طريقة remove: dico.remove("key") تزيل الإدخال من القاموس المرتبط بالمفتاح "key". dico.removeall تزيل جميع المفاتيح، أي تفرغ القاموس. |
يستخدم البرنامج التالي هذه الخيارات المختلفة:
البرنامج
' creating and using a dictionary
Set dico=CreateObject("Scripting.Dictionary")
' dico filling
dico.add "clé1","valeur1"
dico.add "clé2","valeur2"
dico.add "clé3","valeur3"
' number of elements
wscript.echo "Le dictionnaire a " & dico.count & " éléments"
' kEY LIST
wscript.echo "liste des clés"
cles=dico.keys
For i=0 To ubound(cles)
wscript.echo cles(i)
Next
' list of values
wscript.echo "liste des valeurs"
valeurs=dico.items
For i=0 To ubound(valeurs)
wscript.echo valeurs(i)
Next
' list of keys and values
wscript.echo "liste des clés et valeurs"
cles=dico.keys
For i=0 To ubound(cles)
wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
' item search
' key1
If dico.exists("clé1") Then
wscript.echo "La clé clé1 existe dans le dictionnaire et la valeur associée est " & dico.item("clé1")
Else
wscript.echo "La clé clé1 n'existe pas dans le dictionnaire"
End If
' key4
If dico.exists("clé4") Then
wscript.echo "La clé clé4 existe dans le dictionnaire et la valeur associée est " & dico.item("clé4")
Else
wscript.echo "La clé clé4 n'existe pas dans le dictionnaire"
End If
' remove key 1
dico.remove("clé1")
' list of keys and values
wscript.echo "liste des clés et valeurs après suppression de clé1"
cles=dico.keys
For i=0 To ubound(cles)
wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
' we do away with everything
dico.removeall
' list of keys and values
wscript.echo "liste des clés et valeurs après suppression de tous les éléments"
cles=dico.keys
For i=0 To ubound(cles)
wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
' end
wscript.quit 0
النتائج
Le dictionnaire a 3 éléments
liste des clés
clé1
clé2
clé3
liste des valeurs
valeur1
valeur2
valeur3
liste des clés et valeurs
dico(clé1)=valeur1
dico(clé2)=valeur2
dico(clé3)=valeur3
La clé clé1 existe dans le dictionnaire et la valeur associée est valeur1
La clé clé4 n'existe pas dans le dictionnaire
liste des clés et valeurs après suppression de clé1
dico(clé2)=valeur2
dico(clé3)=valeur3
liste des clés et valeurs après suppression de tous les éléments
3.19. فرز مصفوفة أو قاموس
من الشائع الرغبة في فرز مصفوفة أو قاموس بترتيب تصاعدي أو تنازلي حسب قيمها أو، بالنسبة للقاموس، حسب مفاتيحها. في حين أن معظم اللغات تحتوي على وظائف فرز، لا يبدو أن هناك أي منها في VBScript. وهذا يعد عيبًا.
3.20. معلمات البرنامج
من الممكن استدعاء برنامج VBScript عن طريق تمرير معلمات إليه، كما في:
وهذا يسمح للمستخدم بتمرير المعلومات إلى البرنامج. كيف يسترد البرنامج هذه المعلومات؟ لنلقِ نظرة على البرنامج التالي:
البرنامج | النتائج |
![]() |
تعليقات
- WScript.Arguments هي مجموعة من الحجج التي تم تمريرها إلى البرنامج النصي
- مجموعة C هي كائن يحتوي على
- خاصية count، وهي عدد العناصر في المجموعة
- طريقة C(i) التي تُرجع العنصر i من المجموعة
3.21. تطبيق أول: الضرائب
نقترح كتابة برنامج لحساب ضريبة دافع الضرائب. نأخذ في الاعتبار الحالة المبسطة لدافع الضرائب الذي لا يبلغ سوى عن راتبه:
- يُحسب عدد الحصص الخاصة بالموظف على النحو التالي: nbParts = nbEnfants / 2 + 1 إذا كان الموظف غير متزوج، أو nbEnfants / 2 + 2 إذا كان الموظف متزوجًا، حيث nbEnfants هو عدد الأطفال.
- نحسب دخله الخاضع للضريبة R = 0.72 * S، حيث S هو راتبه السنوي
- نحسب معامل الأسرة Q = R / N
نحسب ضريبتهم I بناءً على البيانات التالية
12620.0 | 0 | 0 |
13,190 | 0.05 | 631 |
15,640 | 0.1 | 1,290.5 |
24,740 | 0.15 | 2,072.5 |
31,810 | 0.2 | 3,309.5 |
39,970 | 0.25 | 4,900 |
48,360 | 0.3 | 6,898.5 |
55,790 | 0.35 | 9,316.5 |
92,970 | 0.4 | 12,106 |
127,860 | 0.45 | 16,754.5 |
151,250 | 0.50 | 23,147.5 |
172,040 | 0.55 | 30,710 |
195,000 | 0.60 | 39,312 |
0 | 0.65 | 49,062 |
يحتوي كل صف على 3 حقول. لحساب الضريبة I، نبحث عن الصف الأول الذي يكون فيه QF <= الحقل 1. على سبيل المثال، إذا كان QF = 30000، فسنجد الصف
الضريبة I تساوي إذن 0.15*R - 2072.5*nbParts. إذا كان QF بحيث لا تتحقق الشرط QF<=field1 أبدًا، يتم استخدام المعاملات من الصف الأخير. هنا:
مما يعطي الضريبة I = 0.65*R - 49062*nbParts.
البرنامج كالتالي:
البرنامج
' calculating a taxpayer's tax liability
' the program must be called with three parameters: married children salary
' married: character Y if married, N if unmarried
' children: number of children
' salary: annual salary without cents
' no verification of data validity is performed, but we do
' check that there are three of them
' mandatory variable declaration
Option Explicit
' we check that there are 3 arguments
Dim nbArguments
nbArguments=wscript.arguments.count
If nbArguments<>3 Then
wscript.echo "Syntaxe : pg marié enfants salaire"
wscript.echo "marié : caractère O si marié, N si non marié"
wscript.echo "enfants : nombre d'enfants"
wscript.echo "salaire : salaire annuel sans les centimes"
' stop with error code 1
wscript.quit 1
End If
' retrieve arguments without checking their validity
Dim marie, enfants, salaire
If wscript.arguments(0) = "O" Or wscript.arguments(0)="o" Then
marie=true
Else
marie=false
End If
' children is an integer
enfants=cint(wscript.arguments(1))
' salary is a long integer
salaire=clng(wscript.arguments(2))
' we define the data needed to calculate the tax in 3 tables
Dim limites, coeffn, coeffr
limites=array(12620,13190,15640,24740,31810,39970,48360, _
55790,92970,127860,151250,172040,195000,0)
coeffr=array(0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45, _
0.5,0.55,0.6,0.65)
coeffn=array(0,631,1290.5,2072.5,3309.5,4900,6898.5,9316.5, _
12106,16754.5,23147.5,30710,39312,49062)
' the number of shares is calculated
Dim nbParts
If marie=true Then
nbParts=(enfants/2)+2
Else
nbParts=(enfants/2)+1
End If
If enfants>=3 Then nbParts=nbParts+0.5
' we calculate the family quotient and taxable income
Dim revenu, qf
revenu=0.72*salaire
qf=revenu/nbParts
' tax calculation
Dim i, impot
i=0
Do While i<ubound(limites) And qf>limites(i)
i=i+1
Loop
impot=int(revenu*coeffr(i)-nbParts*coeffn(i))
' the result is displayed
wscript.echo "impôt=" & impot
' leave without error
wscript.quit 0
النتائج
تعليقات:
- يستخدم البرنامج ما تمت تغطيته سابقًا (إعلانات المتغيرات، الوسيطات، تحويلات الأنواع، الاختبارات، الحلقات، المصفوفة في متغير)
- لا يتحقق البرنامج من صحة البيانات، وهو أمر غير معتاد في البرامج الحقيقية
- تشكل حلقة while وحدها التحدي. وهي تسعى إلى تحديد الفهرس i لمصفوفة limits الذي يكون فيه limits(i) > qf، وذلك لـ i < ubound(limits) (أي، هنا i < 13) لأن العنصر الأخير من مصفوفة limits غير مهم. وقد أُضيف فقط حتى يمكن إجراء الاختبار [Do While i<ubound(limits) And qf>limits(i)] لـ i=13. يصبح الاختبار عندئذٍ 13<13 و qf>limits(13)، وبالتالي (في VBScript) يجب أن يكون limits(13) موجودًا. عند الخروج من حلقة while، تُستخدم آخر قيمة محسوبة لـ i لحساب الضريبة: [tax = Int(income * coeffr(i) - nbParts * coeffn(i))].









































