1

我正在尝试获得 2000 多台计算机的正常运行时间。由于未在这些计算机上配置 winrm,因此我无法使用 invoke-command -computername $computers。所以我试图用它start-job来加快速度,但 start-job 没有带有throttleLimit参数作为调用命令。所以我的脚本会触发大量的 powershell.exe 直到它杀死我的记忆......有没有办法限制并发作业?

这就是我现在所拥有的:

$jobs=@()
Get-QADComputer -SearchRoot $OU -SizeLimit 3000 |%{
    $jobs+= Start-Job -ArgumentList $_.name -ScriptBlock {(param $cn)
    if (Test-Connection -Quiet $cn){
        $lastboottime=(Gwmi -computername $cn -Class Win32_OperatingSystem).lastbootuptime
        $sysuptime = (Get-Date) – [System.Management.ManagementDateTimeconverter]::ToDateTime($lastboottime)

        $cn +" "+$sysuptime.days
    }
}
}

$jobs|%{ Wait-Job $_ -Timeout 30 |Receive-Job ;Remove-Job $_}
4

1 回答 1

2

虽然这是一种可行的方法,但您根本不必使用工作。Get-WMIObject接受 aString[]作为ComputerName参数,如果传递了多个计算机名,它将同时轮询多台机器(我认为最多 32 台,但我不记得确切)并在结果中返回一个额外的字段,PSComputerName

你可以更简单地做到这一点。

$servernames = @();
$servernames += get-qadcomputer -searchroot $ou|select name|%{if(test-connection -quiet $_.name) {$_.name}}
get-wmiobject -computername $servernames win32_operatingsystem|select PSComputername,LastBootTime

然后从那里计算每台计算机的正常运行时间。

编辑(Kayasax):这是最终配方:

$alive=@()
$obj=@()

Get-QADComputer -SearchRoot $ou -SizeLimit 4000 |select -ExpandProperty name |foreach-object {
    if (Test-Connection -Quiet -count 1 $_){ $alive+=$_ }
}

Get-wmiobject -computername $alive -Class Win32_OperatingSystem |select PSComputerName, lastBootUpTime |foreach-object{
    $sysuptime = (Get-Date) – [System.Management.ManagementDateTimeconverter]::ToDateTime($_.lastBootUpTime)
    $props=@{"name"=$_.PSComputername;"uptime"=$sysuptime.days}
    $obj+= new-Object -TypeName PSCustomObject -property $props
}

$obj |sort-object uptime -desc
于 2013-01-28T16:07:12.097 回答