Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PowerShell作业完成时处理它们_Powershell_Jobs - Fatal编程技术网

在PowerShell作业完成时处理它们

在PowerShell作业完成时处理它们,powershell,jobs,Powershell,Jobs,我目前正在50台服务器上运行PowerShell作业,以获取CPU和内存等数据以及一些其他指标 脚本的开始作业部分完成后,我将使用receive job获取数据。一切正常。但是,有时,服务器可能需要时间来响应和完成作业。这可能会延迟脚本的进程数据部分。 是否有一种方法可以在作业完成时接收作业,而不是查看服务器列表并等待作业完成? 例如,服务器5首先完成,因此在服务器5上处理数据,然后服务器10完成,然后服务器1完成等等 这是我的剧本 $functions = { Function Che

我目前正在50台服务器上运行PowerShell作业,以获取CPU和内存等数据以及一些其他指标

脚本的开始作业部分完成后,我将使用receive job获取数据。一切正常。但是,有时,服务器可能需要时间来响应和完成作业。这可能会延迟脚本的进程数据部分。 是否有一种方法可以在作业完成时接收作业,而不是查看服务器列表并等待作业完成? 例如,服务器5首先完成,因此在服务器5上处理数据,然后服务器10完成,然后服务器1完成等等

这是我的剧本

$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的建议,我开始调用命令。脚本现在运行得快多了。谢谢不客气!很高兴知道你能按需要工作。。。[咧嘴笑]