与对象的属性进行比较时,Get-ADUser -Filter失败

时间:2015-03-27 17:41:34

标签: powershell foreach

我有一个PowerShell问题,它与导入csv文件有关,然后通过csv文件浏览foreach。

我有以下内容:

$infile = "c:\temp\infile.csv"
$outfile = "c:\temp\outfile.csv"

$csv = Import-csv -path $infile
foreach ($line in $csv)
{
  $data = Get-ADUser -Filter {EmailAddress -eq $line.email} -Property Mail |     Select-Object -ExpandProperty SamAccountName
}

当我这样做时,我收到以下错误:

Get-ADUser : Property: 'email' not found in object of type: 'System.Management.Automation.PSCustomObject'.
At C:\Temp\program1.ps1:11 char:24
+         $ad_data = Get-ADUser <<<<  -Filter {EmailAddress -eq $line.email} -Property Mail | Select-Object -ExpandProperty SamAccountName
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : Property: 'email' not found in object of type: 'System.Management.Automation.PSCustomObject'.,Microsoft.ActiveDirectory.Management.Commands.GetADUser

但如果我做了类似的事情:

    $var = $line.email
    $data = Get-ADUser -Filter {EmailAddress -eq $var} -Property Mail | Select-Object -ExpandProperty SamAccountName

为什么第二种方法有效,但第一种方法会抛出错误?

谢谢,

2 个答案:

答案 0 :(得分:3)

好吧,我和我的一些PowerShell MVP进行了讨论,关于为什么真的很有趣的答案。

为了快速回答,这是在保留代码结构的同时获取AD用户的方法:

Get-ADUser -Filter "Emailaddress -eq '$($line.email)'"

您可以通过单独运行引用代码来快速测试以查看发生的情况:

"Emailaddress -eq '$($line.email)'"
>Emailaddress -eq 'Jim.Adkison@foxdeploy.com'

至于为什么,外部引号集总是在PowerShell中胜出,而*-ADUser -Filter Cmdlet期望值以单引号提供。

根据Dave Wyatt,PowerShell MVP以及所有酷玩家和Mike Robbins,也是MVP并在社区中备受推崇,与PowerShell的其他代码库相比,ADUser Cmdlets扩展变量的方式有些不规范。他们将变量扩展的行为描述为“奇怪的伏都教”,这似乎是正确的。

如果您想了解更多信息,请关注Mike关于此类情景PowerShell: When Best Practices and Accurate Results Collide

的详细博客文章。

答案 1 :(得分:0)

如果在过滤器中使用子表达式,该怎么办?

Get-ADUser -Filter {EmailAddress -eq $($line.email)}

从错误中,它没有在过滤器内正确调用您的对象。

要进行更多测试,$ line的对象类型是什么?

$line | Get-Member