mar*_*001 4 powershell foreach
我有一个与导入 csv 文件有关的 powershell 问题,然后通过 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
为什么第二种方法有效,但第一种方法会引发错误?
谢谢,
好吧,我和我的一些 PowerShell MVP 同事进行了讨论,关于原因的答案真的很有趣。
为了快速回答,这是在保留代码结构的同时获取 AD 用户的方法:
Get-ADUser -Filter "Emailaddress -eq '$($line.email)'"
您可以通过单独运行引用的代码来快速测试以查看发生了什么:
"Emailaddress -eq '$($line.email)'"
>Emailaddress -eq 'Jim.Adkison@foxdeploy.com'
至于为什么,外部引号总是在 PowerShell 中获胜,而*-ADUser -FilterCmdlet 期望值以单引号形式提供。  
根据 Dave Wyatt、PowerShell MVP 和周围的酷家伙和 Mike Robbins(也是 MVP 和在社区中备受推崇的)的说法,与 PowerShell 的其他代码库相比,ADUser Cmdlet 扩展变量的方式有些不标准。他们将变量扩展的行为描述为“奇怪的伏都教”,这似乎是正确的。
如果您想了解更多信息,请关注 Mike 关于此类场景的非常详细的博客文章PowerShell:当最佳实践和准确结果发生冲突时
| 归档时间: | 
 | 
| 查看次数: | 13336 次 | 
| 最近记录: |