您在这里遇到了一些问题
- 就像 Vesper 说你没有传递任何东西,
Move-ADObject
因此你得到的错误
$DisplayNames
不是名称的字符串数组,而是具有 displayname 属性的对象。这就是FYI-ExpandProperty
的参数。Select-Object
- 您正在拉动所有用户,但只想处理某些用户。而不是
-Filter *
让我们使用更有针对性的方法。
- 虽然它很诱人,但您不能嵌套
-like
这样的条件。如果您"*Supply*" -or "*Supplies*"
输入并输入它,它将评估为真。与所有非零长度字符串相同。
对于我们计划做的事情,我们不必解决所有这些问题。我们应该使用管道来帮助解决这个问题。根据有多少差异,您有类似 switch 语句的东西可能会更好,这将在下面介绍。
$supplyFilter = 'DisplayName -like "*Supply*" -or DisplayName -like "*Supplies*"'
$accountFilter = 'DisplayName -like "*Accounting*" -or DisplayName -like "*Accountant*"'
Get-ADUser -SearchBase $OU -Filter $supplyFilter -Properties displayName | Move-ADObject -TargetPath $Test1OU
Get-ADUser -SearchBase $OU -Filter $accountFilter -Properties displayName | Move-ADObject -TargetPath $Test2OU
您可能会对此感到奇怪,并使用过滤器和目标对在循环中创建一个自定义对象,这样您就不需要对每个Get-ADuser
实例重复 cmdlet 调用。
$moves = @(
@{
Filter = 'DisplayName -like "*Supply*" -or DisplayName -like "*Supplies*"'
OU = "OU=Test1, OU=Test, OU=Com"
},
@{
Filter = 'DisplayName -like "*Accounting*" -or DisplayName -like "*Accountant*"'
OU = "OU=Test2, OU=Test, OU=Com"
}
) | ForEach-Object{New-Object -TypeName PSCustomObject -Property $_}
ForEach($move in $moves){
Get-ADUser -SearchBase $OU -Filter $move.Filter -Properties displayName | Move-ADObject -TargetPath $move.OU
}
您应该能够通过添加新的$moves
. 使用 PowerShell v3.0 会更干净,但我不知道你有什么版本。
使用开关
如果你想要更接近你目前拥有的东西,我会建议这样的东西。
$Users = Get-ADUser -SearchBase $OU -Filter * -Properties DisplayName
ForEach ($user in $users){
switch($user.DisplayName) {
($_ -like "*Supply*" -or $_ -like "*Supplies*"){Move-ADObject -Identity $user -TargetPath $Test1OU}
($_ -like "*Accounting*" -or $_ -like "*Accountant*"){Move-ADObject -Identity $user -TargetPath $Test1OU}
}
}