1

わかりました、これが私のスクリプトです

$server=@("SERVER1","SERVER2")
$A=@()

foreach($srv in $server){
    start-job -scriptblock {Get-AppHangs $srv}}

while (Get-Job -State "Running"){}

foreach($JB in Get-Job){$A+=Receive-Job $JB}

Remove-Job *

$A|Out-GridView


function Get-AppHangs($srv){
    $A=@()
    $XX=Get-EventLog -ComputerName $srv -LogName "application" | Where-Object {$_.InstanceID -ge 1000 -and $_.InstanceID -lt 1005} | select -First 5

    foreach($x in $XX){
        $time = $_.Time.ToString()
        $obj=New-Object PSObject
        $obj|Add-Member -MemberType "NoteProperty" -Name Server -Value $srv
        $obj|Add-Member -MemberType "NoteProperty" -Name Index -Value $x.Index
        $obj|Add-Member -MemberType "NoteProperty" -Name Time -Value $x.Time -SecondValue System.string
        $obj|Add-Member -MemberType "NoteProperty" -Name EntryType -Value $x.EntryType
        $obj|Add-Member -MemberType "NoteProperty" -Name Source -Value $x.Source
        $obj|Add-Member -MemberType "NoteProperty" -Name InstanceID -Value $x.InstanceID
        $obj|Add-Member -MemberType "NoteProperty" -Name Message -Value $x.Message
        $A+=$obj
    }
    $obj3=New-Object PSObject
    $A+=$obj3
    return $A
}

私の問題は、行 $A|Out-GridView が意味のあるものを生成することを期待していることです。しかし、グリッドビューもポップアップしません。

したがって、このスクリプトを見下ろしても、私を睨みつけているものは何も見えませんが、新鮮な目でレビューできることを願っています...

このスクリプトの目的は、一連のサーバーのイベント ビューアですべてのアプリケーション ハング ID を見つけて、適切なグリッドビューに表示できるようにすることです...

ジョブの開始と受信のビジネスを切り取れば、グリッドビューを表示できますが、これをより高速かつ効率的に実行したいと考えています。

heeeeelp ;) よろしくお願いします!また、カスタム オブジェクトに Time プロパティを取得する方法もわかりませんでした。そのためのヒントがあれば、それも素晴らしいことです。

更新されたスクリプト:

    $server=@("SERVER1","SERVER2")
    $A=@()

    foreach($srv in $server)
    {
        start-job -scriptblock {
                                $A=@()
                                $XX=Get-EventLog -ComputerName $srv -LogName "application" | Where-Object {$_.InstanceID -ge 1000 -and $_.InstanceID -lt 1005} | select -First 5

                                foreach($x in $XX){
                                    $obj=New-Object PSObject
                                    $obj|Add-Member -MemberType "NoteProperty" -Name Server -Value $srv
                                    $obj|Add-Member -MemberType "NoteProperty" -Name Index -Value $x.Index
                                    $obj|Add-Member -MemberType "NoteProperty" -Name EntryType -Value $x.EntryType
                                    $obj|Add-Member -MemberType "NoteProperty" -Name Source -Value $x.Source
                                    $obj|Add-Member -MemberType "NoteProperty" -Name InstanceID -Value $x.InstanceID
                                    $obj|Add-Member -MemberType "NoteProperty" -Name Message -Value $x.Message
                                    $A+=$obj}

                                $obj3=New-Object PSObject
                                $A+=$obj3

                                return $A
                                }
    }
    while (Get-Job -State "Running"){}
    foreach($JB in Get-Job){$A+=Receive-Job $JB}
    Remove-Job *
    $A|Out-GridView
4

2 に答える 2

6

サーバーパラメータを渡す必要があります。ジョブは別のプロセスで実行さ$srvれ、引数として渡さないと文字列にアクセスできません。PS3.0 では「using」スコープ (例$using:srv) を使用できますが、PS2.0 ではスクリプトブロックで使用param(..)-Argumentlistてオブジェクトを送信する必要があります。これを試して:

$server=@("SERVER1","SERVER2")

foreach($srv in $server)
{
    Start-Job -scriptblock {
        param($serv)
        $out=@()
        $XX=Get-EventLog -ComputerName $serv -LogName "application" | Where-Object {$_.InstanceID -ge 1000 -and $_.InstanceID -lt 1005} | select -First 5

        foreach($x in $XX){
            $obj=New-Object PSObject
            $obj|Add-Member -MemberType "NoteProperty" -Name Server -Value $srv
            $obj|Add-Member -MemberType "NoteProperty" -Name Index -Value $x.Index
            $obj|Add-Member -MemberType "NoteProperty" -Name EntryType -Value $x.EntryType
            $obj|Add-Member -MemberType "NoteProperty" -Name Source -Value $x.Source
            $obj|Add-Member -MemberType "NoteProperty" -Name InstanceID -Value $x.InstanceID
            $obj|Add-Member -MemberType "NoteProperty" -Name Message -Value $x.Message
            $out += $obj
        }
        $out
    } -ArgumentList $srv
}

$A = Get-Job | Wait-Job | Receive-Job
$A | Out-GridView

runspaceid (オブジェクトが作成された場所を指定するために start-job が追加するプロパティの 1 つ) を除外する場合は、次のようにしてください。

$A | Select-Object -Property * -ExcludeProperty RunspaceID | Out-GridView
于 2013-01-30T18:09:39.093 に答える
1

あなたの問題は、実行するスクリプトブロックにあると思います。「{Get-AppHangs $srv}}」には Get-AppHangs とその引数のみが含まれます。関数がスクリプトブロック内で提供されない限り、関数は実行されません-私の知る限りでは。関数をスクリプトブロックに含めてみて、結果を報告してください。

于 2013-01-30T17:38:53.243 に答える