問: 嗨,Scripting Guy!我想在一個子網中的所有計算機上運行腳本。有沒有辦法不必將所有 IP 地址都硬編碼到腳本中就能完成這項任務呢?
-- RB
答: 嗨,RB。根據您在電子郵件中的描述,看來您的設置類似于:您的子網的 IP 地址范圍為 192.168.1.1 到 192.168.1.254。您想創建一個腳本,可以先從第一個 IP 地址開始,在相應的計算機上運行某個代碼,然后轉到第二個地址,運行相同的代碼,按地址順序在每臺計算機上都運行相同的腳本。此外,您想通過盡可能最少的代碼行就能辦到這一點,并且不必硬編碼好幾百個 IP 地址。
那么,有辦法能做到嗎?當然有,而且比您想象的還要簡單。
首先,讓我們向您介紹如何某個 IP 地址范圍進行循環。這是一個示例代碼,所以只用于回顯每個 IP 地址的名稱。在介紹了該腳本的工作原理后,我們將舉一個更實際的例子:
For i = intStartingAddress to intEndingAddress strComputer = strSubnet i
Set objWMIService = GetObject _ ("winmgmts:\\" strComputer "\root\cimv2") Set colItems = objWMIService.ExecQuery _ ("Select * From Win32_OperatingSystem") For Each objItem in ColItems Wscript.Echo strComputer ": " objItem.Caption Next
Next
正如您所看到的,我們再次把 strComputer 變量的值設為某個 IP 地址。然后連接到該地址所表示的計算機上的 WMI 服務。這很容易辦到,因為 WMI 既可以使用計算機名,也可以使用 IP 地址連接到計算機。
現在,我們要加入一項小技巧。您在電子郵件中提到,想要排除幾個 IP 地址(可能代表路由器或其他東西)。好的。這里有一個經過修改的腳本,其使用 Select Case 語句來排除某些計算機:
intEndingAddress = 254 strSubnet = "192.168.1."
For i = intStartingAddress to intEndingAddress Select Case i Case 10 Case 50 Case 100
Case Else strComputer = strSubnet i Set objWMIService = GetObject _ ("winmgmts:\\" strComputer "\root\cimv2") Set colItems = objWMIService.ExecQuery _ ("Select * From Win32_OperatingSystem") For Each objItem in ColItems Wscript.Echo strComputer ": " objItem.Caption Next
End Select Next
注意一下當“i”值等于 10、50 或 100 時,所發生的變化。沒錯:一點都沒變化。如果計算機的 IP 地址為 192.168.1.10、192.168.1.50 或 192.168.1.100,不會發生任何變化;不會運行任何 WMI 代碼,腳本將照樣執行循環。該 WMI 代碼將僅在擁有其他 IP 地址(上面三個地址除外)的計算機上執行。這是一種用以在該腳本的 WMI 部分中排除特定 IP 地址的既簡單又有效的辦法。