Home > Software engineering >  disk check PowerShell with report
disk check PowerShell with report

Time:06-02

I made a PowerShell script to write a report and highlight any disk under 20% of space but the script keeps failing because the size value is not right. Can you please help me?

$Computers = Get-Content -Path C:\Users\gbekari\unbackup\Servers.txt

$results = foreach ($Computer in $Computers){
    Get-WmiObject Win32_Volume -Filter "DriveType='3'" -ComputerName $Computer | ForEach {
           New-Object PSObject -Property @{

           Computername = $computer
           date         = (Get-Date -format "dd.MM.yy HH:mm")
           size         = ([Math]::Round($_.Size /1GB,2))
           freeSpace    = ([Math]::Round($_.FreeSpace /1GB,2))
           Status       = if ([Math]::Round(100 * $db.FreeSpace / $db.Size) -gt 19 ) {'NONE'} else {'Warning'}
           empty        = "Diskcheck"
           }
        }
}

$results | ConvertTo-Csv -NoTypeInformation -Delimiter "|" | % {$_-replace'"',''} | Set-Content -Path C:\Users\gbekari\unbackup\Sers.txt

CodePudding user response:

Lance U. Matthews is on point with his comment, you're trying to reference a property (Size) that does not exist in the Win32_Volume Class and you're referencing a variable that is not defined ($db).

As aside, if you're running PowerShell 3.0 or above, you can construct objects by casting [pscustomobject] instead of using New-Object, this way is more direct and efficient.

Get-WmiObject does not longer exist in newer versions of PowerShell and as stated in the docs:

Starting in PowerShell 3.0, this cmdlet has been superseded by Get-CimInstance

You can also query all computers in parallel, -ComputerName accepts an array of computers.

$Computers = Get-Content -Path C:\Users\gbekari\unbackup\Servers.txt
$results = Get-CimInstance -ClassName Win32_Volume -Filter "DriveType='3'" -ComputerName $Computers | ForEach-Object {
    $status = if ([Math]::Round(100 * $_.FreeSpace / $_.Capacity) -gt 19 ) {
        'NONE'
    }
    else {
        'Warning'
    }

    [pscustomobject]@{
        Date         = Get-Date -format "dd.MM.yy HH:mm"
        Size         = [Math]::Round($_.Capacity / 1GB, 2)
        FreeSpace    = [Math]::Round($_.FreeSpace / 1GB, 2)
        Status       = $status
        Empty        = "Diskcheck"
    }
}

($results | ConvertTo-Csv -NoTypeInformation -Delimiter "|") -replace '"', '' |
    Set-Content -Path C:\Users\gbekari\unbackup\Sers.txt

If you don't mind having the computer names in a column named PSComputerName, leave the code as-is, if instead you want to change the column name you can use Select-Object:

($results | Select-Object @{N='ComputerName'; E={ $_.PSComputerName }}, * |
    ConvertTo-Csv -NoTypeInformation -Delimiter "|") -replace '"', '' |
        Set-Content -Path C:\Users\gbekari\unbackup\Sers.txt
  • Related