2012-11-14 31 views
0

我正在运行脚本来查询服务器的驱动器以恢复磁盘空间结果。该脚本运行使用文本文件服务器列表的这个问题,我只有一个服务器名称在txt文件中,并最终生成一个HTML文件。Foreach循环在运行时缺少结果

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

测试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 \根\ 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.

???????

+0

伊夫其实明白了为什么这种情况正在发生 - 这是由于$ percentWarning = 90; $ percentCritcal = 25;如果驱动器的可用空间少于90%,某些服务器具有更高的空间免费价值,并且肯定这样做 - 所以它不告知驱动器,只有在告诉输出才能成功的情况下。我编辑了99%的值,然后再次拾取所有驱动器 – MoOriginal

回答

0

伊夫真正实现为什么发生这种情况 - 这是由于

$ percentWarning = 90;

其中告诉输出只有在驱动器空闲时间少于90%时才能成功 - 某些服务器有更高的空间免费价值,当然这样做 - 所以它不报告该驱动器。我编辑的价值是99%,它再次拿起所有的驱动器

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

}