【发布时间】:2018-02-21 16:32:01
【问题描述】:
背景: 我们公司使用的是一个非常古老的软件,我们的数据库程序员每周都会对它进行维护。当他们执行维护时,他们必须在维护之前结束远程计算机上的进程,否则可能会导致损坏。该脚本旨在通过快速识别运行该进程的计算机并随后赋予它们远程杀死它的能力来帮助他们进行维护。
我遇到问题的代码:
function Query-Processes ([System.Collections.ArrayList]$Computerlist)
{
Foreach ($Computer in $Computerlist)
{
Invoke-Command -ComputerName $Computer -AsJob -ScriptBlock {Get-Process | Where-Object {($_.ProcessName -eq 'ntvdm') -or ($_.ProcessName -eq 'Runform')}}
}
$arrJob_Results = @()
While ((Get-Job).Count -gt 0)
{
Get-Job | Where-Object {$_.State -eq 'Failed'} | Remove-Job
Get-Job | Where-Object {($_.State -eq 'Completed')} | ForEach-Object {
If ($_.HasMoreData -eq $False) {Remove-Job -Id $_.Id | Out-Null}
ElseIf ($_.HasMoreData -eq $True) {$arrJob_Results += Receive-Job -Id $_.Id}
}
}
return $arrJob_Results
}
旁注:是的,它正在检查 NTVDM,因为我们有一个使用 16 位 DOS 的关键软件,欢迎来到我们的噩梦
如何在我的主脚本中调用该函数
$arr_RAVM = Test-Computers $arr_RAVM
$RAVM_Process = @(Query-Processes -Computerlist $arr_RAVM.Live)
问题 当函数返回主脚本时,$RAVM_Process 变量具有 Get-Process 作业的结果,但显然还有一些仍在管道中的 Get-Job 输出。
在 ISE 中调试脚本时,我放置了两个断点,一个在 return $arrJob_Results 行上,另一个在我在主脚本中设置的垃圾变量上。 In function variable value
注意事项
在主脚本中,$arr_RAVM = Test-Computers $arr_RAVM 部分采用我从 AD 查询的计算机名称的初始数组,然后通过我使用的 Test-Computers 函数运行它们。然后该函数返回一个包含三个数组的对象:$arr_RAVM.Dead(ping 测试失败)、$arr_RAVM.WinRMFailed(WinRM 测试失败)、$arr_RAVM.Live(ping 可远程管理的计算机)。因此,如果我正在做的那些线路上存在混淆
我知道 Powershell 的返回值可能很棘手,return $arrJob_Results 行更多的是告诉函数它可以停止,而不是实际只返回该值。所以看起来问题是我没有将函数中的所有输出都捕获到变量中,但我无法弄清楚这是怎么回事。我的想法是:While (Get-Job) 行正在执行此操作,因此我尝试使用其他方法创建循环来处理作业,但未成功。
我尝试了几种 While 循环的变体,例如
Get-Job | Where-Object {$_.State -eq 'Failed'} | Remove-Job
Get-Job | Where-Object {($_.State -eq 'Completed') -and ($_.HasMoreData -eq $True)} | Receive-Job | Foreach-Object {$arrJob_Results += $_}
Get-Job | Where-Object {($_.State -eq 'Completed') -and ($_.HasMoreData -eq $False)} | Remove-Job
但仍然收到相同的结果。当我到达函数断点时,如果我执行“Get-Job”之类的操作,它将为空。我最初也有 While 条件,就像 While (Get-Job) 但这里的 .Count 部分只是尝试随机东西的一部分。
非常感谢任何帮助。这是脚本中的第一个实例,我实际上需要处理后台作业的结果(之前主要以“看看它是否失败”的方式使用它)所以看起来我有一些关于作业的东西我从我所读到的内容中无法理解。
免责声明:我不是程序员,更多来自“系统/网络管理员,稳定地不断将更复杂的脚本组合在一起”。我没有接受过正规的编程教育,所以我做的事情可能不是一个好的做法,但我的目标是了解我做错了什么,以便改进。
【问题讨论】:
-
管道
Invoke-Command到Out-Null以及
标签: powershell