【问题标题】:Foreach loop missing results when runForeach 循环在运行时缺少结果
【发布时间】:2012-11-02 19:51:29
【问题描述】:

我正在运行一个脚本来查询服务器的驱动器以返回磁盘空间结果。该脚本使用此问题的服务器文本文件列表运行,我在 txt 文件中只有一个服务器名称,并最终构建一个 html 文档。

出现问题是因为当我使用此脚本的第三个示例时 - 它不会为服务器恢复正确数量的驱动器。 因此,为了对此进行测试,我执行了以下操作:

测试 1。

Get-WmiObject 
    -ComputerName DB-server01 
    -Class Win32_LogicalDisk 
    -Filter "DriveType = 3"

结果:

DeviceID     : C:
DriveType    : 3
ProviderName : 
FreeSpace    : 28575797248
Size         : 146056146944
VolumeName   : OS

DeviceID     : V:
DriveType    : 3
ProviderName : 
FreeSpace    : 814725959680
Size         : 898316103680
VolumeName   : SQLData

DeviceID     : W:
DriveType    : 3
ProviderName : 
FreeSpace    : 293852868608
Size         : 299436601344
VolumeName   : SQLLogs

测试 2。

$computers = Get-Content "C:\Powershell\servers.txt";
write-host $computers
foreach($computer in $computers)
{ 
    $disks = Get-WmiObject 
        -ComputerName $computer 
        -Class Win32_LogicalDisk 
        -Filter "DriveType = 3"
    write-host $disks
}

结果

DB-server01

\DB-server01\root\cimv2:Win32_LogicalDisk.DeviceID="C:" \db-server01\root\cimv2:Win32_LogicalDisk.DeviceID="V:" \db-server01\root\cimv2:Win32_LogicalDisk.DeviceID= “W:”

测试 3。

$i = 0;
$percentWarning = 90;
$percentCritcal = 25;
$computers = Get-Content "C:\Powershell\servers.txt";
write-host $computers

foreach($computer in $computers)
{ 
    $disks = Get-WmiObject 
        -ComputerName $computer 
        -Class Win32_LogicalDisk 
        -Filter "DriveType = 3"

    $computer = $computer.toupper()

    foreach($disk in $disks)
    {        
        $deviceID = $disk.DeviceID;
        $volName = $disk.VolumeName;
        [float]$size = $disk.Size;
        [float]$freespace = $disk.FreeSpace; 
        $percentFree = [Math]::Round(($freespace / $size) * 100, 2);
        $sizeGB = [Math]::Round($size / 1073741824, 2);
        $freeSpaceGB = [Math]::Round($freespace / 1073741824, 2);
        $usedSpaceGB = $sizeGB - $freeSpaceGB;

        $color = $whiteColor;

        if($percentFree -lt $percentWarning)      
        {
            $color = $greenColor
            if($percentFree -lt $percentCritcal)
            {
                $color = $redColor
            }        

            if ($percentFree -eq "NaN")
            {
                $PercentFree = "N/A"
                $Color = $whiteColor
            }  

            Add-Content $diskReport $dataRow;

            Write-Host -ForegroundColor Green 
                "$computer $deviceID percentage free space = $percentFree";

            $i++  
        }
    }
}

结果:

DB-Server01 C: percentage free space = 19.56

当通过外观测试 3 只带回驱动器 c 并错过了 V & W。

?????????

【问题讨论】:

  • 我实际上意识到为什么会发生这种情况 - 这是由于 $percentWarning = 90; $percentCritcal = 25;如果驱动器的可用空间低于 90%,则两者都告诉输出成功——一些服务器的可用空间价值要高得多,当然这台服务器确实如此——所以它没有在该驱动器上报告。我已经将值编辑为 99% 并且它再次拾取所有驱动器

标签: powershell


【解决方案1】:

我遇到了同样的问题,发现确实没有显示磁盘,因为脚本正在跳过具有足够磁盘空间的磁盘。如果要显示所有磁盘,则必须调整脚本。问题是没有正确放置“}”以使磁盘没有问题。 只有当百分比低于警告级别时,脚本才会打印

您可以将最后一位更改为:

    if($percentFree -lt $percentWarning)      
    {
        $color = $greenColor
        if($percentFree -lt $percentCritcal)
        {
            $color = $redColor
        }        

        if ($percentFree -eq "NaN")
        {
            $PercentFree = "N/A"
            $Color = $whiteColor
        }  }

        Add-Content $diskReport $dataRow;

        Write-Host -ForegroundColor Green 
            "$computer $deviceID percentage free space = $percentFree";

        $i++  
}

}

【讨论】:

    【解决方案2】:

    我实际上意识到为什么会发生这种情况 - 这是由于

    $percentWarning = 90;

    其中只有在驱动器的可用空间低于 90% 时才告诉输出成功 - 某些服务器的可用空间价值要高得多,当然这台服务器确实如此 - 所以它没有报告该驱动器。我已经将值编辑为 99% 并且它再次拾取所有驱动器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多