gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:34:55 26 4
gpt4 key购买 nike

我有一个与导入 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 -Filter Cmdlet 期望在单引号中提供值。

根据 Dave Wyatt、PowerShell MVP 和周围的酷家伙和 Mike Robbins(也是 MVP 和在社区中备受推崇的)的说法,与 PowerShell 的其他代码库相比,ADUser Cmdlet 扩展变量的方式有些不标准。他们将变量扩展的行为描述为“奇怪的伏都教”,这似乎是正确的。

如果您想了解更多信息,请关注 Mike 关于此类场景的非常详细的博客文章 PowerShell: When Best Practices and Accurate Results Collide

关于powershell - 与对象的属性进行比较时,Get-ADUser -Filter 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29306898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com