希望是一个PowerShell noob问题,但是如何访问脚本块中的当前管道对象,该脚本块也在哈希表中?
以下是我试图完整的事情:
Get-ADGroupMember "Group Name" |
Where {$_.objectClass -eq "user"} |
Get-ADUser -properties extensionAttribute1 |
Where {$_.extensionAttribute1 -ne ($_.UserPrincipalName -replace "@ADdomain.com", "@GAdomain.com")} |
Set-ADUser -replace @{extensionAttribute1=&{$_.UserPrincipalName -replace "@ADdomain.com", "@GAdomain.com"}}
除了最后一行之外,我已经完成了所有工作,其中应该从当前用户extensionAttribute1
生成新的UserPrincipalName
,替换域。运行此代码会导致错误:
+ Set-ADUser <<<< -replace @{ExtensionAttribute1=&{$_.UserPrincipalName -replace "@ADdomain.com", "@GAdomain.com"}}
+ CategoryInfo : InvalidOperation: (CN=Bar\, Fo...ADdomain,DC=com:ADUser) [Set-ADUser], ADInvalidOperationException
+ FullyQualifiedErrorId : replace,Microsoft.ActiveDirectory.Management.Commands.SetADUser
使用字符串替换脚本块中的代码可以正常工作(如下所示),因此它似乎对当前管道对象有某种访问问题。 $_
在这种情况下不起作用吗?
Set-ADUser -replace @{extensionAttribute1=&{"foobar"}}
答案 0 :(得分:0)
简短的回答似乎是在你的管道中使用foreach:
Get-ADGroupMember "Group Name" |
Where {$_.objectClass -eq "user"} |
Get-ADUser -properties extensionAttribute1 |
Where {$_.extensionAttribute1 -ne ($_.UserPrincipalName -replace "@ADdomain.com", "@GAdomain.com")} |
foreach-objct {Set-ADUser $_ -replace @{extensionAttribute1=&{$_.UserPrincipalName -replace "@ADdomain.com", "@GAdomain.com"}}}
至于为什么,我很确定这是因为Set-ADUser只接受一个对象,无论是一个ADUser还是一个ADUser集合。由于$_
代表this
,因此您使用它的方式导致Set-ADUser将$_
视为您在管道中提供的一个对象 - 用户组(而不是每个用户)用户)。
注意:以下是推测!如果我错了请纠正我!
关于Set-ADUser采取一个或多个对象......这是我的猜测。如果您查看Set-ADUser的输入类型,则会提供None
或Microsoft.ActiveDirectory.Management.ADUser
的类型。但是正如您所看到的,您还可以传递ADUser
个对象的集合,Set-ADUser也会接受它。根据我对该cmdlet的理解,当您调用它时,您可以对该集合中的所有对象运行相同的Set命令。例如,你可以像你提到的那样做(假设$ users包含管道中的所有东西):
$users | Set-ADUser -replace @{extensionAttribute1=&{"foobar"}}
我的猜测是,在引擎盖下,Set-ADUser接受$ users作为单个参数值(通过在代码中设置ValueFromPipeline attribute到true
)并应用您提供给每个参数的参数其中的对象。由于集合的迭代发生在cmdlet的代码中(不再在PowerShell中,它是已编译的.Net代码),因此$_
在表示每个对象方面没有用处。
我不确定为什么管道允许你以伪foreach方式运行Get-ADUser的机制,因为它们具有相同的输入类型(你以类似的方式调用它而不使用foreach)但是基于证据,我必须假设它在引擎盖下。如果有人有进一步的见解,我肯定很想知道。我可能完全偏离基地!