Purpose: This script will search a list of computers and report their c drives total and free space into a text file that can be imported into excel.
This is my first time using jobs to speed up the process of gathering the info so there could be a better way of doing this but this seems to work just fine.
cls
#Get free disk space code from here.
#http://www.codeproject.com/Articles/757946/Retrieve-Disk-Space-of-Remote-Computers-using-Powe
$Global:Servers = Get-Content "C:\temp\computers.txt"
$Global:ReportPath = "C:\temp\freediskspace.txt"
$scriptblock = {
param($server)
$ConvertToGB = (1024 * 1024 * 1024)
$pingResult = Test-Connection -count 1 -ErrorAction SilentlyContinue $server | select IPV4Address
$disk = Get-WmiObject Win32_LogicalDisk -ComputerName $Server -Filter "DeviceID='C:'" | Select-Object Size,FreeSpace
$values = @()
if($Error){
if( $Error -like "*Access is denied*"){
return ($server+",,AccessDenied")
}
$Error.Clear()
return ($server+",,")
}
$values += ($Server + "," + ($disk.Size / $ConvertToGB) + "," + ($disk.FreeSpace / $ConvertToGB) )
return $values
}
function getdata{
$jobs = Get-Job | ? { $_.State -eq "Completed" }
foreach( $job in $jobs){
$results = Receive-Job $job
Add-Content $ReportPath $results
Remove-Job $job
}
}
Add-Content $ReportPath "Server,Total,Free"
foreach($server in $Servers){
while( (Get-Job).count -ge 50 ){
sleep -Seconds 1
getdata
}
Start-Job -ScriptBlock $scriptblock -ArgumentList $server
}
while( (get-job).count -ne 0 ){
sleep -Seconds 1
getdata
}
No comments:
Post a Comment