ここでいくつかの問題が発生しています
- Vesperが言ったように、何も渡していない
Move-ADObject
ため、エラーが発生しています
$DisplayNames
名前の文字列配列ではなく、displayname プロパティを持つオブジェクトです。それがFYI-ExpandProperty
のパラメータです。Select-Object
- すべてのユーザーをプルしていますが、実際には特定のユーザーのみを処理したいと考えています。代わりに
-Filter *
、より的を絞ったアプローチを使用しましょう。
- 魅力的ですが、そのような条件をネストすることはできません
-like
。それを取得"*Supply*" -or "*Supplies*"
して入力すると、true と評価されます。長さがゼロでないすべての文字列と同じです。
私たちが計画していることのために、これらすべての問題に対処する必要はありません。これを支援するには、パイプラインを使用する必要があります。分散の数によっては、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
これに夢中になり、フィルターとターゲットのペアを使用してループ内にカスタム オブジェクトを作成し、各インスタンスに対してコマンドレット呼び出しを繰り返す必要がないようにすることができます。
$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
}
new を追加することで、これに簡単にスケールできるはずです$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}
}
}