2016-06-27 36 views
3

我正在嘗試通過WMI進一步查詢服務器列表。不幸的是,如果腳本遇到無法通過WMI連接的服務器,則需要很長時間才能超時。Powershell:按IP地址的第二個八位字節過濾服務器列表

這些通常是我們DMZ中的服務器,並在IP地址的第二個字節中分配了一個特定的地址,例如.92。所以我期待將這些服務器作爲我查詢中的第一步來篩選出來,因此可以在任何進一步的WMI查詢中忽略它。

我發現了很多關於如何做到這一點的例子,再次,我不能使用WMI方法,因爲這會使對象失效(例如:Get-WmiObject Win32_NetworkAdapterConfiguration)。

在下面的示例中,服務器「SERVER」的IP爲192.9.4.1,我想在第二個八位字節中過濾掉所有帶「.9」的服務器。所以我使用了一個簡單的Test-Connection cmdlet,目的是分割結果。之前,我可以把它分解,在Test-Connection的結果是:

$IP4Address = Test-Connection _Computer SERVER -Count 1 | Select IPV4Address 

@{IPV4Address=192.9.4.1} 

這意味着我需要數從一開始19個字符,讓我的「9」。 IPV4Address

$Octet = $IP4Address -split ("") 
    If ($Octet[19] -eq '9') 
    {write-host "In DMZ"} 
    Else 
    {write-host "Not in DMZ"} 

你問之前,我曾嘗試-split (".")但是這似乎並沒有採取任何影響。

那麼爲什麼結果會出現像@{IPV4Address=192.9.4.1}?有更好的解決方案嗎?

+0

使用'-split「\」','不-split」 .'' –

+0

所有問題的答案,目前缺少這我相信OP中仍然有一個問題,這個問題的另一部分。 '@ {IPV4Address = 192.9.4.1}? ' – Matt

+0

@Matt你說得對,我爲此添加了一個解釋。 –

回答

1

逃避它只得到了IPV4Address屬性的值,你將不得不展開:

$IP4Address = Test-Connection -Computer SERVER -Count 1 | 
    Select-Object -ExpandProperty IPV4Address 

然後你就可以使用.Split()方法:

if($IPV4Address.Split(".")[1] -eq "9") { 
    "In DMZ" 
} else { 
    "Not in DMZ" 
} 

PS:我通常使用-Count 2而不是-Count 1

2

-split operator需要正則表達式模式,而不是字符文字。

在正則表達式中,.是一個通配符,意思是「任何一個字符」,從而產生空字符串(輸入字符串中每個字符之間的位置)的集合。

要匹配文字圓點,與\

PS C:\> '10.0.122.12' -split '\.' 
10 
0 
122 
12 
2

不需要拆的IP地址,只需使用-match

if ($IP4Address -match '^\d+\.9\.') 
{ 
    write-host "In DMZ" 
} 
else 
{ 
    write-host "Not in DMZ" 
} 

正則表達式:

^\d+\.9\.' 

Regular expression visualization


您收到輸出@{IPV4Address=192.9.4.1},因爲您正在選擇object。如果你只是想要得到的字符串,請使用-ExpandProperty參數:

$IP4Address = Test-Connection _Computer SERVER -Count 1 | Select -ExpandProperty IPV4Address 
2

只是想告訴你未分裂的基礎,以及點出你是用「ip地址」有問題的另一種方法對象,你有。你在變量中看到的是一個帶有ipaddress屬性的對象,假定它是一個你正在尋找的字符串。您需要展開該財產或從您的對象$IP4Address.Ipaddress撥打該財產。前者是單一屬性更簡單的解決方案。

您可以將結果作爲類型加速器[ipaddress]進行投射。這是你可以調用該方法並返回你要過濾的八位字節。

$IP4Address = Test-Connection -Computer SERVER -Count 1 | Select -ExpandProperty IPV4Address 
([ipaddress]$IP4Address).GetAddressBytes()[1] 

您需要小心使用這種方法,你也應該做一些檢查,以確保$IP4Address不爲空。

if($IP4Address){([ipaddress]$IP4Address).GetAddressBytes()[1]} 
相關問題