1

2000 台以上のコンピューターの稼働時間を取得しようとしています。これらのコンピューターでは winrm が構成されていないため、invoke-command -computername $computers を使用できません。だから私は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

これは実行可能な方法ですが、ジョブを使用する必要はまったくありません。パラメータに aをGet-WMIObject取り、複数のコンピューター名が渡された場合、複数のマシンを同時にポーリングし (最大 32 と思いますが、正確には思い出せません)、結果に追加のフィールドを返します。String[]ComputerNamePSComputerName

これはもっと簡単に行うことができます。

$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 に答える