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 行能产生一些有意义的东西。但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: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 添加的属性之一以指定创建对象的位置),请尝试以下操作:

$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 回答