如何使powershell通过用户列表,如果它们存在,则将它们移动到您提到的位置,如果不显示失败的用户名。
问题描述:
好吧,我有以下代码。它可以工作,但是对于每个用户来说都会失败前2个用户应该失败,但最后一个应该是成功的,但它应该只显示所有失败的尝试,然后将其放置在文本文件中。这是我迄今为止除了输出到文本文件外。如何使powershell通过用户列表,如果它们存在,则将它们移动到您提到的位置,如果不显示失败的用户名。
Import-Module ActiveDirectory
#$sam = read-host "Enter username"
#$user = Get-ADUser -filter {SamAccountName -eq $sam}
$user = @("user2","user3","olduser2")
foreach($sam in $user){
if(Get-Aduser $sam){
$Name = (Get-ADUser $sam -Properties cn).name
$path = "OU=Term,OU=test,DC=patel,DC=COM"
Get-ADUser $Name | Move-ADObject -TargetPath $path
}
if(!$sam){
Write-Host "$sam failed"
}
它会返回 用户2有一个错误信息失败 ,因为它不能被发现
用户3有一个错误信息失败 ,因为它不能被发现
olduser2失败 没有错误信息。
答
当ForEach
循环退出时,ForEach
中的迭代器变量($sam
)超出范围。此时,$sam -eq $null
为真(相当于!$sam
),因此您将收到失败消息。尝试
$user = @("user2","user3","olduser2")
foreach($sam in $user){
if(Get-Aduser $sam){
$Name = (Get-ADUser $sam -Properties cn).name
$path = "OU=Term,OU=test,DC=patel,DC=COM"
Get-ADUser $Name | Move-ADObject -TargetPath $path
} else {
Write-Host "$sam failed"
}
}
,看看是否给你你想要的结果 - 如果你能理解为什么它。您还可以在脚本中进行其他改进 - 但您应该先让它工作,然后考虑优化。
答
正如Jeff Zeitlin在评论中提到的答案。这将更好地在try
catch
循环中进行错误检查。
$user = @("user2","user3","olduser2")
foreach($sam in $user) {
try {
$path = "OU=Term,OU=test,DC=patel,DC=COM"
Get-ADUser $sam -ErrorAction Stop | Move-ADObject -TargetPath $path -ErrorAction Stop
}
catch {
Write-Host "$sam failed"
}
}
所以它仍然给我的错误,但它适用于olduser2但它不显示user2的失败用户3失败 –
它说无法找到身份对象“用户2”我怎么就只显示用户2失败等对他们全部 –
请粘贴您收到的错误消息的_exact_和_entire_文本。通常,错误消息会告诉您哪个命令失败。 –