好的,这是我的剧本
$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 |出GridView控件 产生有意义的东西。但是gridview甚至没有弹出。
所以,如果我看不起这个剧本,我看不到任何刺眼的东西,但我希望有一双新的眼睛可以复习......
此脚本的目的是能够在一组服务器的事件查看器中找到所有Application Hang ID,并显示在一个漂亮的gridview中......
如果我删除了启动工作和接收工作业务,我能够看到gridview,但我想让这个运行更快更有效。
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
答案 0 :(得分:5)
您必须传入服务器参数。作业在单独的进程中运行,如果您不将其作为参数传递,则无法访问您的$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
答案 1 :(得分:1)
我相信您的问题在于您执行的脚本块。 “{Get-AppHangs $ srv}}”只包含Get-AppHangs及其参数,除非在scriptblock中提供该函数,否则它将不会执行 - 据我所知。 尝试在scriptblock中包含您的函数并报告结果。