2017-05-31 2 views
0
andernfalls

So dieses Ich verwende:Get-WmiObject Win32_NetworkAdapterConfiguration -Match

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

und dann möchte ich folgendes verwenden, um die Subnet Mask für diese IP zu greifen:

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

Gefolgt von:

$SubMask = $IPInfo.IPSubnet[0] 

Aber dies schlägt fehl, da $ IPInfo leer ist. Wenn ich die IP-Adresse fest Code es funktioniert:

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

Aber die Port-IP wird immer anders sein. Warum nimmt das $ IPA nicht als Match-Parameter?

EDIT: Die IP-Adresse gemeldet wird, hat sowohl die IPv4-und IPv6, weshalb ich versuche, -Match gegen die IPv4.

+0

Ich überprüfe jetzt, ob das dein Problem ist, aber "-Match" unterstützt Regex, so dass irgendwelche Meta-Zeichen dort einen Konflikt verursachen könnten. Wenn das für eine genaue Übereinstimmung ist, verwenden Sie einfach "-eq". Könnte mehr als ein Ergebnis bekommen. Wie sieht '$ ipa' aus, wenn Sie es auf die Konsole drucken? – Matt

+0

'$ IPA.GetType(). FullName' show 'System.Object [] 'durch Zufall? – Matt

+0

Wenn ich nur $ IPA in der Konsole mache, zeigt es 10.45.22.100, aber wenn ich $ IPA.GetType() mache. Voller Name zeigt es System.Object []. Auch ich kann -eq nicht tun, da die IP wie folgt aufgeführt ist: IPAddress {10.45.22.100, 2001: 0db8: 85a3: 0000: 0000: 8a2e: 0370: 7334} – PSNewb

Antwort

1

Wie wir in Kommentaren festgestellt haben, erhalten Sie ein Array für Ihre $IPA zurückgegeben. In der Konsole sieht es gut aus, wenn PowerShell das Array zum Anzeigen aller Elemente aufrollt. Da es nur einen gibt, war es irreführend.

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

Wahrscheinlich wurde versucht, „System.Object []“, die passend ist, warum Sie nicht das Ergebnis bekommen haben Sie wollten.

Wenige Möglichkeiten um dies. Eine einfache Möglichkeit wäre, das Ergebnis -First immer in Ihre Abfrage zurückzugeben.

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

So einfach verwenden | select -first 1 und Sie sollten die Ergebnisse, die Sie erwarten bekommen.


Ich warne die Verwendung von -match hier. Verstehen Sie, dass -match und -replace Regex-Musterzeichenfolgen unterstützen. Wenn Sie in Ihren Strings Regex-Metazeichen haben, können Sie unerwartete Ergebnisse erhalten.

+0

Schön.Vielen Dank! Arbeitete perfekt. :) – PSNewb

0

Das passiert, weil $ IPA wirklich ein Array von Objekten ist. Wenn Sie Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName" ausführen, wird ein Array von CIM-Instanzen vom Typ MSFT_NetIPAddress zurückgegeben. Wenn Sie nach IPv4Address Mitglied durch Ausführen von $IPA = (Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName").IPv4Address fragen, ist das Array immer noch vorhanden, aber die Elemente des Arrays, die nicht über IPv4Address verfügen, werden nicht angezeigt. Schauen Sie sich das folgende Beispiel an.

$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] 
} 

Dies zeigt die Subnetzmaske für jede IPv4-Adresse an der angegebenen Schnittstelle an.