2017-05-31 8 views
0

を失敗:そのIPのサブネットマスクをつかむために、以下に使用するは、Get-WmiObjectコマンドのWin32_NetworkAdapterConfiguration -matchは、だから私はこの使用しています

$IPA = (Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName").IPv4Address 

をして、私が欲しい:

$IPInfo = (Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object IPAddress -Match $IPA) 

が続きます。

$SubMask = $IPInfo.IPSubnet[0] 

しかし、$ IPInfoが空白の場合は失敗します。 IPAddressをハードコードすると、次のように動作します。

$IPInfo = (Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object IPAddress -Match 10.45.22.100) 

しかし、ポートのIPは常に異なっています。 $ IPAをマッチパラメータとして使用しないのはなぜですか?

EDIT:報告されているIPアドレスがIPv4とIPv6の両方を持っているため、私はIPv4とのマッチングを試みています。

+0

これが問題なのかどうかチェックしていますが、 '-match'は正規表現をサポートしているため、そこですべてのメタ文字が競合する可能性があります。これが完全一致の場合は、 '-eq'insteadを使用してください。複数の結果が得られる可能性もあります。あなたがコンソールにそれを印刷するとき、 '$ ipa'はどのように見えますか? – Matt

+0

'$ IPA.GetType()。FullName'は' System.Object [] 'を偶然に表示しますか? – Matt

+0

コンソールで$ IPAだけを実行すると、10.45.22.100が表示されますが、$ IPA.GetType()を実行すると、フルネームでSystem.Object []が表示されます。 また、IPが次のようにリストされているため、-eqを実行できません。 IPAddress {10.45.22.100,2001:0db8:85a3:0000:0000:8a2e:0370:7334} – PSNewb

答えて

1

コメントで発見したように、$IPAの配列が返されています。 PowerShellは配列を展開してすべての要素を表示するので、コンソールでは正常に見えます。 1つしかないので誤解を招いていました。

((Get-NetIPAddress | Where-Object InterfaceAlias -eq "Local Area Connection").IPv4Address).gettype().fullname 
System.Object[] 

多分それはあなたが望んでいた結果を得なかった理由である「のSystem.Object []」と一致しようとしていました。

これを回避する方法はありません。単純なものは、クエリで常に-Firstの結果を返すことです。

(Get-NetIPAddress | Where-Object InterfaceAlias -eq "Local Area Connection").IPv4Address | select -first 1).gettype().fullname 

したがって、| select -first 1を使用してください。期待どおりの結果が得られます。


ここでは-matchの使用に注意します。正規表現パターン文字列をサポートすることを理解してください。-match-replaceだからあなたの文字列に正規表現のメタ文字があるなら、予期しない結果を得ることができます。

+0

ニース。ありがとう!完璧に働いた。 :) – PSNewb

0

これは$ IPAが本当にオブジェクトの配列であるために起こります。 Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName"を実行すると、MSFT_NetIPAddress型のCIMインスタンスの配列が返されます。 を実行してIPv4Addressメンバを依頼すると、配列はそのまま残りますが、IPv4Addressを持たない配列の要素は表示されません。 次の例を見てください。

$NetIPAddresses = (Get-NetIPAddress | where {$_.InterfaceAlias -eq "Ethernet" -and $_.AddressFamily -eq "IPv4"}) 
foreach ($NetIPAddress in $NetIPAddresses) { 
    $IPA = $NetIPAddress.IPv4Address 
    $IPInfo = (Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object IPAddress -Match $IPA) 
    $IPInfo.IPSubnet[0] 
} 

これは、特定のインターフェイス上の各IPv4アドレスのサブネットマスクを表示します。

関連する問題