Need help figuring this out please.
Running WMI Scriptblock against 800+ workstations.
Using a file to invoke Runspaces (found it on line and made some mods to it)
##### Invoke-Runspaces.ps1 ##################
Param (
[parameter(Mandatory=$true)]$ScriptBlock = $null,
[parameter(Mandatory=$true)]$Computers = $Null,
[parameter(Mandatory=$true)]$Throttle = 10
)
# Initialize Runsapce Pool
$RunspacePool = [RunspaceFactory]::CreateRunspacePool(20, $Throttle)
$RunspacePool.Open()
$Jobs = @()
# Initiate Runspaces Jobs
ForEach ($Computer in $Computers) {
#Sleep -Seconds (Get-Random -Minimum 2 -Maximum 10)
$Job = [powershell]::Create().AddScript($ScriptBlock).AddArgument($Computer)
$Job.RunspacePool = $RunspacePool
$Jobs += New-Object PSObject -Property @{ Result = $Job.BeginInvoke() }
}
# Wait Untill ALl Runspace jobs complete
Do {
Write-Host "." -NoNewline
Start-Sleep -Seconds 1
} While ( $Jobs.Result.IsCompleted -contains $false)
Write-Host "`r"
# Cleanup
$Jobs = $Null;
$RunspacePool.Close()
$RunspacePool.Dispose()
Remove-Variable -Name jobs
Remove-Variable -Name RunspacePool
[gc]::Collect()
Return $Computers
####### ScriptBlock #####################
$ScriptBlock_PowerOptions = {
Param ($Computer)
$powerplan=get-wmiobject -namespace "root\cimv2\power" `
-class Win32_powerplan `
-filter "IsActive = 'True'" `
-CN $computer.DNSHostName
$powerSettings = $powerplan.GetRelated("win32_powersettingdataindex") `
| foreach {
$powersettingindex = $_;
$powersettingindex.GetRelated("Win32_powersetting") `
| select @{Label="Power Setting";Expression={$_.instanceid}},
@{Label="AC/DC";Expression={$powersettingindex.instanceid.split("\")[2]}},
@{Label="Summary";Expression={$_.ElementName}},
@{Label="Description";Expression={$_.description}},
@{Label="Value";Expression={$powersettingindex.settingindexvalue}}
}
$Computer | Add-Member -MemberType NoteProperty -Name PowerPlan -Value $null -Force
$Computer | Add-Member -MemberType NoteProperty -Name Sleep -Value $null -Force
$Computer | Add-Member -MemberType NoteProperty -Name AllowHybridSleep -Value $null -Force
$Computer | Add-Member -MemberType NoteProperty -Name HibernateAfter -Value $null -Force
$Computer | Add-Member -MemberType NoteProperty -Name HardDiskSleep -Value $null -Force
$Computer.PowerPlan = $PowerPlan.ElementName
$Computer.Sleep = `
$powerSettings | ? {$_."AC/DC" -like "AC" -and $_.Summary -like "sleep after"} | % {$_.Value}
$Computer.AllowHybridSleep = `
$powerSettings | ? {$_."AC/DC" -like "AC" -and $_.Summary -like "*hybrid*"} | % {$_.Value | Select -First 1}
$Computer.HibernateAfter = `
$powerSettings | ? {$_."AC/DC" -like "AC" -and $_.Summary -like "Hibernate*"} | % {$_.Value}
$Computer.HardDiskSleep = `
$powerSettings | ? {$_."AC/DC" -like "AC" -and $_.Summary -like "Turn*Hard*"} | % {$_.Value}
$PowerPlan = $Null; Remove-Variable PowerPlan
$PowerSettings = $null; Remove-Variable PowerSettings
$PowerSettingIndex = $Null; Remove-Variable PowerSettingIndex
[GC]::Collect()
Return $Computer
}# Calling Runspaces
$Computers = .\invoke-runspaces.ps1 `
-scriptblock $ScriptBlock_PowerOptions `
-computers $computers -throttle 500
From lots of testing, I have confirmed that the problem resides within the ScriptBlock. However, it is entirely possible that the Invoke-Runspaces script is not killing the environment after use...
Really need some help with this. Thank you!