今天早上,一些很棒的人帮我创建了一个脚本,可以根据用户帐户的displayName将用户帐户移动到某个OU。我测试过,它有效。我蚕食脚本以制作另一个将根据相同标准重命名相同帐户的脚本。我经历过几次错误,但基本上归结为"我遇到了身份危机!"。我似乎无法确切地知道我需要输入$Identity
。这就是我所拥有的:
Import-Module ActiveDirectory
$Renames = @(
@{
Filter = 'DisplayName -like "*Supply*"'
NewName = "Supplies"
},
@{
Filter = 'DisplayName -like "*Accountant*"'
NewName = "Accounting"
}
) | ForEach-Object {New-Object -TypeName PSCustomObject -Property $_}
$OriginOU = "OU=Test,OU=Standard Users,OU=Domain Users,DC=com"
foreach ($Rename in $Renames) {
Get-ADUser -SearchBase $OriginOU -Filter $Rename.Filter -Properties displayName |
Where-Object {($_.Enabled -eq 'True') -and ($_.DistinguishedName -notlike '*DontTouch*')} |
%{Set-ADUser $_ -DisplayName {$_.DisplayName -replace '(.EPSILON ).+',"`$1$Rename.NewName"}}
}
答案 0 :(得分:2)
如果直接从管道中读取$_
,则无法使用当前对象变量(Set-ADUser
)。由于Set-ADUser
显然不适合使用scriptblock参数,因此必须将语句置于循环中:
... | % { Set-ADUser $_ -DisplayName ($_.DisplayName -replace '(.EPSILON ).+',"`$1$($Rename.NewName)") }
请注意,如果要在字符串中展开对象属性,则必须将$Rename.NewName
放在子表达式($()
)中,否则整个对象$Rename
将被字符串化并且字符串" .NewName"将附加到它。