Powershell &引用;不能对空值表达式调用方法。”;尝试接收后台作业中运行的更新搜索程序的结果时

Powershell &引用;不能对空值表达式调用方法。”;尝试接收后台作业中运行的更新搜索程序的结果时,powershell,jobs,comobject,Powershell,Jobs,Comobject,我需要列出所有未安装的Windows更新,并将它们写入文件。但如果时间太长,则必须超时 我尝试以更新搜索器对象作为作业运行搜索,然后在搜索完成或超时时继续。 然后我检查工作是否已经完成。如果有,我将作业传递给Receive job,以获取其结果并将其写入文件 $session=新对象-ComObject“Microsoft.Update.session” $searcher=$session.CreateUpdateSearcher() $j=开始作业-脚本块{ $searcher.Search

我需要列出所有未安装的Windows更新,并将它们写入文件。但如果时间太长,则必须超时

我尝试以更新搜索器对象作为作业运行搜索,然后在搜索完成或超时时继续。 然后我检查工作是否已经完成。如果有,我将作业传递给
Receive job
,以获取其结果并将其写入文件

$session=新对象-ComObject“Microsoft.Update.session”
$searcher=$session.CreateUpdateSearcher()
$j=开始作业-脚本块{
$searcher.Search(“IsInstalled=0”)。更新|选择对象类型、标题、IsHidden
}|等待作业-超时120
如果($j.State-等式“已完成”){
接收作业$j-保留| Out File@Out_选项
}否则{
echo“[TIMEOUT]脚本花费的时间太长,无法获取所有丢失的更新。”|
输出文件@Out\u选项
}
@out\u选项已定义,如果您想知道的话

我唯一收到的是以下错误:

You cannot call a method on a null-valued expression.
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
    + PSComputerName        : localhost
现在我发现错误源于调用
Receive Job
。看来这项工作还没有结果就完成了。
如何从我的后台工作中获得结果?

您遇到了范围问题。scriptblock中的变量
$searcher
与脚本范围中的变量
$searcher
位于不同的范围(因此是不同的变量)。由于未正确初始化,scriptblock中的变量为空,因此导致您观察到的错误(您试图对空值调用
Search()

通常的修复方法是使用
范围修饰符

$j = Start-Job -ScriptBlock {
    $using:searcher.Search("IsInstalled=0").Updates | ...
} | ...

Title
ishiden
之间缺少一个逗号。谢谢@RichMoss。纠正了错误。
$j = Start-Job -ScriptBlock {
    Param($s)
    $s.Search("IsInstalled=0").Updates | ...
} -ArgumentList $searcher | ...
$j = Start-Job -ScriptBlock {
    $session = New-Object -ComObject 'Microsoft.Update.Session'
    $searcher = $session.CreateUpdateSearcher()
    $searcher.Search('IsInstalled=0').Updates | Select-Object Type, Title, IsHidden
} | Wait-Job -Timeout 120