Qun lý các mng Windows dùng script - Phn 2: Hoàn chnh script
Ngun:quantrimang.com
Mitch Tulloch
phn trước chúng ta đã biết đến mt s khái nim cơ bn v k thut scripting
như đối tượng (object), phương thc (method), thuc tính (property) và viết ra
mt scritp đơn gin thay đổi địa ch IP gán cho b điu hp mng. Sau đó, chúng
ta đã s dng bn script đầu tiên, được gi là ChangeIPAddress.vbs:
strComputer = "."
arrIPAddress = Array("172.16.11.99")
arrSubnetMask = Array("255.255.255.0")
Set objWMIService = GetObject("winmgmts:\\" & strComputer &
"\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery("Select * from
Win32_NetworkAdapterConfiguration")
For Each objNetAdapter in colNetAdapters
errEnableStatic =
objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Next
Khi chy script này trên server Windows, nó thay đổi thành công địa ch IP ca
máy t .45 sang .99. (Kim tra bng lnh ipconfig trước và sau khi chy script).
Kết qu hoàn toàn tt.
Nhưng script chúng ta đã xây dng mi tng li mc khá đơn gin. Còn thiếu
nhiu yếu t quan trng khác như các định nghĩa biến, điu khin li, dùng d
liu đầu vào và xác nhn d liu đầu ra cn phi b sung vào đểđược mt
script tương đối hoàn chnh. Chúng ta s thc hin điu đó trong phn hai này.
Các định nghĩa biến
Vic đầu tiên chúng ta cn làm để sp xếp gn gàng script là định nghĩa các biến
s dùng. VBScript cho phép định nghĩa ngm các biến đơn gin bng cách dùng
nó trong mt câu lnh, nhưng s tt hơn nếu bn khai báo tường minh chúng
ngay khi bt đầu script. Khai báo mt biến s nói cho VBScript biết v s tn ti
ca nó để cp phát b nh lưu tr. Vì sao khai báo biến tường minh li hay
hơn? Ví d như trong mt script dài, bn thường phm phi mt hay mt s li
gõ phím nhm. Và khi gõ nhm tên ca mt biến, script ca bn s không chy
được. Nếu khai báo biến tường mình đầu script thì bt k biến nào được khai
báo ngm v sau trong script (có th là nguyên nhân gây ra li gõ nhm) s to
ra mt li runtime. Các thông báo li có th s giúp bn xác định được v trí
nhm ln và g li cho script ca bn.
Để VBScript biết bn khai báo tường minh tt c các biến trong script, thêm lnh
sau vào đầu script:
Option Explicit
Nếu thêm lnh này vào đầu script ChangeIPAddress.vbs và chy nó t
Command Prompt, kết qu là:
C:\Documents and Settings\Administrator.DC-
1\Desktop>ChangeIPAddress.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights
reserved.
C:\Documents and Settings\Administrator.DC-
1\Desktop\ChangeIPAddress.vbs(2, 1) Microsoft VBScript
runtime error: Variable is undefined: 'strComputer'
Điu mà VBScript (hay cơ chế script đã đăng ký ca Windows Script Host để
chy các script VBScript) mun nói đây là có mt li trong dòng 2 ca script:
strComputer = "."
Vì sao li xut hin li này? Đó là do chúng ta đang gán giá tr cho mt biến xâu
(strComputer) chưa được khai báo. Vì thế, bây gi chúng ta cn thêm các khai
báo cho biến dùng trong script:
Option Explicit
Dim objWMIService
Dim objNetAdapter
Dim strComputer
Dim arrIPAddress
Dim arrSubnetMask
Dim colNetAdapters
Dim errEnableStatic
strComputer = "."
arrIPAddress = Array("172.16.11.93")
arrSubnetMask = Array("255.255.255.0")
Set objWMIService = GetObject("winmgmts:\\" & strComputer &
"\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery("Select * from
Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each objNetAdapter in colNetAdapters
errEnableStatic =
objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Next
Chú ý là khi dùng Option Explicit (tu chn khai báo tường minh), bn phi khai
báo tt c biến trong script ca mình, gm c đối tượng, xâu, mng, tp hp,
biến cho đon mã li… Nghe có v rt rc ri phc tp nhưng thc tế ch cn
chy mt s trang dài, ngay c khi chy chương trình g li rungning time, bn
s biết nó hu ích như thế nào. Cũng chú ý là không cn khai báo biến theo trình
t, ch cn nh khai báo cho tng biến trước khi dùng là được. Thông thường
người ta đặt tt c khai báo biến vào mt phn riêng trên đầu script như chúng
ta đã làm trên.
Điu khin li
Bây gi, chúng ta đã loi b được các li gõ nhm khi chy script đã được soát
li, script hot động. Nhưng nếu nó không hot động thì sao? Ví d, chuyn gì
s xy ra nếu chúng ta thay đổi script đi mt chút để chy trên mt máy t xa
thay vì máy cc b mà trong đó máy t xa không nm trên mng? Mt ln na
li thi gian chy (tc li xy ra khi script đang được thc thi, ngược li vi li cú
pháp mà VBScript có th nhn ra khi biên dch script trước khi chy nó) s xut
hin và script s b ngng li, hin th mt thông báo li tương t như thông báo
chúng ta đã thy trên. Chuyn gì s xy ra nếu chúng ta viết ra mt script để
thc hin mt s thao tác? Trong trường hp này tt nhiên chúng ta không
mun có mt li thi gian chy khiến script phi dng li gia chng mà ít nht
script cũng phi thc hin tt cc thao tác khác đã được xây dng. Mt ví d
đin hình là script giám sát các thiết lp trên mt s máy tính mà không thay đổi
các thiết lp đó. Trong trường hp này bn s cn xây dng script chy liên tc
cho dù mt hay mt s máy b hư hng không chy được.
Cách đơn gin nht để kim soát các li thi gian chy là l chúng đi khi chúng
xut hin. Bn có th nói vi VBScript thc hin điu này bng cách thêm lnh
sau vào gn nơi bt đầu ca script, chng hn như ngay sau Option Explicit:
On Error Resume Next
Tt nhiên, bn còn mun thc hin thêm nhiu th khác trong kim soát li. Ví
d như kim tra s tn ti ca mt điu kin li thi gian chy mt s đim
nào đấy trong script (như ngay sau khi kết ni ti dch v WMI trên mt máy t
xa) để xác định xem liu mt hot động nào đó script được quy định để thc
hin có thành công hay không. Sau đó, da trên kết qu kim tra điu kin li,
bn có th quyết định script các hot động tiếp theo ca script. Ví d, nếu mt li
xut hin, bn có th nhn được thông báo nói rng: “Computer X not found”
(không tìm thy máy tính X) và sau đó script tiếp tc chy. Chúng ta s tìm hiu
sâu hơn v kim soát li trong mt s bài khác, còn bây gi bn ch cn thêm
lnh trên vào để b qua bt k li thi gian chy nào xut hin.
D liu đầu vào ca người dùng
S phi làm gì nếu chúng ta mun mô t địa ch IP mi cho máy khi chy script
thay vì viết mã cho nó vào script dưới dng 172.16.11.99? Trong trường hp này
chúng ta cn chnh sa script để cho phép cung cp d liu vào ca người dùng
khi chy nó. Thc hin bng cách thêm vào các tham s khi chy script t dòng
lnh. Ví dChangeIPAddress.vbs 172.16.11.188 s thay đổi địa ch IP ca
b điu hp mng thành 172.16.11.188… Chúng ta có th thc hin như sau:
Option Explicit
On Error Resume Next
Dim objWMIService
Dim objNetAdapter
Dim strComputer
Dim strAddress
Dim arrIPAddress
Dim arrSubnetMask
Dim colNetAdapters
Dim errEnableStatic
If WScript.Arguments.Count = 0 Then
Wscript.Echo "Usage: ChangeIPAddress.vbs
new_IP_address"
WScript.Quit
End If
strComputer = "."
strAddress = Wscript.Arguments.Item(0)
arrIPAddress = Array(strAddress)
arrSubnetMask = Array("255.255.255.0")
Set objWMIService = GetObject("winmgmts:\\" & strComputer &
"\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery("Select * from
Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each objNetAdapter in colNetAdapters
errEnableStatic =
objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask)
Next
Chúng ta hãy phân tích tng phn mt. Đầu tiên là khai báo mt biến mi:
Dim strAddress
Đây là mt biến xâu (string) s cha tham s (địa ch IP) chúng ta mô t khi chy
script. Tiếp theo là thêm các dòng bên dưới vào sau phn khai báo:
If WScript.Arguments.Count = 0 Then
Wscript.Echo "Usage: ChangeIPAddress.vbs
new_IP_address"
WScript.Quit
End If
Các dòng này thc hin điu gì? Thuc tính Arguments ca đối tượng WScript
tr v tp hp các tham s được mô t khi chy script. Phương thc Count tr ra
s lượng tham s chúng ta nhp vào và mc đích ca phn đon mã này là kim
tra xem liu chúng ta có quên nhp bt k tham s (s tham s bng 0) nào
không. Nếu có, nó s báo hiu (hoc hin th) mt thông báo nói cho bn biết
cách s dng script phù hp như thế nào và chương trình chy ca script b
ngng li hoàn toàn.
Cui cùng, dòng cũ:
arrIPAddress = Array("172.16.11.93")
nơi chúng ta viết mã cho địa ch IP mi theo kiu gán mng bây gi đã được
thay thế bng hai dòng bên dưới:
strAddress = Wscript.Arguments.Item(0)
arrIPAddress = Array(strAddress)
Dòng đầu tiên ly ra phn t đầu tiên (phn t 0) ca tp hp
WScript.Arguments và gán nó tr thành biến xâu strAddress. Dòng th hai sau
đó ly biến xâu strAddress này và gán nó tr thành phn t đầu tiên ca mng
arrIPAddress.
Hãy xem chuyn gì xy ra khi chy script mi này, đầu tiên không mô t tham
s, sau đó là chy vi mt tham s: