考虑以下代码片段
$User = @{Username = "fred.bloggs"}
$Username = $User.Username
Get-AdUser -Filter {SamAccountName -eq $Username} # this works
Get-AdUser -Filter {SamAccountName -eq $User.Username} # this throws an error
第一个Get-User可以使用,但第二个失败了:
Get-AdUser:属性:在类型为'System.Collections.Hashtable'的对象中找不到'用户名'。
我知道PowerShell使用对象和从左到右解析的解析怪癖,并且通常将它包装在$($ User.Username)中,但这也不起作用。
我知道答案很简单!
答案 0 :(得分:2)
由于-Filter
正在寻找System.String
,您可以通过使用双引号而不是脚本块来解决解析问题:
Get-ADUser -Filter "SamAccountName -eq '$($User.Username)'"
Get-ADUser
会将传递给-Filter
的任何脚本块转换为字符串进行评估,因此首先使用字符串会很有帮助。
答案 1 :(得分:1)
可悲的是,我无法告诉你它失败的原因,但这可能是你的解决方法:
$filter = [scriptblock]::create("SamAccountName -eq $($User.Username)")
Get-AdUser -filter $filter
如果您发现您遇到的行为的原因,我会很高兴听到它:)
此致
更新
发生这种情况的可能原因是因为-Filter
需要一个String,如果给出{}
内的表达式,它会将其解释为高级过滤器,它不支持函数调用和类似的东西。
资料来源:MSDN(感谢Kohlbrr)