我正在努力让2000多台计算机正常运行。
由于winrm未在这些计算机上配置,因此我无法使用invoke-command -computername $ computers。
所以我尝试使用start-job
来加快速度,但是start-job并没有使用throttleLimit
参数作为invoke-command。所以我的脚本会激活大量的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 $_}
答案 0 :(得分:1)
虽然这是一种可行的方法,但您根本不必使用工作。对于Get-WMIObject
参数,String[]
需要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