1.43k likes | 1.58k Views
Windows Scripting. اسكريپت نويسي در ويندوز مدت دوره آموزشي: 72 ساعت گردآورنده: مهندس خليل سالاري. فصل اول. بخش اول مفاهيم پايه اي. قبل از شروع. آشنايي مقدماتي با مديريت ويندوز سرور
E N D
Windows Scripting اسكريپت نويسي در ويندوز مدت دوره آموزشي: 72 ساعت گردآورنده: مهندس خليل سالاري
فصل اول بخش اول مفاهيم پايه اي
قبل از شروع • آشنايي مقدماتي با مديريت ويندوز سرور پيشنياز اين دوره آشنايي مقدماتي با مديريت ويندوز سرور مي باشد. بديهي است آشنايي كاملتر درك اين دوره را آسانتر خواهد نمود.
اسكريپت چيست؟ اسکريپت مربوط میشود به زبانهای مفسری که نیاز نداشته باشند برنامه هايشان کامپلیل شوند. یعنی مستقیماً برنامه نویس برنامه خودش را داخل یک فایل متنی مینویسد و همان متن را مفسر زبان هر دفعه تفسیر و اجرا میکند.نمونه این زبانها هم جاوا اسکرپت هست که از طریق مرورگر ها تفسیر میشه. یا phpکه توسط موتور php داخل سرور تفسیر میشود و نتیجه برای کاربر ارسال میشود. كدهايي كه در اين دوره نوشته ميشود بر اساس VBScriptمي باشد.
ايجاد يك اسكرپيت • شما براي ايجاد يك برنامه اسكريپت فقط به يك ويرايشگر متني ساده مانند Notepad ويندوز احتياج داريد. • بعد از نوشتن كدهاي اسكريپت كافي است آنرا به نام دلخواه ولي با پسوند VBS ذخيره نمائيد.
اجراي يك اسكريپت • از منوي Start Menu گزينه Run را انتخاب كرده دستور CMD را براي رفتن به محيط Command Prompt تايپ اجرا مي نمائيم. • براي اجراي يك اسكريپت دستور زير را تايپ مي كنيم. Cscript Filename.vbs نكته : چنانچه در كدهاي نوشته شده خطايي وجود داشته باشد ، نمايش داده شده در غير اينصورت اجرا مي شود.
Batch Files • در زماني كه سيستم DOS بر كامپيوتر حكمراني مي كرد جهت اجراي دسته اي از دستورات فايلي به نام فايلهاي دسته اي ايجاد مي كردند كه حاوي تعدادي دستورالعمل بوده با پسوند bat و هنگامي كه اجرا مي شد دستورالعمل هاي نوشته شده در داخل آن بصورت پشت سرهم ايجاد مي شدند. • اسكريپت ها شبيه فايلهاي دسته اي مي باشند.
تفاوت اسكريپت و فايلهاي دسته اي • انعطاف پذيري اسكريپت بيشتر مي باشد. • زبان اسكريپت قدرتمندتر مي باشد.
يك اسكريپت نمونه Option Explicit On Error Resume Next Dim objShell Dim regActiveComputerName, regComputerName, regHostname Dim ActiveComputerName, ComputerName, Hostname regActiveComputerName = "HKLM\SYSTEM\CurrentControlSet\Control\" & "ComputerName\ActiveComputerName\ComputerName" regComputerName = "HKLM\SYSTEM\CurrentControlSet\Control\" & "ComputerName\ComputerName\ComputerName" regHostname = "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Hostname" Set objShell = CreateObject("WScript.Shell") ActiveComputerName = objShell.RegRead(regActiveComputerName) ComputerName = objShell.RegRead(regComputerName) Hostname = objShell.RegRead(regHostname) WScript.EchoActiveComputerName & " is active computer name" WScript.EchoComputerName & " is computer name" WScript.Echo Hostname & " is host name"
اجزاي يك اسكريپت ■ Header information ■ Reference information ■ Worker information ■ Output information
Header information • بخش اطلاعاتي مربوط به اسكرپيت مي باشد. • حذف اين بخش تاثيري در اجراي برنامه ندارد. • به دلايل زير وجودش بعنوان بخش استاندارد يك اسكريپت لازم است: • خوانايي بيشتر اسكريپت • چگونگي كنترل اجراي اسكريپ • در بخش هاي بعدي درباره ابزارهاي كنترل بحث خواهد شد.
Header information در مثال قبل On Error Resume Next Dim objShell Dim regActiveComputerName, regComputerName, regHostname Dim ActiveComputerName, ComputerName, Hostname
Option Explicit • Option Explicit به اين معني مي باشد كه هر متغيري قبل از استفاده بايد تعريف گردد. • چنانچه اين بخش ذكر نگردد به اين معني است كه اسكريپت مي تواند بطور پيش فرض هر چيزي را كه شناسايي نكند بعنوان متغير در نظر مي گيرد. • جهت تعريف يك متغير از دستور Dim استفاده مي گردد.
On Resume Next • On Error به اين معني مي باشد كه شما مي خواهيد هنگامي كه خطايي رخ داده است عملي صورت بگيرد. • Resume Next به اين معني است كه هنگام وقوع خطا شما مي خواهيد عملي صورت گيرد، و آن اينكه در صورت وقوع خطا در خط جاري عمل اجرا به خط بعدي منتقل گردد. • به اين عمل Error Handling گويند.
Dim • از اين دستور جهت تعريف يك متغير استفاده ميشود. • مخفف كلمه Dimention مي باشد. • شكل كلي استفاده از آن به صورت زير مي باشد: Dim Variable1, Variable2,Variable3,…
Reference information • اين بخش شما را قادر مي سازد كه مقاديري را به متغيرها انتساب نمائيد. • به اين دليل كه ما مقاديري را ذخيره مي كنيم ، براي محل هاي اين مقادير ، به اسامي مستعاري به نام متغير كه به محل ذخيره شدن اين مقادير اشاره مي كنند نياز داريم. • استفاده از متغيرها ، استفاده هاي بعدي از اين مقادير را آسانتر مي كند.
Reference information در مثال قبل regActiveComputerName = "HKLM\SYSTEM\CurrentControlSet\Control\" & "ComputerName\ActiveComputerName\ComputerName" regComputerName = "HKLM\SYSTEM\CurrentControlSet\Control\" & "ComputerName\ComputerName\ComputerName" regHostname = "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Hos tname”
Registry • در دستورات مثال قبل ، در سمت راست متغيرهاي تعريف شده مقاديري انتساب داده شده است كه از رجيستري ويندوز گرفته شده است. • براي رفتن به رجيستري ويندوز به شكل زير عمل مي كنيم: Start Menu/Run/Regedit.exe
دلايل استفاده از Refrence Information • نوشتن كد هاي كمتر. يعني اينكه كدهاي طولاني را فقط يك بار مي نويسيم.بدين صورت دقت بالا مي رود. • خواندن اسكريپت آسان تر ميشود. چنانچه يك متغير بيش از يكبار استفاده گردد متغير به مقادير واقعي يكبار ارجاع داده شده اند. • در صورت لزوم تغييرات ، اينكار به آساني انجام ميشود.
Worker information • بخشي است كه در آن بعضي از عمليات مورد نياز انجام مي شود. • اين بخش متغيرها در بخش Header و Referenece را به هم ارتباط مي دهد.
Worker information در مثال قبل Set objShell = CreateObject("WScript.Shell") ActiveComputerName = objShell.RegRead(regActiveComputerName) ComputerName = objShell.RegRead(regComputerName) Hostname = objShell.RegRead(regHostname) تذكر : درباره هر يك از دستورات بكار رفته در اسكريپت فوق در فصل بعدي بحث خواهد شد
Output information • در اين بخش نتايج بدست آمده از بخش قبل به كمك يك سري فرامين بر روي صفحه نمايش نشان داده ميشوند. • Wscript.Echo يكي از دستوراتي است كه جهت نمايش پيغام و يا محتويات يك متغير در خروجي مي توان از آن استفاده كرد.
Comment • براي ايجاد توضيحات در هر خط از اسكريپت مي توانيد از دو روش زير استفاده نمائيد. • قرار دادن كاراكتر ‘ سپس نوشتن هر گونه توضيح • قرار دادن كلمه Rem سپس نوشتن هر گونه توضيح نكته : ايجاد توضيحات دربرنامه هيچ تاثيري در اجراي برنامه نداشته و صرفا براي بيان يكسري توضيحات درباره ي اسكرپيت نوشته شده و يا خوانايي بيشتر اسكريپت مي باشد.
Comment ‘ This script displays various Computer Names by reading the registry Option Explicit ’Forces the scripter to declare variables On Error Resume Next ’Tells VBScript to go to the next line ’instead of exiting when an error occurs ‘ Dim is used to declare variable names that are used in the script Dim objShell Dim regActiveComputerName, regComputerName, regHostname Dim ActiveComputerName, ComputerName, Hostname ‘ When you use a variable name and then an equal sign (=) ‘you’re saying the variable contains the information on the right. ‘The registry keys are quite long, so make them easier to read on ‘a single screen by splitting the line in two. regActiveComputerName = "HKLM\SYSTEM\CurrentControlSet" & "\Control\ComputerName\ActiveComputerName\ComputerName" regComputerName = "HKLM\SYSTEM\CurrentControlSet\Control" &"\ComputerName\ComputerName\ComputerName" regHostname = "HKLM\SYSTEM\CurrentControlSet\Services" & "\Tcpip\Parameters\Hostname" Set objShell = CreateObject("WScript.Shell") ActiveComputerName = objShell.RegRead(regActiveComputerName) ComputerName = objShell.RegRead(regComputerName) Hostname = objShell.RegRead(regHostname) ‘ To make dialog boxes you can use WScript.Echo ‘ and then tell it what you want it to say. WScript.Echoactivecomputername & " is active computer name" WScript.EchoComputerName & " is computer name”
روش هاي ديگر اجراي يك اسكريپت يك اسكريپت را مي توان به روش هاي مختلفي اجرا كرد: • دابل كليك كردن بر روي فايل اسكريپت • استفاده از دستور Cscript در محيط Commad Prompt به شكل زير : Cscript Filename.vbs 3. جا دادن اسكريپت در صفحات وب. يعني اينكه در طراحي صفحات وب از اين اسكريپت ها استفاده كنيم. 4. Drag & Drop كردن يك فايل .vbs در محيط Command Prompt باز.
روش هاي بازكردن يك اسكريپت • اجرا كردن برنامه Notepad و انتخاب گزينه Open از منوي File . سپس تايپ *.vbs در قسمت Filenameو انتخاب فايل مورد نظر و سپس كليك بر روي گزينه Open. • Drag & Drop كردن يك فايل .vbs به داخل يك Notepad باز شده.
فصل اول بخش دوم حلقه
ايجاد حلقه تكرار دستوراتي وجود دارند كه به ما كمك كنند فرآيندهايي را به صورت تكرار انجام دهيم. اين دستورات عبارتند از: • For Each … Next • For … Next • Do While … Loop • Do Until … Loop
For Each … Next • اين دستور به شما اجازه مي دهد كه در بين مجموعه اي از اشياء حركت كنيد و سپس عمل يا اعمالي را دوباره بر روي اشياء بعدي انجام دهيد. در اسكريپت زير يك فرآيند تكرار براي شناسايي درايوهاي موجود در هارديسك سيستم استفاده مي شود. Option Explicit On Error Resume Next Const DriveType = 3 Dim colDrives Dim drive set colDrives = _ GetObject("winmgmts:").ExecQuery("select DeviceID from Win32_LogicalDisk where DriveType =" & DriveType) For Each drive in colDrives WScript.Echodrive.DeviceID Next
تعريف مقدار ثابت • مقادير ثابت در طول برنامه همواره ثابت مي باشند و به هيچ عنوان بر خلاف متغيرهاي معمولي تغيير نمي كنند. شكل تعريف اين نوع متغيرها به شرح ذيل مي باشد: Value=Const VariableName مانند: Const DiriveType=3
دلايل استفاده از ثابت ها • مواردي كه لازم باشد مقداري در طول برنامه تغيير نكند. • خوانايي برنامه را گسترش مي دهد. • هنگام نياز به تغيير مجدد ، فقط يك قسمت تغيير مي كند.
Collection • تعدادي از اشياء كه داراي يك خصوصيات يكساني باشند يك مجموعه ناميده مي شود. مانند مجموعه رنگ ها، مجموعه اي از نام شهرها، مجموعه اي از نام درايوها و...
For … Next • براي موارد تكراري كه تعداد دفعات آن از قبل معلوم باشد از اين دستور استفاده مي كنيم. نكته: دستور For Each … Next تعداد دفعات تكرار آن از قبل معلوم نمي باشد.
مثال Option Explicit On Error Resume Next Const ONE_HOUR = 3600000 Dim objWMIService Dim objProcess Dim i Set objWMIService = GetObject(“winmgmts:”) & .ExecQuery (“SELECT * FROM Win32_Process”) For i = 1 To 8 For Each objProcess In objWMIService WScript.Echo Now WScript.Echo “” WScript.Echo “Process: “ & objProcess.Name WScript.Echo “Process ID: “ & objProcess.ProcessID WScript.Echo “Thread Count: “ & objProcess.ThreadCount WScript.Echo “Page File Size: “ & objProcess.PageFileUsage WScript.Echo “Page Faults: “ & objProcess.PageFaults WScript.Echo “Working Set Size: “ & objProcess.WorkingSetSize Next WScript.Echo “******PASS COMPLETE**********" WScript.Sleep ONE_HOUR Next
Do While … Loop • از اين دستور مي توانيد براي تكرار عملياتي براي تعداد دفعات نامشخصي هنگام برقراري شرطي استفاده كنيد. به شكل زير: Do While Condition Statements Loop
مثال Option Explicit On Error Resume Next Const FIVE_SEC = 5000 Const LOCAL_HARD_DISK = 3 Dim colMonitoredDisks Dim objWMIService Dim objDiskChange Dim i Set objWMIService = GetObject(“winmgmts:” & “{impersonationLevel=impersonate}”).ExecQuery (“SELECT * FROM Win32_Process”) Set colMonitoredDisks = objWMIService.ExecNotificationQuery (“Select * from __instancemodificationevent within 30 where “ _ & “TargetInstanceisa ’Win32_LogicalDisk’”) i = 0 Do While i = 0 Set objDiskChange = colMonitoredDisks.NextEvent If objDiskChange.TargetInstance.DriveType = LOCAL_HARD_DISK Then If objDiskChange.TargetInstance.Size < 100000000 Then WScript.Echo “Hard disk space is below 100000000 bytes." WScript.Sleep(FIVE_SEC) End If End If Loop
Do Until … Loop • از اين ساختار ايجاد حلقه براي مواردي استفاده مي شود كه عملياتي در صورت عدم برقرار شرط صورت گيرد. • بر خلاف Do While در صورتي تكرار مي گردد كه شرط نوشته شده برقرار نباشد. • ساختار آن به شكل زير مي باشد: Do Until condition statements Loop
مثال Option Explicit On Error Resume Next Dim error1String Dim objFSO Dim objFile Dim strLine Dim SearchResult error1String = "error" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\windows\setuplog.txt", 1) strLine = objFile.ReadLine Do Until objFile.AtEndofStream strLine = objFile.ReadLine SearchResult = InStr(strLine, error1String) If SearchResult <> 0 Then WScript.Echo(strLine) End if Loop WScript.Echo("all done") objFile.Close
تابعInstr • جهت جستجوي يك رشته در يك رشته ديگر از آن استفاده مي شود. • شكل استفاده از آن بصورت زير مي باشد: SearchResult=Instr(String, SearchString) نكته: مقادير خروجي اين تابع در جدول 1-2 درج شده است.
فصل اول بخش سوم عبارات شرطي
عبارات شرطي • در بسياري از مواقع لازم است كه قسمتي از دستورالعمل ها بنا به شرايطي اجرا گردند. در اين صورت براي انجام اعمال بصورت هوشمندانه از دستورات شرطي استفاده مي كنيم. • اين قابليت يك اسكريپت را بسيار قدرتمند مي نمايد.
انواع دستورات شرطي • دستوراتي شرطي كه در اسكريپت نويسي استفاده مي شود عبارتند از : • If … Then • If … Then … Else • If … Then … ElseIf • Select Case
ساختار دستورات شرطي • دستورات شرطي از ساختار زير استفاده مي كنند: • If Condition Then Statement • If Condition Then Statement Else Statement • If Condition Then Statements End if • If Condition Then Statements Else Statements End if • If Condition Then Statements Else if Condition Then Statements . . . Else Statements End if
مثال Option Explicit On Error Resume Next Const ForReading = 1 Const ForWriting = 2 Dim scriptFile Dim commentFile Dim objScriptFile Dim objFSO Dim objCommentFile Dim strCurrentLine Dim intIsComment scriptFile = “C:\scripts\displayComputerNames.vbs" commentFile = “C:\scripts\comments.txt" Set objFSO = CreateObject(“Scripting.FileSystemObject”) Set objScriptFile = objFSO.OpenTextFile (scriptFile, ForReading) Set objCommentFile = objFSO.OpenTextFile(commentFile, ForWriting, True) Do While objScriptFile.AtEndOfStream <> True strCurrentLine = objScriptFile.ReadLine intIsComment = InAtr(1,strCurrentLine,"‘“) If intIsComment > 0 Then objCommentFile.WritestrCurrentLine & vbCrLf End If Loop WScript.Echo(“script complete”) objScriptFile.Close objCommentFile.Close
مثال Option Explicit On Error Resume Next Dim strComputer Dim cpu Dim wmiRoot Dim objWMIService Dim ObjProcessor strComputer = "." cpu = "win32_Processor=‘CPU0’" wmiRoot = "winmgmts:\\" & strComputer & "\root\cimv2" Set objWMIService = GetObject(wmiRoot) Set objProcessor = objWMIService.Get(cpu) If objProcessor.Architecture = 0 Then WScript.Echo "This is an x86 cpu." ElseIfobjProcessor.Architecture = 1 Then WScript.Echo "This is a MIPS cpu." ElseIfobjProcessor.Architecture = 2 Then WScript.Echo "This is an Alpha cpu." ElseIfobjProcessor.Architecture = 3 Then WScript.Echo "This is a PowerPC cpu." ElseIfobjProcessor.Architecture = 6 Then WScript.Echo "This is an ia64 cpu." Else WScript.Echo "Can not determine cpu type." End If
Select Case • يكي از دستورات شرطي است كه در مواردي كه از ساختار If … Then …ElseIf نخواهيم استفاده كنيم ، مي توانيم از اين ساختار شرطي به شكل زير استفاده نمائيم Select case Variable or Expression case Value1 Statement1 case Value2 Statement2 case Value3 Statement3 . . . Case Else Statement End select
مثال Option Explicit On Error Resume Next Dim strComputer Dim wmiRoot Dim wmiQuery Dim objWMIService Dim colComputers Dim objComputer Dim strComputerRole strComputer = "." wmiRoot = "winmgmts:\\" & strComputer & "\root\cimv2" wmiQuery = "Select DomainRole from Win32_ComputerSystem" Set objWMIService = GetObject(wmiRoot) Set colComputers = objWMIService.ExecQuery (wmiQuery) For Each objComputer In colComputers Select Case objComputer.DomainRole Case 0 strComputerRole = "Standalone Workstation" Case 1 strComputerRole = "Member Workstation" Case 2 strComputerRole = "Standalone Server" Case 3 strComputerRole = "Member Server" Case 4 strComputerRole = "Backup Domain Controller" Case 5 strComputerRole = "Primary Domain Controller" End Select WScript.EchostrComputerRole Next
فصل اول بخش چهارم قدرت بسيار
قدرت بسيار قابليت هايي كه مي تواند توانايي VBScript را بيشتر نمايان كنند عبارتند از : • ارسال پارامتر Passing Arguments • آرايه ها Arrays
ارسال پارامترPassing Argumens • اين قابليت كاربران را قادر مي سازد تا توانايي يك اسكريپت را به شكل قابل توجهي افزايشد دهند. • قابليتي كه هنگام اجراي يك اسكريپت ، قادر مي سازد كه پارامتري را دريافت نموده و از طريق آن عملياتي را انجام دهد.