3. مبانی برنامهنویسی VBSCRIPT
پس از توصیف زمینههای اجرایی ممکن برای یک اسکریپت VBScript، اکنون به خود زبان میپردازیم. در سراسر بخش باقیمانده، ما شرایط زیر را در نظر میگیریم:
- محفظهٔ اسکریپت WSH است
- اسکریپت در فایلی با پسوند .vbs قرار دارد
برای معرفی یک مفهوم، معمولاً به شرح زیر عمل میکنیم:
- در صورت لزوم، مفهوم را معرفی میکنیم
- یک برنامهٔ نمونه همراه با نتایج آن ارائه میدهیم
- در صورت لزوم، درباره نتایج و برنامه توضیح میدهیم
کانتینرهای VBScript در متن اسکریپت نسبت به حروف بزرگ و کوچک حساس نیستند. بنابراین، میتوانید به صورت wscript.echo "hello" یا WSCRIPT.ECHO "hello" بنویسید.
برنامههای ارائهشده در زیر حجم زیادی متن را روی صفحه نمایش میدهند، بنابراین روشهای نوشتن در شیء wscript را مجدداً بررسی خواهیم کرد.
3.1. نمایش اطلاعات
ما قبلاً از متد echo از شیء wscript استفاده کردهایم، اما شیء دوم متدهای دیگری برای خروجی گرفتن به صفحه نمایش دارد، همانطور که در اسکریپت زیر نشان داده شده است:
برنامه | نتایج |
![]() |
لطفاً به نکات زیر توجه کنید:
- هر متنی که پس از علامت تکی قرار گیرد، بهعنوان نظر (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، در یک خط واحد نوشت. اگر یک خط بیش از حد طولانی باشد، میتوان آن را به چند قسمت تقسیم کرد. در این صورت، هر یک از بخشهای مختلف دستور باید با دو کاراکتر (فاصله)_ پایان یابد. بیایید مثال قبلی را در نظر بگیریم و دستورالعملها را به روشی متفاوت بازنویسی کنیم:
برنامه | نتایج |
![]() |
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 استفاده کنیم. پنجرهای شامل دکمههای «بله»، «خیر» و «لغو» چهار بار نمایش داده میشود. کاربر به شرح زیر پاسخ میدهد:
- روی «بله» کلیک کنید
- روی «خیر» کلیک میکند
- کلیک روی «لغو»
- پنجره را بدون استفاده از هیچ دکمهای ببندید. برنامه نشان میدهد که این کار معادل کلیک روی دکمه لغو است.
برنامه | ||||
![]() | ||||
نتایج | ||||
|
3.4. دادههای s که میتوان در VBScript استفاده کرد
VBscript تنها یک نوع داده را تشخیص میدهد: واریانت. مقدار یک واریانت میتواند یک عدد (4, 10.2)، یک رشته ("hello")، یک مقدار بولی (true/false)، یک تاریخ (#01/01/2002#)، آدرس یک شیء، یا مجموعهای از تمام این انواع دادهها که در ساختاری به نام آرایه سازماندهی شدهاند، باشد.
بیایید برنامه زیر و نتایج آن را بررسی کنیم:
برنامه | نتایج |
![]() |
توضیحات:
- تعداد زیادی از زبانهای برنامهنویسی (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 مقداردهی اولیه نشده است. مقدار آن برای متغیرهای عددی صفر و برای متغیرهای رشتهای یک رشتهٔ خالی ("") است. |
نامعتبر | متغیر عمداً حاوی دادههای نادرست است. |
منطقی | |
بایت | یک عدد صحیح از 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 را تعیین کنیم. در اینجا چند مثال آورده شده است:
برنامه | نتایج |
![]() |
یک تابع احتمالی دیگر 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 بازنویسی شده است، نتایج زیر را تولید میکند:
برنامه | نتایج |
![]() |
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 نشان خواهد داد که یک متغیر اعلامنشده وجود دارد، همانند مورد ۲)، همانطور که در مثال زیر نشان داده شده است:
برنامه | نتایج |
![]() |
با اینکه در مثالهای کوتاه این سند، متغیرها عمدتاً تعریف نشدهاند، ما اطمینان حاصل خواهیم کرد که به محض شروع نوشتن اولین اسکریپتهای معنادار، آنها را تعریف کنیم. سپس دستور Option Explicit به صورت سیستماتیک به کار گرفته خواهد شد.
3.8. تابعهای تبدیل
VBScript دادههای واریانت را بسته به زمینه به رشتهها، اعداد، بولینها و غیره تبدیل میکند. در بیشتر موارد، این کار به خوبی انجام میشود، اما گاهی اوقات میتواند به برخی شگفتیها منجر شود، همانطور که بعداً خواهیم دید. بنابراین ممکن است بخواهید نوع داده وریانت را «اجباری» کنید. VBscript دارای توابع تبدیل است که یک عبارت را به انواع مختلف داده تبدیل میکنند. در اینجا چند نمونه از آنها آورده شده است:
Cint (expression) | بیان را به یک عدد صحیح کوتاه تبدیل میکند |
Clng (expression) | بیان را به عدد صحیح بلند (long) تبدیل میکند |
Cdbl (expression) | بیان را به یک عدد ممیز شناور با دقت دوگانه تبدیل میکند (double) |
Csng (expression) | بیان را به عدد حقیقی با دقت تک (single) تبدیل میکند |
Ccur (expression) | یک عبارت را به مقدار ارزی تبدیل میکند (currency) |
در اینجا چند مثال آورده شده است:
3.9. دادههای s تایپشده روی صفحهکلید
شیء wscript به یک اسکریپت امکان میدهد دادههای واردشده از طریق صفحهکلید را بازیابی کند. متد wscript.stdin.readLine اجازه میدهد یک خط متن واردشده از طریق صفحهکلید و تأییدشده با فشردن کلید «Enter» خوانده شود. این خط را میتوان به یک متغیر اختصاص داد.
برنامه | نتایج |
![]() | |
توضیحات:
- در ستون نتایج، در ردیف با برچسب [Tapez votre nom : st]، st متنی است که توسط کاربر وارد شده است.
اگر متنی که روی صفحهکلید تایپ شده نمایانگر یک عدد باشد، همچنان در وهله اول به عنوان یک رشته کاراکتری در نظر گرفته میشود، همانطور که در مثال زیر نشان داده شده است:
برنامه | نتایج |
![]() |
اگر این عدد در یک عملیات حسابداری استفاده شود، VBscript بهطور خودکار رشته را به عدد تبدیل میکند، اما همیشه این اتفاق نمیافتد. بیایید به مثال زیر نگاه کنیم:
برنامه | نتایج |
![]() |
در نتایج، میتوانیم ببینیم که خط ۸ اسکریپت طبق انتظار اجرا نشده است؛ این به این دلیل است که (متأسفانه) در VBScript، عملگر + دو معنی دارد: جمع دو عدد یا الحاق دو رشته (دو رشته به هم متصل میشوند). ما قبلاً دیدیم که اعدادی که روی صفحهکلید تایپ میشوند، به صورت رشتههای کاراکتری خوانده میشوند و VBScript آنها را در صورت نیاز به عدد تبدیل میکند. این کار را برای عملیاتهای -، * و / که فقط میتوانند شامل اعداد باشند، به درستی انجام داد، اما برای عملگر + که میتواند شامل رشتهها نیز باشد، اینطور عمل نکرد. در اینجا، فرض شده است که ما قصد داریم رشتهها را به هم متصل کنیم.
یک راهحل ساده برای این مشکل، تبدیل رشتهها به عدد به محض خوانده شدن آنهاست، همانطور که در بهبودی که در برنامه قبلی ارائه شده است نشان داده شده است:
برنامه | نتایج |
![]() |
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 person1 = new person، توالی زیر از رویدادها رخ میدهد:
- یک شیء personne ایجاد میشود. این بدان معناست که حافظه برای آن تخصیص داده میشود.
- آدرس این شیء personne به متغیر personne1 اختصاص داده میشود.
سپس ما چیدمان حافظه زیر را برای متغیرهای personne1 و personne2 داریم:
![]() |
به طور دقیق، میتوان گفت که personne1 یک شی از نوع personne است. این کنایه قابل قبول است اگر به خاطر داشته باشیم که personne1 در واقع نشانی یک شیء personne است و نه خود شیء personne.
ما گفتیم که یک شیء personne دو ویژگی داشت، nom و age. چگونه میتوانیم از این ویژگیها استفاده کنیم؟ با استفاده از نشانهگذاری objet.propriété، همانطور که کمی پیش توضیح داده شد. بنابراین
personne1.nom به نام شخص ۱ و personne1.age به سن او اشاره دارد. در اینجا یک برنامه کوتاه برای نمایش این موضوع آمده است:
برنامه | نتایج |
![]() |
برنامه قبلی را میتوان به صورت زیر اصلاح کرد:
برنامه | نتایج |
![]() |
در اینجا از ساختار 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. مقادیردهی به یک متغیر
دو دستور برای تخصیص مقدار به یک متغیر وجود دارد:
- متغیر=بیانیه
- متغیر را روی عبارت تنظیم کنید
شکل ۲ برای عبارتهایی رزرو شده است که نتیجهٔ آنها ارجاع به یک شیء است. برای سایر انواع عبارتها، از شکل ۱ استفاده میشود. تفاوت بین این دو شکل به شرح زیر است:
- در عبارت 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 را نیز تغییر میدهد.
![]() |
در اینجا یک مثال آورده شده است:
برنامه | نتایج |
![]() |
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 که برای انجام عملیات بسته به درست یا نادرست بودن یک شرط استفاده میشود، به شرح زیر است:
| ابتدا عبارت expression ارزیابی میشود. این عبارت باید یک مقدار بولی داشته باشد. اگر مقدار آن true باشد، عملیات در then اجرا میشوند؛ در غیر این صورت، در صورت وجود، عملیات در else اجرا میشوند. |
در زیر برنامهای آمده است که گونههای مختلف عبارت شرطی if-then-else را نشان میدهد:
برنامه | نتایج |
![]() |
توضیحات:
- در VBScript میتوانید به جای نوشتن هر دستور در یک خط، instruction1:instruction2:... : instructionn را بنویسید. این ویژگی برای مثال در خط ۱۰ استفاده شده است.
3.14.2. اقدامات E xecuting را به طور مکرر اجرا میکند
حلقه با تعداد تکرارهای معلوم |
میتوانید در هر زمان با استفاده از دستور exit for از حلقه for خارج شوید. |
حلقه با تعداد تکرارهای نامعلوم |
میتوانید در هر زمان با استفاده از دستور exit do از حلقه do-while خارج شوید. |
برنامه زیر این نکات را نشان میدهد:
برنامه |
![]() |
نتایج |
توجه: در مرحله توسعه یک برنامه، غیرمعمول نیست که برنامه به صورت حلقه (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 باشد، برقرار است. برنامه زیر و نتایج آن را در نظر بگیرید:
![]() |
بلافاصله پس از اجرای برنامه، سه دستور DOS زیر صادر میشوند:
دستور 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) اشاره دارد.
این ویژگیهای مختلف آرایهها در برنامه زیر نشان داده شده است:
برنامه | نتایج |
![]() |
نظرات
- یک تابع به نام `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 را اعلام میکنیم.
در اینجا مثالی برای نشان دادن نحوه استفاده از متغیرهای آرایهای آورده شده است:
برنامه | نتایج |
![]() |
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) را بازمیگرداند.
در اینجا یک مثال آورده شده است:
برنامه | نتایج |
|
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 دیکشنری را پاک میکند. |
برنامه زیر از این گزینههای مختلف استفاده میکند:
برنامه |
|
نتایج |
|
3.19. ترتیبدهی یک آرایه یا دیکشنری
معمول است که بخواهیم یک آرایه یا دیکشنری را به ترتیب صعودی یا نزولی بر اساس مقادیرش و در مورد دیکشنری بر اساس کلیدهایش مرتب کنیم. در حالی که اکثر زبانها دارای توابع مرتبسازی هستند، به نظر میرسد در VBScript هیچیک از آنها وجود ندارد. این یک کاستی است.
3.20. آرگومانهای برنامه
امکان فراخوانی یک برنامه VBScript با ارسال پارامتر به آن وجود دارد، به این صورت:
این امکان را به کاربر میدهد که اطلاعاتی را به برنامه منتقل کند. برنامه چگونه این اطلاعات را بازیابی میکند؟ بیایید به برنامه زیر نگاهی بیندازیم:
برنامه | نتایج |
![]() |
نظرات
- 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، به دنبال اولین سطری میگردیم که QF ≤ field1 باشد. برای مثال، اگر QF = 30000 باشد، سطر را پیدا خواهیم کرد
مالیه I سپس برابر است با 0.15*R - 2072.5*nbParts. اگر QF به گونهای باشد که شرط QF <= field1 هرگز برقرار نشود، آنگاه ضرایب ردیف آخر استفاده میشوند. در این صورت:
که مالیات I را به صورت 0.65 × R – 49062 × nbParts میدهد.
برنامه به شرح زیر است:
برنامه | ||
| ||
نتایج | ||
|
توضیحات:
- برنامه از مفاهیم ذکر شده در بالا استفاده میکند (اعلام متغیر، آرگومانها، تبدیل نوع، بررسیها، حلقه، آرایه در یک واریانت)
- این برنامه اعتبار دادهها را بررسی نمیکند، که در یک برنامه واقعی غیرمعمول است
- تنها حلقه `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))].









































