Skip to content

3. مبانی برنامه‌نویسی VBSCRIPT

پس از توصیف زمینه‌های اجرایی ممکن برای یک اسکریپت VBScript، اکنون به خود زبان می‌پردازیم. در سراسر بخش باقی‌مانده، ما شرایط زیر را در نظر می‌گیریم:

  1. محفظهٔ اسکریپت WSH است
  2. اسکریپت در فایلی با پسوند .vbs قرار دارد

برای معرفی یک مفهوم، معمولاً به شرح زیر عمل می‌کنیم:

  • در صورت لزوم، مفهوم را معرفی می‌کنیم
  • یک برنامهٔ نمونه همراه با نتایج آن ارائه می‌دهیم
  • در صورت لزوم، درباره نتایج و برنامه توضیح می‌دهیم

کانتینرهای VBScript در متن اسکریپت نسبت به حروف بزرگ و کوچک حساس نیستند. بنابراین، می‌توانید به صورت wscript.echo "hello" یا WSCRIPT.ECHO "hello" بنویسید.

برنامه‌های ارائه‌شده در زیر حجم زیادی متن را روی صفحه نمایش می‌دهند، بنابراین روش‌های نوشتن در شیء wscript را مجدداً بررسی خواهیم کرد.

3.1. نمایش اطلاعات

ما قبلاً از متد echo از شیء wscript استفاده کرده‌ایم، اما شیء دوم متدهای دیگری برای خروجی گرفتن به صفحه نمایش دارد، همانطور که در اسکریپت زیر نشان داده شده است:

برنامه
نتایج
1
2
3
4
un
deuxtrois
quatre
cinq

لطفاً به نکات زیر توجه کنید:

  • هر متنی که پس از علامت تکی قرار گیرد، به‌عنوان نظر (comment) در اسکریپت در نظر گرفته می‌شود و توسط WSH (خط ۱) تفسیر نمی‌شود.
  • متد echo آرگومان‌های خود را می‌نویسد و به خط بعدی می‌رود، و همین‌طور متد writeLine (خطوط ۲ و ۶)
  • متد write آرگومان‌های خود را می‌نویسد و به خط بعدی نمی‌رود (خط ۳)
  • نشانگر پایان خط با دنباله‌ای از دو کاراکتر با کدهای ASCII 13 و 10 نشان داده می‌شود. بنابراین، خط ۴ با عبارت chr(13) & chr(10) نمایش داده می‌شود، که در آن chr(i) کد کاراکتری ASCII i و & عملگر الحاق رشته‌ها است. بنابراین، «chat» & «eau» رشته «chateau» را تشکیل می‌دهد.
  • کاراکتر پایان خط را می‌توان به سادگی‌تر با ثابت vbCRLF (خط ۵) نشان داد

3.2. E : نوشتن دستورها در یک اسکریپت VBScript

به طور پیش‌فرض، هر دستور در یک خط نوشته می‌شود. با این حال، می‌توان چندین دستور را با جدا کردن آن‌ها با کاراکتر :، مانند inst1:inst2:inst3، در یک خط واحد نوشت. اگر یک خط بیش از حد طولانی باشد، می‌توان آن را به چند قسمت تقسیم کرد. در این صورت، هر یک از بخش‌های مختلف دستور باید با دو کاراکتر (فاصله)_ پایان یابد. بیایید مثال قبلی را در نظر بگیریم و دستورالعمل‌ها را به روشی متفاوت بازنویسی کنیم:

برنامه
نتایج
1
2
3
4
un
deuxtrois
quatre
cinq

3.3. نوشتن با استفاده از تابع msgBox

در حالی که در این سند ما تقریباً منحصراً از شیء wscript برای نوشتن روی صفحه استفاده می‌کنیم، یک تابع پیشرفته‌تر برای نمایش اطلاعات در یک پنجره وجود دارد. این تابع msgbox است که عموماً با سه پارامتر استفاده می‌شود:

msgbox پیام، آیکون‌ها+دکمه‌ها، عنوان

  • message متنی است که باید نمایش داده شود
  • icons+buttons (اختیاری) در واقع عددی است که نوع آیکون و دکمه‌های قرار داده شده در پنجره پیام را مشخص می‌کند. این عدد معمولاً مجموع دو عدد است: عدد اول آیکون و عدد دوم دکمه‌ها را تعیین می‌کند.
  • title متنی است که در نوار عنوان پنجره پیام نمایش داده می‌شود.

مقادیر قابل استفاده برای مشخص کردن آیکون و دکمه‌ها در پنجره نمایش به شرح زیر است:

ثابت
مقدار
توضیحات
vbOKOnly
   0
تنها دکمه OK را نمایش می‌دهد.
vbOKCancel
   ۱
دکمه‌های OK و لغو را نمایش می‌دهد.
vbAbortRetryIgnore
   2
دکمه‌های لغو، تکرار و نادیده گرفتن را نمایش می‌دهد.
vbYesNoCancel
   ۳
نمایش دکمه‌های بله، نه و لغو.
vbYesNo
   ۴
نمایش دکمه‌های بله و نه.
vbRetryCancel
   ۵
دکمه‌های «تکرار» و «لغو» را نمایش می‌دهد.
vbCritical
16
آیکون پیام حیاتی را نمایش می‌دهد.
vbQuestion
۳۲
آیکون درخواست هشدار را نمایش می‌دهد.
vbExclamation
۴۸
آیکون پیام هشدار را نمایش می‌دهد.
vbInformation
۶۴
آیکون پیام اطلاعاتی را نمایش می‌دهد.
vbDefaultButton1
   0
دکمهٔ اول، دکمهٔ پیش‌فرض است.
vbDefaultButton2
۲۵۶
دکمه دوم، دکمه پیش‌فرض است.
vbDefaultButton3
۵۱۲
دکمه سوم دکمه پیش‌فرض است.
vbDefaultButton4
768
دکمه چهارم دکمه پیش‌فرض است.
vbApplicationModal
   0
برنامهٔ مدال؛ کاربر باید قبل از ادامهٔ کار در برنامهٔ جاری به پیام پاسخ دهد.
vbSystemModal
۴۰۹۶
سیستم مدال؛ تمام برنامه‌ها معلق می‌شوند تا زمانی که کاربر به پیام پاسخ دهد.

در اینجا چند مثال آورده شده است:

برنامه
نتایج
  
   
   

در برخی موارد، یک پنجره اطلاعاتی نمایش داده می‌شود که به عنوان یک پنجره ورودی نیز عمل می‌کند. اگر سؤالی مطرح شود، برای مثال، می‌خواهیم بدانیم که آیا کاربر روی دکمه oui یا دکمه non کلیک کرده است. تابع msgBox نتیجه‌ای را بازمی‌گرداند که در برنامه قبلی از آن استفاده نکردیم. این نتیجه یک عدد صحیح است که دکمه‌ای را که کاربر برای بستن پنجره نمایش استفاده کرده نشان می‌دهد:

ثابت
مقدار
دکمه انتخاب‌شده
vbOK
۱
OK
vbCancel
۲
لغو
vbAbort
۳
پس‌گیری
vbRetry
۴
دوباره تلاش کنید
vbIgnore
۵
عبور
vbYes
۶
بله
vbNo
۷
خیر

برنامه زیر نشان می‌دهد چگونه از نتیجه تابع msgBox استفاده کنیم. پنجره‌ای شامل دکمه‌های «بله»، «خیر» و «لغو» چهار بار نمایش داده می‌شود. کاربر به شرح زیر پاسخ می‌دهد:

  1. روی «بله» کلیک کنید
  2. روی «خیر» کلیک می‌کند
  3. کلیک روی «لغو»
  4. پنجره را بدون استفاده از هیچ دکمه‌ای ببندید. برنامه نشان می‌دهد که این کار معادل کلیک روی دکمه لغو است.
برنامه
نتایج

3.4. داده‌های s که می‌توان در VBScript استفاده کرد

VBscript تنها یک نوع داده را تشخیص می‌دهد: واریانت. مقدار یک واریانت می‌تواند یک عدد (4, 10.2)، یک رشته ("hello")، یک مقدار بولی (true/false)، یک تاریخ (#01/01/2002#)، آدرس یک شیء، یا مجموعه‌ای از تمام این انواع داده‌ها که در ساختاری به نام آرایه سازماندهی شده‌اند، باشد.

بیایید برنامه زیر و نتایج آن را بررسی کنیم:

برنامه
نتایج
4
i=4
10,2
r1=10,2
0,014
r2=0,014
c1=bonjour
01/10/02
d1=01/10/02
10/01/02
d2=10/01/02
-1
b1=Vrai
0
b2=Faux
v=4
v=10,2
v=bonjour
v=01/10/02
v=Vrai

توضیحات:

  • تعداد زیادی از زبان‌های برنامه‌نویسی (C، C++، پاسکال، جاوا، C# و غیره) نیاز دارند که متغیر قبل از استفاده اعلام شود. این اعلام شامل مشخص کردن نام متغیر و نوع داده‌ای است که می‌تواند در خود نگهداری کند (اعدادی، اعشاری، رشته‌ای، تاریخ، بولین و غیره). اعلام متغیرها چندین هدف را دنبال می‌کند:
    • تعیین فضای حافظه مورد نیاز برای متغیر، زیرا انواع داده مختلف به مقادیر متفاوتی از حافظه نیاز دارند
    • برای بررسی سازگاری برنامه. بنابراین، اگر i یک عدد صحیح و c یک رشته باشد، ضرب کردن i در c بی‌معنی است. اگر انواع متغیرهای i و c توسط برنامه‌نویس اعلام شده باشند، برنامه‌ای که مسئول تجزیه و تحلیل کد قبل از اجرا است، ممکن است چنین ناسازگاری‌ای را علامت‌گذاری کند.

مانند اکثر زبان‌های اسکریپتی تک‌نوعی (Perl، Python، JavaScript و غیره)، VBScript اجازه می‌دهد متغیرها بدون تعریف شدن استفاده شوند. این کاری است که در مثال بالا انجام شده است.

  • به نحو (syntax) انواع مختلف داده توجه کنید
    • 10.2 در خط 10 (نقطه اعشاری به جای ویرگول). توجه کنید که 10.2 روی صفحه نمایش داده می‌شود.
    • 1.4e-2 در خط ۱۳ (نمایش علمی). عدد 0.014 نمایش داده می‌شود
    • [#01/10/2002#] (خط ۲۶) برای نمایش تاریخ ۱۰ ژانویه ۲۰۰۲. بنابراین VBScript از فرمت #mm/dd/yyyy# برای نمایش تاریخ jj در ماه mm از سال aaaa استفاده می‌کند.
    • متغیرهای بولی true و false در خطوط 31 و 34. این دو مقدار به ترتیب با اعداد صحیح -1 و 0 نمایش داده می‌شوند، همان‌طور که در خطوط 32 و 35 نشان داده شده است. وقتی یک مقدار بولی با یک رشته متنی الحاق می‌شود، این مقادیر به ترتیب به رشته‌های «True» و «False» تبدیل می‌شوند، همان‌طور که در خطوط ۳۳ و ۳۶ نشان داده شده است. شایان ذکر است که عملگر الحاق & می‌تواند برای الحاق چیزهایی غیر از رشته‌های متنی نیز استفاده شود.
  • از آنجا که متغیر v نوع مشخصی ندارد، می‌تواند به مرور زمان مقادیری با انواع مختلف را در خود جای دهد.

3.5. : زیرنوع‌های نوع واریانت

در اینجا آنچه مستندات رسمی در مورد انواع مختلف داده‌هایی که یک واریانت می‌تواند در خود داشته باشد، می‌گوید:

فراتر از تمایز ساده بین اعداد و رشته‌ها، یک واریانت می‌تواند بین انواع مختلف اطلاعات عددی تمایز قائل شود. به عنوان مثال، برخی از اطلاعات عددی نشان‌دهنده یک تاریخ یا یک زمان هستند. هنگامی که این اطلاعات با سایر داده‌های تاریخ یا زمان استفاده می‌شود، نتیجه همیشه به صورت یک تاریخ یا یک زمان بیان می‌شود. انواع دیگری از اطلاعات عددی نیز در دسترس هستند، از مقادیر بولی گرفته تا اعداد اعشاری بزرگ. این دسته‌های مختلف اطلاعات که می‌توانند در یک Variant جای بگیرند، به عنوان زیرنوع‌ها (subtypes) شناخته می‌شوند. در اکثر موارد، شما به سادگی داده‌های خود را در یک Variant قرار می‌دهید و آن بسته به آن داده‌ها، مناسب‌ترین رفتار را از خود نشان می‌دهد.

جدول زیر، زیرنوع‌های مختلفی را که می‌توانند در یک Variant جای گیرند، فهرست می‌کند.

زیرنوع
توضیحات
خالی
Variant مقداردهی اولیه نشده است. مقدار آن برای متغیرهای عددی صفر و برای متغیرهای رشته‌ای یک رشتهٔ خالی ("") است.
نامعتبر
متغیر عمداً حاوی داده‌های نادرست است.
منطقی
مقدار True یا False را در خود دارد.
بایت
یک عدد صحیح از 0 تا 255 را در خود جای می‌دهد.
پوئنتی
شامل یک عدد صحیح از -32,768 تا 32,767.
واحد پول
-۹۲۲٬۳۳۷٬۲۰۳٬۶۸۵٬۴۷۷٫۵۸۰۸ تا ۹۲۲٬۳۳۷٬۲۰۳٬۶۸۵٬۴۷۷٫۵۸۰۷.
طولانی
شامل یک عدد صحیح از -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 برای مقادیر مثبت.
تاریخ (زمان)
شماره‌ای را در بر می‌گیرد که نمایانگر تاریخی بین ۱ ژانویه ۱۰۰ و ۳۱ دسامبر ۹۹۹۹ است.
رشته
شامل یک رشته با طول متغیر است که تقریباً به ۲ میلیارد کاراکتر محدود می‌شود.
شیء
شامل یک شیء است.
خطا
شامل شماره خطا است.

3.6. از C برای تعیین نوع دقیق داده‌های موجود در یک واریانت استفاده کنید

یک متغیر از نوع «variant» می‌تواند داده‌هایی از انواع مختلف را در خود جای دهد. گاهی اوقات لازم است ماهیت دقیق این داده‌ها را بدانیم. اگر در یک برنامه produit=nombre1*nombre2 را بنویسیم، فرض می‌کنیم که nombre1 و nombre2 دو مقدار عددی هستند. گاهی اوقات مطمئن نیستیم، زیرا این مقادیر ممکن است از ورودی صفحه‌کلید، یک فایل یا هر منبع خارجی دیگری آمده باشند. بنابراین باید ماهیت داده‌های ذخیره‌شده در nombre1 و nombre2 را بررسی کنیم. تابع typename(var) به ما امکان می‌دهد تا نوع داده‌ی موجود در متغیر var را تعیین کنیم. در اینجا چند مثال آورده شده است:

برنامه
نتایج
var=1,type=Integer
var=deux,type=String
var=Vrai,type=Boolean
var=4,5,type=Double
var=11/10/01,type=Date

یک تابع احتمالی دیگر vartype(var) است که عددی را بازمی‌گرداند که نشان‌دهنده نوع داده‌ای است که در متغیر var وجود دارد:

ثابت
مقدار
توضیحات
vbEmpty
0
خالی (ابتدایی‌سازی نشده)
vbNull
۱
Null (داده‌ای معتبر نیست)
vbInteger
2
پوئنتی
vbLong
۳
پوئنتر عدد صحیح بلند
vbSingle
4
عدد اعشاری تک‌دقت
vbDouble
۵
عدد ممیز شناور با دقت دوگانه
vbCurrency
۶
واحد پول
vbDate
۷
تاریخ
vbString
8
رشته
vbObject
۹
شیء اتوماسیون
vbError
10
خطا
vbBoolean
11
منطقی
vbVariant
12
نوع (فقط با آرایه‌های نوع استفاده می‌شود)
vbDataObject
۱۳
شیء غیر اتوماسیون
vbByte
17
بایت
vbArray
8192
جدول

توجه: این ثابت‌ها توسط VBScript مشخص شده‌اند. در نتیجه، می‌توان از این نام‌ها در هر جای کد خود به جای مقادیر واقعی استفاده کرد.

اطلاعات فوق از مستندات VBscript گرفته شده است. این اطلاعات گاهی نادرست است، احتمالاً به دلیل خطاهای کپی-پیست از مستندات VB. تابع vartype از VBScript تنها بخشی از آنچه در بالا توصیف شده را انجام می‌دهد.

برنامه قبلی که برای vartype بازنویسی شده است، نتایج زیر را تولید می‌کند:

برنامه
نتایج
var=1,type=2
var=deux,type=8
var=Vrai,type=11
var=4,5,type=5
var=11/10/01,type=7

3.7. D اعلام متغیرهای مورد استفاده در اسکریپت

ما اشاره کرده‌ایم که اعلام متغیرهای مورد استفاده توسط اسکریپت اجباری نیست. در این صورت، اگر بنویسیم:


1) somme=4
...
2) somme=smme+10

اگر در خط ۲ یک اشتباه تایپی – smme به‌جای 'somme' – وجود داشته باشد، VBScript هیچ خطایی گزارش نخواهد کرد. این فرض را می‌کند که smme یک متغیر جدید است. آن را ایجاد می‌کند و در چارچوب خط ۲ با مقداردهی اولیه ۰ از آن استفاده می‌کند.

خطاهای از این دست می‌توانند ردیابی بسیار دشواری داشته باشند. بنابراین توصیه می‌شود با قرار دادن دستور Option Explicit در ابتدای اسکریپت، اعلام متغیرها را اجباری کنید. پس از آن، هر متغیر باید قبل از اولین استفاده با دستور Dim اعلام شود:


option explicit
...
dim somme
1) somme=4
...
2) somme=smme+10

در این مثال، VBScript نشان خواهد داد که یک متغیر اعلام‌نشده وجود دارد، همانند مورد ۲)، همانطور که در مثال زیر نشان داده شده است:

برنامه
نتایج
dim1.vbs(9, 1) Erreur d'exécution Microsoft
 VBScript: Variable non définie: 'smme'

با اینکه در مثال‌های کوتاه این سند، متغیرها عمدتاً تعریف نشده‌اند، ما اطمینان حاصل خواهیم کرد که به محض شروع نوشتن اولین اسکریپت‌های معنادار، آن‌ها را تعریف کنیم. سپس دستور Option Explicit به صورت سیستماتیک به کار گرفته خواهد شد.

3.8. تابع‌های تبدیل

VBScript داده‌های واریانت را بسته به زمینه به رشته‌ها، اعداد، بولین‌ها و غیره تبدیل می‌کند. در بیشتر موارد، این کار به خوبی انجام می‌شود، اما گاهی اوقات می‌تواند به برخی شگفتی‌ها منجر شود، همانطور که بعداً خواهیم دید. بنابراین ممکن است بخواهید نوع داده وریانت را «اجباری» کنید. VBscript دارای توابع تبدیل است که یک عبارت را به انواع مختلف داده تبدیل می‌کنند. در اینجا چند نمونه از آنها آورده شده است:

Cint (expression)
بیان را به یک عدد صحیح کوتاه تبدیل می‌کند
Clng (expression)
بیان را به عدد صحیح بلند (long) تبدیل می‌کند
Cdbl (expression)
بیان را به یک عدد ممیز شناور با دقت دوگانه تبدیل می‌کند (double)
Csng (expression)
بیان را به عدد حقیقی با دقت تک (single) تبدیل می‌کند
Ccur (expression)
یک عبارت را به مقدار ارزی تبدیل می‌کند (currency)

در اینجا چند مثال آورده شده است:

برنامه
نتایج
var=4,code type=8,nom type=String
var=4,code type=2,nom type=Integer
var=1000000,code type=8,nom type=String
var=1000000,code type=3,nom type=Long
var=3,4e-5,code type=8,nom type=String
var=0,000034,code type=5,nom type=Double
var=3,4e-5,code type=8,nom type=String
var=0,000034,code type=4,nom type=Single
var=1000,45,code type=8,nom type=String
var=1000,45,code type=6,nom type=Currency
var=14,code type=2,nom type=Integer
var=14,code type=8,nom type=String
var=1000,45,code type=5,nom type=Double
var=1000,code type=2,nom type=Integer
var=1000,75,code type=5,nom type=Double
var=1001,code type=2,nom type=Integer

3.9. داده‌های s تایپ‌شده روی صفحه‌کلید

شیء wscript به یک اسکریپت امکان می‌دهد داده‌های واردشده از طریق صفحه‌کلید را بازیابی کند. متد wscript.stdin.readLine اجازه می‌دهد یک خط متن واردشده از طریق صفحه‌کلید و تأییدشده با فشردن کلید «Enter» خوانده شود. این خط را می‌توان به یک متغیر اختصاص داد.

برنامه
نتایج

Tapez votre nom : st
Bonjour st

توضیحات:

  • در ستون نتایج، در ردیف با برچسب [Tapez votre nom : st]، st متنی است که توسط کاربر وارد شده است.

اگر متنی که روی صفحه‌کلید تایپ شده نمایانگر یک عدد باشد، همچنان در وهله اول به عنوان یک رشته کاراکتری در نظر گرفته می‌شود، همانطور که در مثال زیر نشان داده شده است:

برنامه
نتایج
Tapez un nombre : 14
nombre lu=14,type=String

اگر این عدد در یک عملیات حسابداری استفاده شود، VBscript به‌طور خودکار رشته را به عدد تبدیل می‌کند، اما همیشه این اتفاق نمی‌افتد. بیایید به مثال زیر نگاه کنیم:

برنامه
نتایج
1
2
3
4
5
6
nombre1 : 3
nombre2 : 4
3+4=34
3-4=-1
3x4=12
3/4=0,75

در نتایج، می‌توانیم ببینیم که خط ۸ اسکریپت طبق انتظار اجرا نشده است؛ این به این دلیل است که (متأسفانه) در VBScript، عملگر + دو معنی دارد: جمع دو عدد یا الحاق دو رشته (دو رشته به هم متصل می‌شوند). ما قبلاً دیدیم که اعدادی که روی صفحه‌کلید تایپ می‌شوند، به صورت رشته‌های کاراکتری خوانده می‌شوند و VBScript آن‌ها را در صورت نیاز به عدد تبدیل می‌کند. این کار را برای عملیات‌های -، * و / که فقط می‌توانند شامل اعداد باشند، به درستی انجام داد، اما برای عملگر + که می‌تواند شامل رشته‌ها نیز باشد، اینطور عمل نکرد. در اینجا، فرض شده است که ما قصد داریم رشته‌ها را به هم متصل کنیم.

یک راه‌حل ساده برای این مشکل، تبدیل رشته‌ها به عدد به محض خوانده شدن آنهاست، همانطور که در بهبودی که در برنامه قبلی ارائه شده است نشان داده شده است:

برنامه
نتایج
nombre1 : 3
nombre1=3,type=String
nombre1=3,type=Long
nombre2 : 4
nombre2=4,type=String
nombre2=4,type=Long
3+4=7
3-4=-1
3x4=12
3/4=0,75

3.10. S وارد کردن داده‌ها با استفاده از تابع inputbox

ممکن است بخواهید به جای استفاده از صفحه‌کلید، داده‌ها را از طریق یک رابط گرافیکی وارد کنید. در این صورت، از تابع inputBox استفاده می‌کنید. این تابع پارامترهای متعددی را می‌پذیرد که تنها دو مورد اول آن به طور مکرر استفاده می‌شوند:

response=inputBox(message,title)

  • پیام: سؤالی که از کاربر می‌پرسید
  • عنوان (اختیاری): عنوانی که برای پنجرهٔ ورودی می‌دهید
  • پاسخ: متنی که کاربر تایپ می‌کند. اگر کاربر پنجره را بدون پاسخ دادن بسته باشد، پاسخ یک رشتهٔ خالی است.

در اینجا مثالی آورده شده است که در آن از کاربر نام و سنش پرسیده می‌شود. برای نام، اطلاعاتی وارد کرده و «OK» را انتخاب می‌کنیم. برای سن، نیز اطلاعاتی وارد می‌کنیم اما «Cancel» را انتخاب می‌کنیم.

برنامه
نتایج

3.11. ابژه‌های ساختاریافته U sing

امکان ایجاد اشیاء با متدها و ویژگی‌ها با استفاده از VBScript وجود دارد. برای سادگی، در اینجا شیئی را معرفی می‌کنیم که ویژگی‌ها دارد اما متدی ندارد. بیایید یک شخص را در نظر بگیریم. او ویژگی‌های زیادی دارد که او را توصیف می‌کنند: قد، وزن، رنگ پوست، رنگ چشم، رنگ مو و غیره. ما فقط روی دو مورد تمرکز خواهیم کرد: نام و سن او. قبل از اینکه بتوانیم از اشیاء استفاده کنیم، باید قالبی را که به ما امکان ساخت آن‌ها را می‌دهد، ایجاد کنیم. در VBScript، این کار با استفاده از یک کلاس انجام می‌شود. کلاس personne می‌تواند به صورت زیر تعریف شود:


class personne
    Dim nom,age
End class

این عبارت [Dim nom,age] است که دو ویژگی کلاس personne را تعریف می‌کند. برای ایجاد نسخه‌هایی (که به آن‌ها نمونه‌ها گفته می‌شود) از کلاس personne، می‌نویسیم:

set personne1=new personne
set personne2=new personne

چرا ننویسیم

personne1=new personne
personne2=new personne

زیرا یک واریانت نمی‌تواند شامل یک شیء باشد. این واریانت تنها می‌تواند شامل آدرس شیء باشد. وقتی می‌نویسید set person1 = new person، توالی زیر از رویدادها رخ می‌دهد:

  1. یک شیء personne ایجاد می‌شود. این بدان معناست که حافظه برای آن تخصیص داده می‌شود.
  2. آدرس این شیء personne به متغیر personne1 اختصاص داده می‌شود.

سپس ما چیدمان حافظه زیر را برای متغیرهای personne1 و personne2 داریم:

به طور دقیق، می‌توان گفت که personne1 یک شی از نوع personne است. این کنایه قابل قبول است اگر به خاطر داشته باشیم که personne1 در واقع نشانی یک شیء personne است و نه خود شیء personne.

ما گفتیم که یک شیء personne دو ویژگی داشت، nom و age. چگونه می‌توانیم از این ویژگی‌ها استفاده کنیم؟ با استفاده از نشانه‌گذاری objet.propriété، همان‌طور که کمی پیش توضیح داده شد. بنابراین

personne1.nom به نام شخص ۱ و personne1.age به سن او اشاره دارد. در اینجا یک برنامه کوتاه برای نمایش این موضوع آمده است:

برنامه
نتایج
p1=(dupont,18)

برنامه قبلی را می‌توان به صورت زیر اصلاح کرد:

برنامه
نتایج
nom=dupont
age=18

در اینجا از ساختار with ... end with استفاده کرده‌ایم که امکان خارج کردن نام اشیاء از عبارات را فراهم می‌کند. ساختار with p1 ... end with در خطوط 9–12 و 15–18 به ما امکان می‌دهد از دستورات with ... end with استفاده کنیم، که اجازه می‌دهد نام شیء از عبارت‌ها خارج شود. دستور with p1 ... end with در خطوط 9 تا 12 و 15 تا 18 به ما امکان می‌دهد از دستورات .nom به جای p1.nom و .age به جای p1.age استفاده کنیم. این کار نوشتن دستورها را در مواردی که نام یک شیء به‌طور مکرر استفاده می‌شود، ساده‌تر می‌کند.

3.12. مقادیردهی به یک متغیر

دو دستور برای تخصیص مقدار به یک متغیر وجود دارد:

  1. متغیر=بیانیه
  2. متغیر را روی عبارت تنظیم کنید

شکل ۲ برای عبارت‌هایی رزرو شده است که نتیجهٔ آن‌ها ارجاع به یک شیء است. برای سایر انواع عبارت‌ها، از شکل ۱ استفاده می‌شود. تفاوت بین این دو شکل به شرح زیر است:

  • در عبارت variable=expression، به متغیر یک مقدار اختصاص داده می‌شود. اگر v1 و v2 دو متغیر باشند، نوشتن v1=v2 مقدار v1 را به v2 اختصاص می‌دهد. این امر منجر به تکرار یک مقدار در دو مکان مختلف می‌شود. اگر مقدار v2 بعداً تغییر کند، مقدار v1 بدون تغییر باقی می‌ماند.
  • در دستور `set variable=expression`، به متغیر آدرس یک شی تخصیص داده می‌شود. اگر v1 و v2 دو متغیر باشند و v2 آدرس یک شی به نام obj2 باشد، نوشتن `set v1=v2`، مقدار v1 را به v2 تخصیص می‌دهد، یعنی آدرس شی obj2. زمانی که اسکریپت بعداً v1 و v2 را دستکاری می‌کند، این «مقادیر» v1 و v2 نیستند که دستکاری می‌شوند، بلکه اشیایی هستند که v1 و v2 به آن‌ها «اشاره» می‌کنند – در این مورد، همان شیء واحد. ما می‌گوییم که v1 و v2 دو مرجع به یک شیء واحد هستند و دستکاری آن از طریق v1 یا v2 تفاوتی ایجاد نمی‌کند. به عبارت دیگر، تغییر شیء مرجع v2، شیء مرجع v1 را نیز تغییر می‌دهد.

در اینجا یک مثال آورده شده است:

برنامه
نتایج
i=4
j=4
i=4
j=5
p1.nom=dupont
p1.age=18
p1.nom=dupont
p1.age=19
p2.nom=dupont
p2.age=19

3.13. بیان‌های E valuating

عملگرهای اصلی مورد استفاده برای ارزیابی عبارت‌ها به شرح زیر هستند:

نوع عملگر
عملگرها
مثال
اعدادی
+,-,*,/
 
 
بقیه
 
\
 
^
   
مقایسه
<، <=
>, >=
=,<>
a<>b زمانی درست است که a با b برابر نباشد
a=b زمانی درست است که a با b برابر باشد
a و b می‌توانند هر دو عدد باشند یا هر دو رشته. در حالت دوم، string1<string2 اگر در ترتیب الفبایی، string1 قبل از string2 قرار گیرد. هنگام مقایسه رشته‌ها، حروف بزرگ قبل از حروف کوچک در ترتیب الفبایی قرار می‌گیرند.
 
است
   
منطق
و، یا، نه، ایکس‌اور
تمام عملوندها در اینجا مقادیر بولی هستند.
شرط bool1 یا bool2 زمانی درست است که یکی از آن‌ها درست باشد
bool1 and bool2 زمانی درست است که هر دو bool1 و bool2 درست باشند
منفی bool1 زمانی درست است که bool1 نادرست باشد، و بالعکس
bool1 xor bool2 زمانی درست است که تنها یکی از بولی‌ها bool1 یا bool2 درست باشد
   
وصل‌کردن رشته‌ها
&، +
استفاده از عملگر + برای الحاق دو رشته به دلیل احتمال اشتباه با جمع دو عدد توصیه نمی‌شود. بنابراین باید منحصراً از عملگر & استفاده شود.

3.14. C : کنترل اجرای برنامه

3.14.1. E xecute: انجام عملیات شرطی

دستور VBScript که برای انجام عملیات بسته به درست یا نادرست بودن یک شرط استفاده می‌شود، به شرح زیر است:


if expression then
    action-vrai-1
    action-vrai-2
    ..
else
    action-faux-1
    action-faux-2
    ...
end if
ابتدا عبارت expression ارزیابی می‌شود. این عبارت باید یک مقدار بولی داشته باشد. اگر مقدار آن true باشد، عملیات در then اجرا می‌شوند؛ در غیر این صورت، در صورت وجود، عملیات در else اجرا می‌شوند.

در زیر برنامه‌ای آمده است که گونه‌های مختلف عبارت شرطی if-then-else را نشان می‌دهد:

برنامه
نتایج
1
2
3
4
5
3 est plus grand que 0
3 est plus grand que 2
i=4
4 est plus petit que 10
i=3

توضیحات:

  • در VBScript می‌توانید به جای نوشتن هر دستور در یک خط، instruction1:instruction2:... : instructionn را بنویسید. این ویژگی برای مثال در خط ۱۰ استفاده شده است.

3.14.2. اقدامات E xecuting را به طور مکرر اجرا می‌کند

حلقه با تعداد تکرارهای معلوم
for i=idébut to ifin step ipas
    actions
next
  1. متغیر i در اینجا به عنوان متغیر حلقه نامیده می‌شود. می‌توان هر نامی را برای آن انتخاب کرد
  2. متغیر i به مقدار idebut تنظیم می‌شود
  3. مقدار i با ifin مقایسه می‌شود. اگر i ≤ ifin باشد، عملیات بین دستورات for... next اجرا می‌شوند.
  4. `i` به اندازه `ipas` افزایش می‌یابد (`i = i + ipas`)
  5. حلقه به مرحله ۳ بالا بازمی‌گردد. پس از تعداد محدودی گام، مقدار `i` از `ifin` فراتر خواهد رفت. اجرای اسکریپت با دستور بعدی `next` ادامه می‌یابد.
  6. اگر مقدار افزایشی ipas منفی باشد، شرط در مرحله ۳ تغییر می‌کند. عملیات در for...next تنها در صورتی اجرا می‌شوند که i >= ifin باشد.
می‌توانید در هر زمان با استفاده از دستور exit for از حلقه for خارج شوید.
حلقه با تعداد تکرارهای نامعلوم
do while condition
    actions
loop
  1. شرط ارزیابی می‌شود. اگر درست باشد، اقدامات در while...loop اجرا می‌شوند
  2. ممکن است عملیات اجرا شده، مقدار شرط را تغییر داده باشد. فرآیند به مرحلهٔ ۱ بالا بازمی‌گردد.
  3. وقتی عبارت شرطی نادرست می‌شود، حلقه پایان می‌یابد
می‌توانید در هر زمان با استفاده از دستور exit do از حلقه do-while خارج شوید.

برنامه زیر این نکات را نشان می‌دهد:

برنامه
نتایج
i=0,tableau(i)=10,somme=10
i=1,tableau(i)=20,somme=30
i=2,tableau(i)=30,somme=60
i=3,tableau(i)=40,somme=100
i=0,tableau(i)=10,somme=10
i=1,tableau(i)=20,somme=30
i=2,tableau(i)=30,somme=60
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10
i=11
i=1
i=2
i=3
i=4
i=5
i=6

توجه: در مرحله توسعه یک برنامه، غیرمعمول نیست که برنامه به صورت حلقه (c.a.d) درآید و هرگز متوقف نشود. به طور کلی، برنامه یک حلقه را اجرا می‌کند که شرط خروج آن قابل تأیید نیست، همانند مثال زیر:


'حلقه بی‌نهایت
i=0
Do While 1=1
  i=i+1
  wscript.echo i
Loop

' یکی دیگر از همان نوع
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 باشد، برقرار است. برنامه زیر و نتایج آن را در نظر بگیرید:

  
début

بلافاصله پس از اجرای برنامه، سه دستور DOS زیر صادر می‌شوند:

1
2
3
4
5
6
7
C:\>if ERRORLEVEL 5 echo 5

C:\>if ERRORLEVEL 4 echo 4
4

C: >if ERRORLEVEL 3 echo 3
3

دستور DOS 1 بررسی می‌کند که آیا کد خطای بازگشتی برنامه ≥5 است یا خیر. در صورت مثبت بودن، عدد 5 را نمایش می‌دهد؛ در غیر این صورت، هیچ چیزی نمایش نمی‌دهد.

دستور DOS 3 بررسی می‌کند که آیا کد خطای بازگشتی برنامه ≥4 است یا خیر. در صورت مثبت بودن، عدد 4 را نمایش می‌دهد؛ در غیر این صورت، هیچ چیزی نمایش نمی‌دهد.

دستور DOS 5 بررسی می‌کند که آیا کد خطای بازگردانده‌شده توسط برنامه ≥3 است یا خیر. در صورت مثبت بودن، عدد 3 را نمایش می‌دهد؛ در غیر این صورت، هیچ چیزی نمایش نمی‌دهد.

از نتایج نمایش‌داده‌شده می‌توان نتیجه گرفت که کد خطای بازگردانده‌شده توسط برنامه ۴ بوده است.

3.15. آرایه‌های داده s در یک واریانت

یک واریانت T می‌تواند شامل فهرستی از مقادیر باشد. در این صورت به آن آرایه گفته می‌شود. آرایه T دارای ویژگی‌های مختلفی است:

  • برای دسترسی به عنصر i-ام آرایه T می‌توان از عبارت T(i) استفاده کرد، که در آن i یک عدد صحیح به نام شاخص است و در صورتی که T دارای n عنصر باشد، از 0 تا n-1 متغیر است.
  • شاخص آخرین عنصر آرایه 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` است و بنابراین می‌تواند حاوی هر ارزشی، از جمله یک آرایه دیگر، باشد. در این صورت، notation T(i)(j) به عنصر j-ام آرایه T(i) اشاره دارد.

این ویژگی‌های مختلف آرایه‌ها در برنامه زیر نشان داده شده است:

برنامه
نتایج
Le tableau t1 a 5 éléments
t1(0)=1
t1(1)=-4,5
t1(2)=deux
t1(3)=Vrai
t1(4)=10/01/02
t1=1:-4,5:deux:Vrai:10/01/02
t1(5)=10:20:30
t1(5)(1)=20
t1=1 ~ -4,5 ~ deux
t1=:::

نظرات

  • یک تابع به نام `join` در اینجا استفاده شده است؛ این موضوع در ادامه با جزئیات بیشتری توضیح داده شده است.

3.16. متغیرهای آرایه‌ای s

در VBScript، راه دیگری برای استفاده از آرایه وجود دارد که استفاده از یک متغیر آرایه‌ای است. برخلاف متغیرهای اسکالر، چنین متغیری باید با استفاده از دستور dim اعلام شود. اعلام‌های مختلفی ممکن است:

  • `dim array(n)` یک آرایهٔ ایستا با `n+1` عنصر شماره‌گذاری‌شده از 0 تا `n` را اعلام می‌کند. این نوع آرایه قابل تغییر اندازه نیست
  • `dim array()` یک آرایه پویا و خالی را تعریف می‌کند. این آرایه باید برای استفاده از طریق دستور `redim`، به همان شیوه‌ای که برای یک واریانت حاوی آرایه انجام می‌شود، مجدداً اندازه داده شود.
  • `dim array(n,m)` یک آرایه دو بعدی با (n+1)*(m+1) عنصر را تعریف می‌کند. عنصر (i,j) آرایه با `tableau(i,j)` نشان داده می‌شود. تفاوت با یک وریانت را توجه کنید، که در آن عنصر مشابه با `tableau(i)(j)` نشان داده می‌شد.

چرا دو نوع آرایه وجود دارد که در نهایت بسیار شبیه به هم هستند؟ مستندات VBScript به این موضوع اشاره نمی‌کند و همچنین مشخص نمی‌کند که آیا یکی از دیگری کارآمدتر است یا خیر. از این پس، ما در مثال‌هایمان تقریباً به طور انحصاری از آرایه‌ها در داخل یک واریانت استفاده خواهیم کرد. با این حال، باید به این نکته توجه داشت که VBscript از زبان ویژوال بیسیک گرفته شده است، که خود شامل داده‌های تایپ‌شده (integer، double، boolean و غیره) است. در این مورد، اگر به عنوان مثال به آرایه‌ای از اعداد اعشاری نیاز داشته باشیم، متغیر آرایه بهتر از متغیر واریانت عمل خواهد کرد. سپس برای تعریف آرایه‌ای از اعداد حقیقی، چیزی شبیه به dim array(1000) as double یا اگر آرایه پویا باشد، به سادگی dim array() as double را اعلام می‌کنیم.

در اینجا مثالی برای نشان دادن نحوه استفاده از متغیرهای آرایه‌ای آورده شده است:

برنامه
نتایج
Le tableau t1 a 5 éléments
t1(0)=1
t1(1)=-4,5
t1(2)=deux
t1(3)=Vrai
t1(4)=10/01/02
t1=1:-4,5:deux:Vrai:10/01/02
Le tableau t1 a 5 éléments
t2(0)=0
t2(1)(2)=30
t2=:::
t3(0,0)=0
t3(0,1)=1
t3(1,0)=10
t3(1,1)=11

3.17. : توابع 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) را بازمی‌گرداند.

در اینجا یک مثال آورده شده است:

برنامه
نتایج

'تبدیل آرایه به رشته و بالعکس

' آرایه ← رشته
tableau=array("un",2,"trois")
chaine=join(tableau,",")
wscript.echo chaine

' رشته ← آرایه
tableau2=split(chaine,",")
For i=0 To ubound(tableau2)
  wscript.echo tableau2(i)
Next

un,2,trois
un
2
trois

3.18. واژه‌نامه‌ها

یک عنصر از یک آرایه T زمانی قابل دسترسی است که اندیس آن i مشخص باشد. سپس با استفاده از نشانه‌گذاری T(i) قابل دسترسی است. آرایه‌هایی وجود دارند که عناصرشان نه با اندیس، بلکه با یک رشته از کاراکترها قابل دسترسی هستند. یک مثال متداول از این نوع آرایه، یک فرهنگ لغت است. وقتی برای یافتن معنای یک کلمه در «لاروس» یا «لو پتی روبر» جستجو می‌کنید، از طریق خود کلمه به آن دسترسی پیدا می‌کنید. ما می‌توانیم این فرهنگ لغت را به صورت یک آرایه دو ستونی نمایش دهیم:

word1
توضیح۱
word2
توضیحات2
word3
توضیحات ۳
....
 

سپس می‌توانیم چیزهایی مانند زیر را بنویسیم:

dictionary("word1") = "description1"

dictionary("word2") = "description2"

...

این بسیار شبیه نحوه کار یک آرایه است، با این تفاوت که شاخص‌های آرایه اعداد صحیح نیستند، بلکه رشته‌ها هستند. به این نوع آرایه، دیکشنری (یا آرایه انجمنی، جدول هش) گفته می‌شود و شاخص‌های رشته‌ای آن کلیدهای دیکشنری نامیده می‌شوند. دیکشنری‌ها در دنیای رایانش بسیار پرکاربرد هستند. همه ما یک کارت بیمه ملی با یک شماره روی آن داریم. این شماره ما را به‌طور منحصربه‌فرد شناسایی می‌کند و دسترسی به اطلاعات مربوط به ما را فراهم می‌آورد. در مدل dictionary("key")="information"، «key» در اینجا شماره بیمه ملی و «information» تمام اطلاعات ذخیره‌شده درباره ما در کامپیوترهای بیمه ملی خواهد بود.

در ویندوز، یک شیء ActiveX به نام «Scripting.Dictionary» وجود دارد که به شما امکان می‌دهد دیکشنری‌ها را ایجاد و مدیریت کنید. یک شیء ActiveX یک کامپوننت نرم‌افزاری است که یک رابط را در دسترس قرار می‌دهد که توسط برنامه‌های نوشته شده به زبان‌های مختلف قابل استفاده است، به شرطی که با استاندارد شیء ActiveX مطابقت داشته باشند. بنابراین، شیء Scripting.dictionary می‌تواند توسط زبان‌های برنامه‌نویسی ویندوز مانند جاوااسکریپت، پرل، پایتون، C، C++، VB، VBA و غیره استفاده شود و نه فقط توسط VBScript.

۱
یک شیء Scripting.Dictionary با استفاده از دستور زیر ایجاد می‌شود
set dico=wscript.CreateObject("Scripting.Dictionary")
یا به سادگی
set dico=CreateObject("Scripting.Dictionary")
CreateObject یک متد از شیء WScript است که برای ایجاد نمونه‌هایی از اشیاء ActiveX استفاده می‌شود. نسخه ۲ نشان می‌دهد که wscript می‌تواند یک شیء ضمنی باشد. وقتی یک متد نتواند به یک شیء «حل» شود، کانتینر WSH تلاش می‌کند آن را به شیء wscript حل کند.
۲
پس از ایجاد دیکشنری، می‌توانیم با استفاده از متد add عناصر را به آن اضافه کنیم:
dico.add "key",value
یک ورودی جدید در دیکشنری مرتبط با کلید «key» ایجاد می‌کند. مقدار مرتبط یک وریانت است که می‌تواند حاوی هر داده‌ای باشد.
3
برای بازیابی مقداری که با یک کلید مشخص مرتبط است، از متد `item` دیکشنری استفاده می‌کنیم:
var = dic.item("key")
یا اگر مقدار مرتبط با کلید یک شیء باشد، از var=dico.item("key") استفاده کنید.
4
تمام کلیدهای دیکشنری را می‌توان با استفاده از متد `keys` در یک آرایه متغیر بازیابی کرد:
keys = dic.keys
`keys` آرایه‌ای است که می‌توان عناصر آن را به‌صورت متوالی پردازش کرد.
۵
تمام مقادیر دیکشنری را می‌توان با استفاده از متد `items` در یک آرایه متغیر بازیابی کرد:
values = dic.items
`items` آرایه‌ای است که می‌توان عناصر آن را به‌صورت متوالی بررسی کرد.
۶
می‌توان با استفاده از متد `exists` وجود یک کلید را بررسی کرد:
dico.exists("key") زمانی true است که کلید "key" در دیکشنری وجود داشته باشد.
۷
یک مورد (کلید+مقدار) را می‌توان با استفاده از متد remove از دیکشنری حذف کرد:
dico.remove("key") ورودی مرتبط با کلید "key" را از دیکشنری حذف می‌کند. dico.removeall تمام کلیدها را حذف می‌کند؛ c.a.d دیکشنری را پاک می‌کند.

برنامه زیر از این گزینه‌های مختلف استفاده می‌کند:

برنامه

' ایجاد و استفاده از یک دیکشنری
Set dico=CreateObject("Scripting.Dictionary")

' پر کردن یک دیکشنری
dico.add "clé1","valeur1"
dico.add "clé2","valeur2"
dico.add "clé3","valeur3"

' تعداد عناصر
wscript.echo "Le dictionnaire a " & dico.count & " éléments"

' فهرست کلیدها
wscript.echo "liste des clés"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo cles(i)
Next

' فهرست مقادیر
wscript.echo "liste des valeurs"
valeurs=dico.items
For i=0 To ubound(valeurs)
  wscript.echo valeurs(i)
Next

' فهرست کلیدها و مقادیر
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

'جستجو برای عناصر
' کلید1
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
' کلید۴  
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

' حذف کلید ۱
dico.remove("clé1")

' فهرست کلیدها و مقادیر
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

' حذف همه چیز
dico.removeall

' فهرست کلیدها و مقادیر
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

'پایان
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 با ارسال پارامتر به آن وجود دارد، به این صورت:

cscript prog1.vbs arg1 arg2 .... argn

این امکان را به کاربر می‌دهد که اطلاعاتی را به برنامه منتقل کند. برنامه چگونه این اطلاعات را بازیابی می‌کند؟ بیایید به برنامه زیر نگاهی بیندازیم:

برنامه
نتایج
C:\>cscript arg1.vbs a b c

Il y a 3 arguments
a
b
c

نظرات

  • WScript.Arguments مجموعه‌ای از آرگومان‌هایی است که به اسکریپت ارسال می‌شوند
  • یک مجموعه C یک شیء است که دارای
    • یک خاصیت count که تعداد عناصر مجموعه است
    • یک متد C(i) که عنصر i-ام مجموعه را برمی‌گرداند

3.21. یک کاربرد اول: IMPOTS

ما قصد داریم برنامه‌ای برای محاسبه مالیات یک مؤدی بنویسیم. در این برنامه، مورد ساده‌شده مؤدی‌ای را در نظر می‌گیریم که تنها حقوق خود را برای اظهار دارد:

  • تعداد سهام کارمند را به صورت nbParts = nbEnfants/2 + 1 در صورتی که متأهل نباشد، محاسبه می‌کنیم، nbEnfants/2 + 2 اگر متأهل باشند، که در آن nbEnfants تعداد فرزندان آنهاست.
  • درآمد مشمول مالیات او R به صورت R = 0.72 × S محاسبه می‌شود، که در آن S حقوق سالانه او است.
  • ما ضریب کمک‌هزینه خانوادگی او را Q = R/N محاسبه می‌کنیم

ما مالیات I او را بر اساس داده‌های زیر محاسبه می‌کنیم

12620.0
0
0
۱۳٬۱۹۰
0.05
۶۳۱
۱۵٬۶۴۰
0.1
۱٬۲۹۰٫۵
۲۴٬۷۴۰
0.15
۲٬۰۷۲٫۵
۳۱٬۸۱۰
0.2
۳٬۳۰۹٫۵
۳۹٬۹۷۰
0.25
۴٬۹۰۰
۴۸٬۳۶۰
0.3
۶۸۹۸.۵
۵۵٬۷۹۰
0.35
۹٬۳۱۶٫۵
۹۲٬۹۷۰
0.4
۱۲٬۱۰۶
۱۲۷٬۸۶۰
0.45
۱۶٬۷۵۴٫۵
۱۵۱٬۲۵۰
0.50
۲۳٬۱۴۷٫۵
۱۷۲٬۰۴۰
0.55
۳۰٬۷۱۰
۱۹۵٬۰۰۰
0.60
۳۹٬۳۱۲
0
0.65
۴۹٬۰۶۲

هر سطر سه فیلد دارد. برای محاسبه مالیات I، به دنبال اولین سطری می‌گردیم که QFfield1 باشد. برای مثال، اگر QF = 30000 باشد، سطر را پیدا خواهیم کرد

    24740        0.15        2072.5

مالیه I سپس برابر است با 0.15*R - 2072.5*nbParts. اگر QF به گونه‌ای باشد که شرط QF <= field1 هرگز برقرار نشود، آنگاه ضرایب ردیف آخر استفاده می‌شوند. در این صورت:

    0                0.65        49062

که مالیات I را به صورت 0.65 × R – 49062 × nbParts می‌دهد.

برنامه به شرح زیر است:

برنامه
' محاسبه مالیات یک مؤدی
' برنامه باید با سه پارامتر فراخوانی شود: متأهل، تعداد فرزندان، حقوق
' married: کاراکتر 'O' اگر متأهل، 'N' اگر مجرد
' فرزندان: تعداد فرزندان
' حقوق: حقوق سالانه بدون احتساب پنی

' هیچ بررسی اعتبار داده‌ای انجام نمی‌شود، اما
' بررسی می‌کنیم که واقعاً سه مورد وجود دارد

' اعلام متغیر الزامی
Option Explicit

' ما بررسی می‌کنیم که ۳ آرگومان وجود دارد
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"
     'خاتمه با کد خطا 1
    wscript.quit 1
End If

' آرگومان‌ها را بدون بررسی اعتبارشان بازیابی می‌کند
Dim marie, enfants, salaire
If wscript.arguments(0) = "O" Or wscript.arguments(0)="o" Then
    marie=true
Else
    marie=false
End If
' children یک عدد صحیح است
enfants=cint(wscript.arguments(1))
' 'salary' یک عدد صحیح بلند است
salaire=clng(wscript.arguments(2))

' داده‌های مورد نیاز برای محاسبه مالیات در سه آرایه تعریف شده‌اند
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)

' تعداد سهام محاسبه می‌شود
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

'ما کمک‌هزینه خانواده و درآمد مشمول مالیات را محاسبه می‌کنیم
Dim revenu, qf
revenu=0.72*salaire
qf=revenu/nbParts

'مالیات محاسبه می‌شود
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))

'نتیجه نمایش داده می‌شود
wscript.echo "impôt=" & impot

'خروج بدون خطا
wscript.quit 0
نتایج
C:\>cscript impots1.vbs o 2 200000

impôt=22504

C:\>cscript impots1.vbs o 2 20000

impôt=0

C:\>cscript impots1.vbs o 2 2000000

impôt=746064

C:\>cscript impots1.vbs n 2 200000

impôt=33388

C:\>cscript impots1.vbs n 3 200000

impôt=22504

C:\>cscript impots1.vbs

Syntaxe : pg marié enfants salaire
marié : caractère O si marié, N si non marié
enfants : nombre d'enfants
salaire : salaire annuel sans les centimes

توضیحات:

  • برنامه از مفاهیم ذکر شده در بالا استفاده می‌کند (اعلام متغیر، آرگومان‌ها، تبدیل نوع، بررسی‌ها، حلقه، آرایه در یک واریانت)
  • این برنامه اعتبار داده‌ها را بررسی نمی‌کند، که در یک برنامه واقعی غیرمعمول است
  • تنها حلقه `while` مشکل‌ساز است. این حلقه می‌خواهد اندیس `i` از آرایه `limites` را که در آن `limites(i) > qf` برقرار است، برای `i < ubound(limites)` تعیین کند (c.a.d. در اینجا `i < 13`)، زیرا آخرین عنصر آرایه `limites` مرتبط نیست. این تنها به این دلیل اضافه شده است که تست [Do While i<ubound(limites) And qf>limites(i)] بتواند برای i=13 انجام شود. بنابراین این تست 13<13 و qf>limits(13) است، و بنابراین (در VBScript) باید limits(13) وجود داشته باشد. هنگام خروج از حلقه `while`، آخرین مقدار محاسبه شده `i` برای محاسبه مالیات استفاده می‌شود: [impot=int(revenu*coeffr(i)-nbParts*coeffn(i))].