2017-08-13 104 views
0

我使用此脚本来监视服务器分区的可用空间。现在我试图将最新的循环与前一个循环比较,并将自由空间值存储到数组,但我从来没有做过这样的事情。将值与前一个循环进行比较

我不知道如何处理数组 - 一个在循环开始时必须被擦除,另一个必须存储先前的值,然后必须进行比较。

您能否给我至少一个提示?

#play star-wars imperial march 
function play-alarm {  
    Start-Job { 
     [Console]::Beep(440,500) 
    } 
} 
$cred = Get-Credential domain\username 

$hostname = "server1" 

#if free space lower, then play alarm 
$low_level = "10" 

#get drives letters 
$partitions = Get-WmiObject Win32_LogicalDisk -Computername $hostname -Credential $cred | foreach DeviceID 

#create arrays 
$old_values = New-Object System.Collections.ArrayList 
$new_values = New-Object System.Collections.ArrayList 

#noob loop 
$repeat = "2" 

while ($i -lt $repeat) { 
    Write-Host "  ***  " -ForegroundColor Yellow 
    Write-Host "  ***  " -ForegroundColor Yellow 
    Write-Host "  ***  " -ForegroundColor Yellow 
    Write-Host "Free space at server:" -BackgroundColor Black 

    #backup previouse values and clear array for new ones 
    $old_values = $new_values 
    $new_values.Clear() 

    foreach ($partition in $partitions) { 
     $device = "DeviceID='" + $partition + "'" 

     $size = Get-WmiObject Win32_LogicalDisk -Credential $cred -ComputerName $hostname -Filter $device | 
       ForEach-Object {$_.Size} 
     $size = [Math]::Round($size/1GB) 
     $free = Get-WmiObject Win32_LogicalDisk -Credential $cred -ComputerName $hostname -Filter $device | 
       ForEach-Object {$_.FreeSpace} 
     $free = [Math]::Round($free/1GB) 
     Write-Host $free 
     #add value rounded to GB 
     $new_values.Add($free) 

     #if device is CD-ROM, the size or space is zero - this cause error when calculating percentage of free space 
     if ($size -eq "0") { 
      Write-Host "disk " $partition "is CD-ROM" -ForegroundColor Yellow 
     } else { 
      $perc = ($free/$size)*100 
      $perc = [Math]::Round($perc, 3) 

      if ($perc -le $low_level) { 
       Write-Host "Not enough free space at partition " $partition "!!!" $perc "%" -BackgroundColor Red #| play-alarm 
       Start-Sleep -s 15 
      } else { 
       Write-Host "disk " $partition "is OK - " $perc "%" -ForegroundColor Green 
      } 
     } 
    } 

    if ($old_values -eq $new_values) { 
     Write-Host "no change..." 
    } else { 
     Write-Host "Attention - change!!!" -BackgroundColor Red 
    } 

    $time = $((Get-Date).ToString()) 
    Write-Host "Loop finished..." $time -BackgroundColor Black 
    Write-Host "  ***  " -ForegroundColor Yellow 
    Write-Host "  ***  " -ForegroundColor Yellow 
    Write-Host "  ***  " -ForegroundColor Yellow 
    Start-Sleep -s 300 
} 

回答

0

复制以前的值

$old_values = $new_values 
$new_values.Clear() 

的问题,这是$ old_values现指相同数组$ new_values。使用

$old_values = $new_values.Clone() 

创建副本。

比较

你不想使用-eq比较容器对象的内容。你可以通过数组循环和比较每个元素

for ($index=0;$index -lt $old_values.count;$index+=1) { 
    if ($old_values[$index] -ne $new_values[$index]) { 
     write-host "Changed!" 
     break 
    } 
} 

或者你可以使用Compare-Object

if (Compare-Object $old_values $new_values) { 
     write-host "No Change!" 
    } else { 
     write-host "Changed!" 
    } 

Compare-Object返回的差异列表。如果你比较的内容是相同的,那么它返回一个空的(和布尔值false)值。

0

如果您想比较当前值与上一次运行的值,您需要将当前值存储在脚本末尾的某处(例如以CSV文件形式),然后读取该文件(如果存在)在脚本的开始。

$csv = 'C:\path\to\data.csv' 

if (Test-Path -LiteralPath $csv) { 
    $old_values = Import-Csv $csv 
} else { 
    # initialize $old_values as an empty array if the file doesn't exist (yet) 
    $old_values = @() 
} 

... 

$new_values | Export-Csv $csv -NoType 

构建$new_values如通过选择WMI数据的相关属性自定义对象的列表。避免格式化磁盘空间数据,除非要输出给用户。

$new_values = Get-WmiObject Win32_LogicalDisk -Computer $hostname -Credential $cred | 
       Select-Object DeviceID, Size, FreeSpace 

可以使用calculated properties添加得到的信息(如可用磁盘空间的比例):

... | Select-Object DeviceID, Size, FreeSpace, @{n='Ratio';e={$_.FreeSpace/$_.Size}} 

使用Compare-Object比较新旧数据:

Compare-Object -ReferenceObject $old_values -DifferenceObject $new_values -Property DeviceID, Size, FreeSpace 
相关问题