Powershell循环早退出

时间:2017-11-21 20:01:11

标签: windows powershell system

这是非常愚蠢的,但我的循环显然是在它到达第二个循环之前退出。

脚本的作用是计算服务器上以太网卡的硬件总线和功能号(通常至少包含2个或更多端口)。总线通常对应于服务器中的芯片/卡,功能号通常是特定端口。

示例场景 - 运行get-netadapterhardwareinfo时,带有2个双端口以太网卡的服务器可能如下所示:

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

您可以看到脚本在"总线1和#34;但是然后循环退出"总线2"可以处理。

该行应该处理它

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

和"小于或等于"对于第二个循环,应评估为true。我在最后放了一些写主机来调试循环,似乎退出了。

全文:

#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

    }

2 个答案:

答案 0 :(得分:1)

按照你的逻辑,这是一个应该更好的脚本的清理版本。首先,我们创建一个$Nics数组来执行计算,这样您就不需要经常轮询硬件(慢)。掩盖变量名称(在两个循环中使用$i)也是一种不好的做法。

## 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
    }
}

这是安全的,请注意-WhatIf

答案 1 :(得分:0)

我对你的代码感到有些困惑,并认为你可以做得更简单一些。见下文

<header class="masthead">
  <div class="intro-body">
    <div class="container">
      <div class="row">
        <div class="col-lg-8 mx-auto">
          <h1 class="brand-heading">DoesThat</h1>
          <p class="intro-text">Lorem ipsum dolor sit amet, consectetur 
           adipiscing elit. Nam at erat dui. Aliquam rutrum odio non ante 
           gravida, id efficitur est pellentesque. Morbi blandit leo quis 
           urna facilisis, et pretium ipsum vulputate.</p>
          <a href="#about" class="btn btn-circle js-scroll-trigger">
            <i class="fa fa-angle-double-down animated"></i>
          </a>
        </div>
      </div>
    </div>
  </div>
</header>

如果你离开$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 } ,你会得到如下输出:

  

如果:Rename-NetAdapter -Name&#39; Wi-Fi&#39; -NewName&#39; B58 Port1&#39;

     

如果:Rename-NetAdapter -Name&#39; Ethernet&#39; -NewName&#39; B0 Port7&#39;

如果您想将其投入生产,可以删除-WhatIf