iT邦幫忙

DAY 26
3

強而有力的 Windows PowerShell系列 第 26

使用 Windows PowerShell 檢查網路設定是否正確

依照前幾篇分享去設定好網路卡的TCP/IP 相關設定之後,可以進一步檢查網路的設定是否正確。

強而有力的 Windows PowerShell 系列文章列表如下:
http://ithelp.ithome.com.tw/event/ironmanarticle2/id/20005121
常用的檢查網路設定是否正確的常用方法是使用 Ping 指令,不過在 Windows PowerShell 裡可直接使用 Win32_PingStatus 類別,對電腦進行簡單的 Ping 操作。例如下列的命令會在本機電腦中,對 127.0.0.1 執行 Ping:

$strComputer = "."
$ipAdr = "127.0.0.1"
Get-WmiObject -Class Win32_PingStatus -Filter "Address='$ipAdr'" -ComputerName $strComputer

請特別注意,對 Ping 的目的地要使用 Filter 參數,且要用 Address= 帶頭,接著用一對**單引號(')把 Ping 的目的地包起來,最後再用一對括號(")**把整個 Address 包起來。大家不要給 Address 這個英文字給騙了,其實它可以是電腦名稱、網路名稱,例如下面的例子:

# Ping 電腦名稱為 alexc
Get-WmiObject Win32_PingStatus -Filter "Address='alexc'"

# Ping www.hinet.net
Get-WmiObject Win32_PingStatus -Filter "Address='www.hinet.net'"

其實我們比較希望看到的結果欄位是顯示 Address、IPV4Address、ResponseTime 和 StatusCode 屬性,因此可透過 Format-Table 的 Autosize 參數自動調整表格欄位的寬度:

$ipAdr = "127.0.0.1"
Write-Host "Ping $ipAdr"
Get-WmiObject Win32_PingStatus -Filter "Address='$ipAdr'" |`
  Format-Table -Property Address,IPV4Address,ResponseTime,StatusCode -AutoSize

Write-Host "----------------------------------------"
$ipAdr = "192.168.192.168"
Write-Host "Ping $ipAdr"
Get-WmiObject Win32_PingStatus -Filter "Address='$ipAdr'" |`
  Format-Table -Property Address,IPV4Address,ResponseTime,StatusCode -AutoSize

StatusCode 屬性的值是 0,代表 Ping 成功;如果沒有值或是值不為 0,則代表 Ping 失敗了。詳細的 StatusCode 屬性值的說明對照表在這邊

萬一要檢查的位址數目有很多個,可以使用陣列的方式,搭配 ForEach-Object 對每個位址執行 Ping 作業,便可藉由單一的命令對多部電腦執行 Ping 作業:

$ipAdr = "127.0.0.1", "localhost", "www.hinet.net"
$ipAdr | ForEach-Object -Process {Get-WmiObject Win32_PingStatus -Filter ("Address='" + $_ + "'")} |`
  Select-Object -Property Address,IPV4Address,ResponseTime,StatusCode

另外一種方式可參考「使用 Windows PowerShell 查看已經安裝的 Hotfix」所使用的 Get-Content cmdlet,就請自個發揮嘍。

我們可以使用類似上面的命令格式,對子網路上的所有電腦執行 Ping 作業。假設網路使用 IP 位址為 192.168.5.0 這個標準的 Class C 子網路遮罩(亦即 255.255.255.0),則只有從 192.168.5.1 到 192.168.5.254 這個範圍內的位址,才算是合法的 IP 位址(因為 0 會保留給網路編號使用,且 255 是子網路的廣播位址)。所以如果要找出某個區域網路內,所有電腦的開機狀態,可使用下面的指令(前提當然是那些電腦不能去阻擋 Ping 的回應

cls
$i =1
$ipAdr = "192.168.5."
Do { $ipV4 = $ipAdr + $i
  $pingPC = Get-WmiObject Win32_PingStatus -F "Address='$ipV4'" 
  $pingPC | Select-Object Address, StatusCode | Format-Table -AutoSize
  $i++
}
Until ($i -eq 255)

上面的指令可以改寫成這樣:

cls
1..254 | ForEach-Object -Process {`
  Get-WmiObject Win32_PingStatus -F ("Address='192.168.5." + $_ + "'") } |`
  Select-Object Address, StatusCode | Format-Table -AutoSize

在 Windows PowerShell 中,.. 叫做**「範圍運算子」**,代表特定上、下界限之整數陣列中的連續整數。所以我們可以用 1..254 這樣的寫法來代表數字 1 到 254 的陣列,便可產生陣列並遞增 Ping 所要的部分 IP 位址值,進而對整個子網路執行 Ping 作業。.

透過直接檢查 StatusCode 屬性值是否為 0,藉以判斷某個電腦網路是否已經連線:

cls
1..254 | ForEach-Object -Process {`
  $PingOK = Get-WmiObject Win32_PingStatus -F ("Address='192.168.5." + $_ + "'") 
  if($PingOK.StatusCode -eq 0) {
     "{0,15} {1,5} {2,5}" -f
     $PingOK.Address, $PingOK.StatusCode, " 已經連線"
    } 
    else {
      "{0,15} {1,5} {2,5}" -f
      $PingOK.Address, $PingOK.StatusCode, " 沒有連線"
    }
}

由於 Out-Host cmdlet 會將輸出傳送到 Windows PowerShell 主機以供顯示,且又是預設值,所以可省略不寫。程式碼中的 "{0,15} {1,5} {2,5}" -f 是另外一種格式化輸出的寫法(其他寫法請參考:「Windows PowerShell 基本操作 - 將執行的結果格式化」)。

-f 是所謂的**「格式運算子」**,使用字串物件的格式化方法即可格式化字串。在運算子的左邊要指定格式的字串,運算子的右邊則是要進行格式化的物件。簡單地說,就是讓輸出的結果的第 1 個欄位寬度為 15、第 2 個欄位為 5、第 3 個欄位為 5,這樣子的結果就會排列很整齊:


上一篇
使用 Windows PowerShell 設定網路卡的 DHCP
下一篇
使用 Windows PowerShell 建立網路共用
系列文
強而有力的 Windows PowerShell33

尚未有邦友留言

立即登入留言