Windows Script Host va skript tillar haqida

VBScript, JavaScript haqida hammamiz bilamiz yoki eshitganmiz. Bular odatda dinamik saytlarda klient tomonida brauzerda bajariluvchi skript tillar. Ushbu tillarni nafaqat brauzerda, balki boshqa muhitlarda ham ishlashi mumkinligini esa hamma ham yaxshi bilavermasa kerak.
Windows operasion tizimida WSH (Windows Script Host) deb nomlanuvchi komponent mavjud bo’lib, bunda yuqoridagi tillar yoki boshqa skript tillar yordamida COM (Component Object Model)ni qo’llovchi dasturlar bilan integrasiyalanuvchi skriptlar yoki biror bir vazifalarni bajaruvchi kichikroq skriptlar yaratish mumkin. Sodda qilib aytganda batch fayllarni mukammalroq varianti desak ham bo’laveradi. Ushbu skriptlarni bajarilishi uchun hech qanday qo’shimcha dastur, kutubxona ham shart emas. Biror matn/kod muharririda VBScript yoki JScript da skript kodini yozib, fayl kengaytmasini mos ravishda .vbs yoki .js qilishimiz yetarli. Ushbu kengaytmali fayllar to’g’ridan to’g’ri ishlayveradi.

Oddiy misol:

Dim s
s = InputBox("Ismingizni kiriting: ", "test")
WScript.Echo "Salom " & s

Yuqoridagi kodni test.vbs fayliga saqlab, natijasini ko’ramiz.
Bizga to’g’ridan to’g’ri ishlab ketayotgandek ko’rinayotgan skriptlar aslida qo’shimcha dastur yordamida yuklanishi tabiiy. Ya’ni biz .vbs, .js fayllarni ishlatganimizda ular \\windows\\system32\\ papkada joylashgan wscript.exe qobiq dasturi yordamida yuklanadi, boshqacharoq aytganda tizim reestrida .vbs va .js kengaytmali fayllar wscript.exe yordamida ochilsin deb ko’rsatilgan (fayl tipiga dastur bog’lash). Wscript.exe dan tashqari yana bir qobiq cscript.exe ham mavjud. wscript (window rejim) barcha kiritish va chiqarishni oynalar orqali ko’rsatadi, ya’ni Echo buyrug’idagi qiymat MessageBox da ko’rinadi. cscript (console rejim) da esa chiqarishlar konsol oynasiga uzatiladi. Farqi shunda.
JScript va VBScript dan tashqari WSH ga o’zingizni skript tilingizni ham qo’shish imkoni mavjud. Buning uchun ko’rsatilgan shaklda interfeys yozish kifoya.
Boshlang’ich ma’lumotlarni oldik. Keling endi WSH dan foydalanib nimalar qilish mumkinligi, uning imkoniyatlari bilan qisqacha tanishib chiqamiz.

VBScript va JScriptlarni qisman obyektga yo’naltirilgan deyish mumkin. Muhimi bu yerda ham class lar, inkapsulyasiya bor. Ikki tilning imkoniyati har hil bo’lganligidan biror ishga qaysi tilni imkoniyatlari mos kelsa ushandan foydalanish mumkin. Yoki ikkala tilni aralashtirib ham skript yozish mumkin. Buning uchun faylni kengaytmasi .wsf bo’lishi kerak. Misol:
Test.wsf

<?xml version="1.0" encoding="windows-1251"?>
<package>
<job id="test1">
<script language="VBScript">

Function MyInputBox (s)
	MyInputBox = InputBox (s)
End Function

</script>

<script language="JavaScript">

var s=MyInputBox("Ismingizni kiriting:");

</script>

</job>
</package>

Yuqoridagi misolda bitta skriptda ham VBScriptdan ham JScriptdan foydalanyapmiz. Bundan foydalanib bir tilda yo’q imkoniyatlarni boshqa bir tilda bajarib, uni chaqirishimiz mumkin bo’ladi. Tepada biz ham JScript da yo’q bo’lgan InputBox funksiyasini chaqirishni ko’rdik. Endi .wsf faylga kelsak ushbu fayl ko’rib turganingizdek XML formatga ega. tegi ostida skriptlarni vazifalarga ajratib, guruhlash mumkin. Bu orqali bir .wsf faylni ko’plab vazifalarni bajaradigan qilish mumkin. wsf ni ishlatganimizda faqat birinchi tegi ostidagi skriptlar ishlaydi. Biroq buyruqlar satrida
cscript.exe  //job:vazifanomi  skriptnomi
wscript.exe //job:vazifanomi  skriptnomi
Shaklida .wsf fayldagi hohlagan vazifani ishlatish imkoni mavjud.
cscript.exe //job:test1 test.wsf

.wsf fayl formati XML bo’lganligi sababli <,>, & belgilari teglarga tegishli bo’lmasa, ya’ni skript kodida qatnashsa, ular faylni “obrabotka” qilish jarayonida <, >, & ko’rinishiga o’tkaziladi. Va ushbu belgilar qatnashgan joylarda xatolik yuzaga kelishi mumkin. Buni oldini olish uchun kodlar maxsus ajratgich <![CDATA[]]> ichiga yozilishi mumkin. Yuqoridagi kod:

<?xml version="1.0" encoding="windows-1251"?>
<package>
<job id="test1">
<script language="VBScript">
<![CDATA[

Function MyInputBox (s)
	MyInputBox = InputBox (s)
End Function

]]>
</script>

<script language="JavaScript">
<![CDATA[

var s=MyInputBox("SSSS");

]]>
</script>

</job>
</package>


.wsf uchun yana bir qancha qo’shimcha teglar mavjud, ular haqida Microsoft ni MSDN idan batafsil ma’lumot olish mumkin.

Endi yuqorida aytilgan imkoniyatlardan va CGI texnologiyasidan foydalanib server tomonda bajariluvchi web dastur yozishni ko’rib chiqamiz. CGI skriptlarni har qanday tilda yaratish mumkinligi ma’lum narsa. Buning uchun o’sha tilda kerakli funksiyalar bo’lsa yetarli.
CGI skriptlar ishlashi uchun skript faylning boshida ko’rsatma qator bo’lishini bilamiz. Ushbu qatorda web server dasturi ushbu skriptni qanday, qaysi interpretator bilan ishlatishi haqida ma’lumot bo’ladi. Ushbu qator “#!” belgisi bilan boshlanib, odatda “shebang” deb ataladi. Masalan Perl skript uchun bu qator mana bunday ko’rinishga ega bo’ladi:
#!/usr/local/miniperl/miniperl
Server dastur klientdan kelgan so’rovni tahlil qilib, agar skript fayl so’ralgan bo’lsa ushbu faylni o’qiydi. Undagi birinchi qatorda yozilgan dasturni ishlatadi ( yuqorida /usr/local/miniperl/miniperl) va skript faylni o’sha interpretatorga uzatadi. miniperl esa o’z navbatida skript faylni interpretasiya qiladi. “#” belgisi perlda izohli qator belgisi bo’lganidan interpretasiya jarayonida e’tiborsiz qoldiriladi. Natijalar web server bilan kiritish/chiqarish kanali orqali amalga oshiriladi (pipe). Va shundan so’ng klientga jo’natiladi. E’tibor bering, server skript faylni ochib, uni birinchi qatorida maxsus belgi bilan boshlangan qatorni o’qib, unda ko’rsatilgan dasturni ishlatadi va usha dasturga kiruvchi ma’lumot sifatida skript faylni o’zini nomi va boshqa ma’lumotlarni jo’natadi.
Shularni hisobga olib biz ham quyidagi tarkibli fayl yaratamiz:
#!c:\\WINDOWS\\system32\\cscript.exe 
WScript.Echo "SALOMLAR!"
Faylni test.vbs deb nomlab web sayt papkasiga tashlaymiz. Buning uchun bizda web server dasturi o’rnatilgan bo’lishi lozim. Men Denwer paketidan foydalandim. Demak skriptimizni localhost ga cgi-bin papkaga tashlaymiz. Brauzerni ochib, unda skript manzilni yozamiz:
http://localhost/cgi-bin/test.vbs
Oppoq sahifa! “SALOMLAR” degan so’zdan asaram yo’q  Demak, nimadir xato. Web server loglari joylashgan papkaga o’tib, xatolar logini ko’ramiz:
[Thu Jan 01 01:52:29 2004] [error] [client 127.0.0.1] Premature end of script headers: test.vbs
[Thu Jan 01 01:52:29 2004] [error] [client 127.0.0.1] Z:\\home\\localhost\\www\\test.vbs(1, 1) Microsoft VBScript compilation error: Expected statement\r
[Thu Jan 01 01:52:29 2004] [error] [client 127.0.0.1] \r
Ushbu habarlarga qarab kompyuterimni CMOS batareykasi “charchaganini” bilib olamiz :-) Bundan tashqari: header/sarlavhalar to’g’ri berilmagani (1-qator) va skriptda xatolik borligi ham ma’lum bo’ladi. Skriptdagi xatolik shuki, VBScript da “#” belgisi Perldagi kabi izoh belgisi emas va interpretator ushbu qatorni ham bajarishga urinib ko’rganligi sababli xatolik yuz bergan. Sarlavhalar berilmagani esa bu bizning aybimiz, ma’lumotni uzatishdan oldin, eng kamida uni turini bildiruvchi sarlavhani berishimiz kerak edi, ya’ni “content-type” ni.
“#” belgisi bilan yuzaga kelgan muammoni hal qilish uchun yana bir test_kod.vbs faylini yaratamiz. Birinchi test.vbs ni ham o’zgartiramiz.
test.vbs
#!c:\\WINDOWS\\system32\\cscript.exe //nologo “test_kod.vbs”
test_kod.vbs

WScript.Echo "Content-type: text/html" & vbLf & vbLf
WScript.Echo "<B>SALOMLAR!</B>" 

Brauzerda yana localhost/cgi-bin/test.vbs ni ochib ko’ramiz.
SALOMLAR!
Va nihoyat natija! Endi yuqoridagilarni tushuntirib o’taman. Biz test.vbs ni “so’raganimizda” Web server uni o’qib, birinchi qatordagi buyruqni bajaradi. Ya’ni,
c:\\WINDOWS\\system32\\cscript.exe //nologo “test_kod.vbs”
cscript.exe esa o’zining buyruqlar qatorida berilgan test_kod.vbs ni ishlatadi. Bunda test.vbs fayli bajarilmasdan shunchaki yo’lnaltiruvchi bo’lib hizmat qilyapti. “#” belgisi shartligidan har bir skript uchun ikkitadan fayl yaratishimizga to’g’ri kelyapti. “//nologo” nimaga kerakligini esa o’zingiz cscript.exe ni shu kalit bilan va usiz ishlatib ko’rib tushunib olishingiz mumkin.
Test_kod.vbs ga kelsak, birinchi qatorda sarlavha berilyapti (kontent turi). Ushbu qator ohiridagi 2 ta vbLF majburiy, chunki HTTP ga asosan sarlavhalar va ma’lumotni o’rtasida bitta bo’sh qator bo’lishi shart.
Skriptdan turib so’rovlar matnini, kiruvchi ma’lumotlarni olish va boshqalar haqida gapirib o’tirmayman. Chunki maqolani maqsadi shunchaki WSH va skript tillar imkoniyati haqida boshlang’ich tushuncha berish holos. Bundan tashqari internetda bu haqda ma’lumotlar ham talaygina.

Ko’rib turganingizdek VBScript yoki JScript dan foydalanib ham web dasturlarni server qismini yaratish mumkin. Ayniqsa JScriptga asoslangan turli frameworklar va kutubxonalar bilan birgalikda bu til kuchli qurolga aylanadi.

Bundan tashqari ushbu skript tillardan foydalanib to’laqonli ActiveX kutubxona ham yaratish mumkin. Buning uchun fayl kengaytmasi .wsc va tarkibi quyidagi shaklda bo’lishi kerak:
MyClass.wsc

<?xml version="1.0"?>
<component>

<registration
    description="VBScriptda ActiveX"				
    progid="MyClass.WSC"					
    version="1.00"
    classid="{A4bb1ba9-2e69-4ad6-b02c-c52f3cbe153b}">
</registration>

<public>					‘ export qilinadigan funksiyalar
    <method name="MyProc">
    </method>
</public>

<script language="VBScript">
<![CDATA[
Sub MyProc
    WScript.Echo "SALOM"
End Sub
]]>
</script>
</component>


Ushbu kutubxonani ro’yhatdan o’tkazish uchun:
regsvr32.exe MyClass.wsc

Endi boshqa skriptlarda ushbu kutubxonadan foydalanishimiz mumkin. Masalan quyidagicha:

Dim obj
set obj=WScript.CreateObject("MyClass.WSC")
obj.MyProc


Hozircha shular. Batafsilroq yozgani doimgidek erinib qoldim. So’z ohirida esa quruq bo’lmasligi uchun VBScript uchun yozgan sodda grafik kutubxonamni va undan foydalanib qilingan va boshqa misollarni ilova qilaman.

Misollar: wsh_samples.zip
Batafsil ma'lumot: MSDN

Eslatma: O’zim oldin VBScript bilan ko’proq ishlaganim sababli misollarni faqat VBScriptda ko’rsatdim. Yuqoridagi gaplarni barchasi JScript uchun ham bir hil kuchga ega.

UPD: Skriptlarni shifrovka qiluvchi utilitani ham qo'shib qo'ydim. Shifrlangan skript agar html da ishlatiladigan bo'lsa script tegida til nomi quyidagicha yoziladi:
<script language="JScript.Encode">
<script language="VBScript.Encode">
Agar oddiy skript bo'lsa shunday ishlayverar ekan.
Shifrovshik: ScrEnc.zip

1 комментарий

shranet
Thanks. Oldin hech eshitmagan ekanman.
0