嗨,Scripting Guy!

Hey,Scripting Guy!

歡迎使用全新的 TechNet 專欄,Microsoft Scripting Guy 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:我要如何刪除 Temporary Internet Files 資料夾中的檔案?


如何針對某個範圍的 IP 位址執行指令碼?

嗨,Scripting Guy!我想要針對子網路的所有電腦執行指令碼。有哪種方法是不需要將所有 IP 位址硬編碼到指令碼中?

-- RB

RB,您好。根據您的電子郵件,您的設定看起來類似這樣:您的子網路的 IP 位址範圍從 192.168.1.1 到 192.168.1.254。您想建立一個指令碼,以第一個 IP 位址為開始、針對電腦執行一些程式碼、移到第二個位址、執行相同的程式碼,然後繼續這樣的動作,直到您在每一部電腦上都完成了相同動作為止。此外,您想要盡可能地用少數幾行的程式碼來執行這個動作,且不需要硬編碼數百個 IP 位址。

有方法可以進行這樣的動作嗎?當然有,且比您想像中的還簡單。

一開始,我們會示範如何針對某個範圍的 IP 位址進行迴圈處理。這是一個簡單的程式碼,它所作的就是呼叫每個 IP 位址的名稱。解釋完指令碼的作用方式後,我們會示範一個實際的範例:

On Error Resume Next
intStartingAddress = 1
intEndingAddress = 254
strSubnet = "192.168.1."
For i = intStartingAddress to intEndingAddress
    strComputer = strSubnet & i
    Wscript.Echo strComputer
Next

沒錯,這就是完整的指令碼。一開始先指派部份變數:將 intStartingAddress 值指派為 1;intEndingAddress 值指派為 254;而 strSubnet 值指派為 192.168.1.(請注意 1 後面需要句號)。您可能已經猜到了,這些值將作為建構 IP 位址的建置組塊。

指派完變數後,建立一個從 1 (intStartingAddress) 執行到 254 (intEndingAddress) 的 For-Next 迴圈。為什麼從 1 到 254 進行迴圈呢?很簡單的:那就是您的 IP 範圍。如果 IP 範圍是從 192.168.1.7 到 192.168.1.54 該怎麼辦?沒問題:使用同一個迴圈,但只要將 intStartingAddress 值變更為 7 及將 intEndingAddress 值變更為 54 就可以了。

在迴圈內,我們將字串值 192.168.1. 與迴圈變數 (i) 目前的值串連在一起。第一次執行迴圈時 (就是 i 等於 1 時),將 192.168.1.1 合併在一起。您猜結果如何?所得的值是 192.168.1.1,而它就是第一個 IP 位址。最後一次執行迴圈時,將 192.168.1.254 結合在一起,就得到最後一個 IP 位址的值 192.168.1.254。執行這個指令碼所會得到類似下列的結果:

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4

很簡單吧?

當然,也許您不想回應一堆 IP 位址;您反而想要執行某種 WMI 程式碼。這也是可以:

On Error Resume Next
intStartingAddress = 1
intEndingAddress = 254
strSubnet = "192.168.1."
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 位址,這些 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 的值 (IP 位址中最後一個八位元) 等於 10、50 或 100 時,會發生什麼。沒錯:什麼都沒發生。如果電腦的 IP 位址是 192.168.1.10、192.168.1.50 或 192.168.1.100,則什麼都不會發生;不會執行任何 WMI 程式碼,且指令碼只會進行迴圈。只有電腦的 IP 位址不是上述那三個時,才會執行 WMI 程式碼。這個簡單卻有效的方法,可以讓您從指令碼 WMI 部份排除特定的 IP 位址。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首