powershell 为什么Get-ADUser -Filter命令不接受$_作为输入?

ncecgwcz  于 2023-03-30  发布在  Shell
关注(0)|答案(1)|浏览(165)

我今天一直在对代码进行故障排除,发现此代码不起作用。我正在使用PowerShell管道发送一组可分辨名称来搜索Active Directory中有管理器的用户。

$managers | Get-ADUser -Filter {manager -eq $_}

但是,如果我使用foreach-object循环和一个显式变量将命令扩展到本例中,则代码可以正常工作。

$managers | %{$manager = $_; Get-ADUser -Filter {manager -eq $manager}}

源代码的哪个部分强迫用户写出这样的表达式?
我对Get-ADUser的源代码并不熟悉,但是在使用本机PSCustomObjects时,使用管道的效果与第一个示例中的预期一致。

u3r8eeie

u3r8eeie1#

简短的回答是-Filter不接受流水线输入,因此不可能有延迟绑定脚本块。这是有充分理由的,所使用的过滤器需要原样传递给Filter Provider不能预先评估
作为一个最小的例子,尝试这个函数的-Filter参数接受ValueFromPipeline,然后删除ValueFromPipeline

function Get-ADThing {
    param(
        [Parameter(ValueFromPipeline)]
        [string] $Filter
    )

    process {
        $Filter
    }
}

'foo', 'bar', 'baz' | Get-ADThing -Filter { "name -eq $_" }

相关问题