我有一个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
为什么第二种方法有效,但第一种方法会抛出错误?
谢谢,
答案 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