Chapters/going-deeper-with-parameters/Get-DiskCheck.ps1
Function Get-DiskCheck { [cmdletbinding(DefaultParameterSetName = "name")] Param( [Parameter( Position = 0, Mandatory, HelpMessage = "Enter a computer name to check", ParameterSetName = "name", ValueFromPipeline )] [Alias("cn")] [ValidateNotNullorEmpty()] [string[]]$Computername, [Parameter( Mandatory, HelpMessage = "Enter the path to a text file of computer names", ParameterSetName = "file" )] [ValidateScript( { if (Test-Path $_) { $True } else { Throw "Cannot validate path $_" } })] [ValidatePattern("\.txt$")] [string]$Path, [ValidateRange(10, 50)] [int]$Threshhold = 25, [ValidateSet("C:", "D:", "E:", "F:")] [string]$Drive = "C:", [switch]$Test ) Begin { Write-Verbose "[BEGIN ] Starting: $($MyInvocation.Mycommand)" $cimParam = @{ Classname = "Win32_LogicalDisk" Filter = "DeviceID='$Drive'" Computername = $Null ErrorAction = "Stop" } } #begin Process { if ($PSCmdlet.ParameterSetName -eq 'name') { $names = $Computername } else { #get list of names and trim off any extra spaces Write-Verbose "[PROCESS] Importing names from $path" $names = Get-Content -Path $path | Where-Object {$_ -match "\w+"} | ForEach-Object {$_.Trim()} } if ($test) { Write-Verbose "[PROCESS] Testing connectivity" #ignore errors for offline computers $names = $names | Where-Object {Test-WSMan $_ -ErrorAction SilentlyContinue} } foreach ($computer in $names) { $cimParam.Computername = $Computer Write-Verbose "[PROCESS] Querying $($computer.toUpper())" Try { $data = Get-CimInstance @cimParam #write custom result to the pipeline $data | Select-Object -property PSComputername, DeviceID, Size, Freespace, @{Name = "PctFree"; Expression = { [math]::Round(($_.freespace / $_.size) * 100, 2)} }, @{Name = "OK"; Expression = { [int]$p = ($_.freespace / $_.size) * 100 if ($p -ge $Threshhold) { $True } else { $false } } }, @{Name = "Date"; Expression = {(Get-Date)}} } Catch { Write-Warning "[$($computer.toUpper())] Failed." Write-Warning $_.Exception.message } } #foreach computer } #process End { Write-Verbose "[END ] Ending: $($MyInvocation.Mycommand)" } #end } #Get-DiskCheck |