在PowerShell作业完成时处理它们
我目前正在50台服务器上运行PowerShell作业,以获取CPU和内存等数据以及一些其他指标 脚本的开始作业部分完成后,我将使用receive job获取数据。一切正常。但是,有时,服务器可能需要时间来响应和完成作业。这可能会延迟脚本的进程数据部分。 是否有一种方法可以在作业完成时接收作业,而不是查看服务器列表并等待作业完成? 例如,服务器5首先完成,因此在服务器5上处理数据,然后服务器10完成,然后服务器1完成等等 这是我的剧本在PowerShell作业完成时处理它们,powershell,jobs,Powershell,Jobs,我目前正在50台服务器上运行PowerShell作业,以获取CPU和内存等数据以及一些其他指标 脚本的开始作业部分完成后,我将使用receive job获取数据。一切正常。但是,有时,服务器可能需要时间来响应和完成作业。这可能会延迟脚本的进程数据部分。 是否有一种方法可以在作业完成时接收作业,而不是查看服务器列表并等待作业完成? 例如,服务器5首先完成,因此在服务器5上处理数据,然后服务器10完成,然后服务器1完成等等 这是我的剧本 $functions = { Function Che
$functions = {
Function CheckCpuUsage($server) {
$CpuUsage = #Get CPU Usage
return $CpuUsage }
Function CheckMemoryUsage($server) {
$RAMPercentUsed = #Get RAM Usage
return $RAMPercentUsed
#functions to get other stuff
}
#Get Data
$servers | foreach {
$server = $_
Start-Job -Name $server -InitializationScript $functions -ScriptBlock { Param($server)
$arr = @()
$CpuUsage = CheckCpuUsage $server
$RAMPercentUsed = CheckMemoryUsage $server
$arr += [pscustomobject][ordered]@{
"CpuUsage" = $CpuUsage
"RAMPercentUsed" = $RAMPercentUsed
}
return $arr
} -ArgumentList $server
}
#Process Data
$servers | foreach {
$server = $_
Wait-Job -Name $server
$serverdata = Receive-Job -name $server
$MemUsg = $serverdata.RAMPercentUsed
$CPUUsg = $serverdata.CpuUsage
$output += [pscustomobject][ordered]@{
"Server" = $Server
"CpuUsage" = $CpuUsage
"RAMPercentUsed" = $RAMPercentUsed
}
}
查看
等待作业
cmdlet。但是,更好的解决方案是使用Invoke命令
、脚本块和系统列表在目标系统上运行代码。这将把工作转移到目标并并行运行代码。[咧嘴笑]根据@Lee_Dailey的建议,我开始调用命令。脚本现在运行得快多了。谢谢不客气!很高兴知道你能按需要工作。。。[咧嘴笑]