如何使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" 
    } 
} 

,看看是否给你你想要的结果 - 如果你能理解为什么它。您还可以在脚本中进行其他改进 - 但您应该先让它工作,然后考虑优化。

+0

所以它仍然给我的错误,但它适用于olduser2但它不显示user2的失败用户3失败 –

+0

它说无法找到身份对象“用户2”我怎么就只显示用户2失败等对他们全部 –

+1

请粘贴您收到的错误消息的_exact_和_entire_文本。通常,错误消息会告诉您哪个命令失败。 –

正如Jeff Zeitlin在评论中提到的答案。这将更好地在trycatch循环中进行错误检查。

$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" 
    } 
} 
+0

是的。这是一个更好的结构。但我倾向于教钓鱼,而不是分发鱼。 :) –

+0

谢谢@JeffZeitlin –

+0

@ShivPatel如果一个答案适合你,最好的做法是接受它。 – BenH