Foreach循环在运行时丢失结果

时间:2012-11-14 10:11:07

标签: powershell

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

出现问题是因为当我使用此脚本的第3个示例时 - 它不会为服务器带回正确数量的驱动器。 所以为了测试这个,我做了以下几点:

测试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 \根\ CIMV2:Win32_LogicalDisk.DeviceID =" C:" \ db- server01 \ root \ cimv2:Win32_LogicalDisk.DeviceID =" V:" \ DB-SERVER01 \根\ 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上。

???????

2 个答案:

答案 0 :(得分: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++  
}

}

答案 1 :(得分:0)

我实际上已经意识到为什么会这样 - 这是由于

$ percentWarning = 90;

如果驱动器的可用空间少于90%,那么告诉输出只能成功 - 某些服务器具有更高的空间自由价值,当然这一点确实如此 - 所以它没有报告该驱动器。我已将该值编辑为99%并再次获取所有驱动器