-1

好的,所以我有以下代码。它可以工作,但每个用户都返回失败。前 2 个用户应该失败,但最后一个用户应该是成功的,但它应该只显示所有失败的尝试,然后将其放在文本文件中。除了输出到文本文件之外,这就是我目前所拥有的。

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"
}

它将返回 user2 failed 并显示一条错误消息,因为找不到它

user3 因找不到错误消息而失败

olduser2 失败,没有错误消息。

4

2 回答 2

1

循环退出时,迭代器变量 ( $sam)ForEach超出范围。ForEach此时,$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"
    }
}

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

于 2017-03-15T18:22:39.863 回答
1

正如 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"
    }
}
于 2017-03-15T19:36:27.337 回答