2017-11-21 11 views
0

Das ist extrem dumm, aber meine Schleife wird beendet, bevor es zur zweiten Schleife offenbar kommt.Powershell-Schleife beendet früh

Was das Skript macht, zählt die Hardware-Bus- und Funktionsnummer von Ethernet-Karten auf einem Server (normalerweise mindestens 2 oder mehr Ports). Der Bus entspricht normalerweise einem Chip/Karte im Server und die Funktionsnummer normalerweise dem spezifischen Port.

Beispielszenario - ein Server mit zwei Dual-Port-Ethernet-Karten könnte so aussehen, wenn Sie get-netadapterhardwareinfo laufen:

name  Bus Function 
----  --- -------- 
PORT4  2  1 
PORT3  2  0 
B1 Port2 1  1 
B1 Port1 1  0 

Sie das Skript auf „Bus 1“ läuft sehen, aber dann wird die Schleife beendet bevor "Bus 2" bearbeitet werden kann.

Diese Leitung soll es

for($i = 1; $i -le $buscount.Maximum; $i++)

und die „kleiner oder gleich“ Auswerten für die zweite Schleife als wahr sollte zu handhaben. Ich gebe am Ende einige Write-Hosts ein, um die Schleife zu debuggen, sie scheint zu beenden.

FULL SCRIPT:

#BEGIN 
#collect hardware information, determine ports. 
$allnicinfo = Get-NetAdapterHardwareInfo | Select Name, InstanceID, InterfaceDescription, BusNumber, FunctionNumber 

#determine how many adapters exist 
$buscount = Get-NetAdapterHardwareInfo | select -ExpandProperty busnumber | measure-object -maximum | select Maximum 

#improve the bus count method 
for($i = 1; $i -le $buscount.Maximum; $i++) 
    { 
    $bus = $i 

    $funccount= @() 
    $funccount = $allnicinfo | where-object {$_.busnumber -eq $i} | select -expandproperty functionnumber | measure-object -Maximum | select Maximum 
    for($i = 0; $i -le $funccount.Maximum; $i++) 
     { 
     $nic = Get-NetAdapterHardwareInfo | where {($_.busnumber -eq $bus) -and ($_.functionnumber -eq $i)} 
     $port = $i + 1 
     Rename-NetAdapter $nic.Name "B$bus Port$port" 
     } 
    write-host $bus 
    write-host $i 

    } 
+0

Wo existiert 'BusNumber'? Ich sehe in Ihrem Beispiel, dass es eine 'Bus'-Eigenschaft gibt, aber keine' BusNumber'. Außerdem sollte Ihre '$ allnicinfo' -Variable eine' .Count'-Eigenschaft haben, da es sich um ein Array handelt. – TheIncorrigible1

+0

$ Dies ist eine Eigenschaft des Cmdlets get-netadapterhardwareinfo. Scheint nicht zu zählen, warum bin ich mir nicht sicher. Sie haben wahrscheinlich recht, dass ich es als Array speichern sollte, ich glaube aber nicht, dass es mein Loop-Problem lösen wird. – Brink

+0

Warum verwenden Sie 'For' anstelle von' ForEach' Loops? Scheint ein wenig gewunden zu folgen. Alles, was Sie tun, ist das Umbenennen von Adaptern – TheIncorrigible1

Antwort

1

Ihre Logik folgend, ist hier eine aufgeräumt Version des Skripts, die besser funktionieren sollte. Zuerst erstellen wir ein Array von $Nics, um Berechnungen durchzuführen, so dass Sie Ihre Hardware nicht ständig abfragen müssen (langsam). Es ist auch eine schlechte Übung, Variablennamen zu maskieren (unter Verwendung von $i in beiden Loops).

## Collect hardware information, determine ports 
$Nics = @(
    Get-NetAdapterHardwareInfo | 
     Select-Object -Property @('Name', 'InstanceID', 'InterfaceDescription', 'BusNumber', 'FunctionNumber') 
) 

## Rename logic 
For ($i = 0; $i -le $Nics.Count; $i++) 
{ 
    $FunctionCount = (($Nics | Where-Object { $_.BusNumber -eq $i }).FunctionNumber | Measure-Object -Maximum).Maximum 

    For ($j = 0; $j -le $FunctionCount; $j++) 
    { 
     $Nic = $Nics | Where-Object { $_.BusNumber -eq $i -and $_.FunctionNumber -eq $j } 
     Rename-NetAdapter -Name $Nic.Name -NewName "B$i Port$($j + 1)" -PassThru -WhatIf 
    } 
} 

Dieses ist sicher, laufen Sie beachten -WhatIf

+0

Funktioniert perfekt, danke! Ich werde versuchen, diesen anderen Ansatz zu vermeiden! – Brink

0

ich von Ihrem Code ein wenig verwirrt war und denken, es ein wenig einfacher machen könnte. Siehe unten

$NetAdapterHardwareInfo = Get-NetAdapterHardwareInfo 
foreach ($NetAdapter in $NetAdapterHardwareInfo) 
{ 
    $NewName = 'B{0} Port{1}' -f $NetAdapter.Bus,($NetAdapter.Function + 1) 
    Rename-NetAdapter $NetAdapter.Name -NewName $NewName -WhatIf 
} 

Wenn Sie die -WhatIf verlassen würden Sie Ausgabe wie folgt erhalten:

Was passiert, wenn: Umbenennen-NetAdapter -Name 'Wi-Fi' -newname 'B58 Port1'

Was passiert, wenn: Umbenennen-NetAdapter -Name 'Ethernet' -newname 'B0 PORT7'

Sie können nur die -WhatIf entfernen, wenn Sie es in der Produktion setzen wollen.