Powershell虽然循环不能按预期工作

时间:2016-06-17 14:27:45

标签: powershell while-loop

所以这就是我试图做的事情:

我手动输入一个名称,然后我想得到一个用户名单,这些用户在我输入的名字下工作(extensionattribute9是用户在其下工作的人)。但是,对于在该人下工作的每个人,我也想为他们运行流程,并查看是否有人也在他们之下工作。我希望这个过程继续,直到没有人在当前用户下工作。

我已经管理过最多3次这样做没有一个循环,但由于我不知道我需要多深才能得到所有人,我觉得使用while循环会更好总的来说,特别是在代码长度方面。

以下是我目前的代码:

$users = Get-ADUser -Filter * -Properties extensionattribute9,Displayname,mail,title

$users | ForEach-Object {
 if ($_.extensionattribute9 -like '*Lynn, *')
 {
      $_ | select Displayname,userprincipalname,title,extensionattribute9
      $name = $_.Displayname

      while ($_.extensionattribute9 -ne $null){ $users | ForEach-Object {
          if ($_.extensionattribute9 -eq $name)
          {
          $_ | select Displayname,userprincipalname,title,extensionattribute9
          $name=$_.Displayname
          }
     }
   }        
 }
}

当我运行代码时,我会在' Lynn'下获得一个用户(用户A),然后在用户A下获得一个用户。之后,什么都没有。程序仍然继续运行,但没有返回任何内容。我猜测它陷入了无限循环,但我不知道将while循环放在哪里更好。救命?

2 个答案:

答案 0 :(得分:0)

我不熟悉Powershell,但是你遇到麻烦的一个可能原因是$_被用来表示两种不同的东西,这取决于你是否在while循环中使用它。 Powershell真的很聪明,知道你的意思吗?

更重要的是:代码

$_ | select Displayname,userprincipalname,title,extensionattribute9
  $name = $_.Displayname

出现在两个靠近的地方。这是一种明确的代码味道。它应该只出现一次。

当您遍历层次结构并且您不知道它将会有多深时,您必须使用递归算法(一个自我调用的函数)。这是伪代码:

function myFunc ($node) {
    //report the name of this node
    echo "node $node found." ;
    // check to see if this node has any child nodes
    array $children = getChildNodes ($node) ;
    if (count($children) == 0) {
        //no child nodes, get out of here
        return ;
    }
    //repeat the process for each child
    foreach($children as $child) {
        myFunc($child) ;
    }
}

答案 1 :(得分:0)

听起来你正在尝试使用嵌套的while / for-each循环进行递归搜索,这可能会导致严重错误。你可以尝试这样的事情:

Function Get-Manager {

    param([Object]$User)

    $ManagerName = $User.extensionattribute9

    # Recursion base case
    if ($ManagerName -eq $null){
        return
    }

    # Do what you want with the user here
    $User | select Displayname, userprincipalname, title, extensionattribute9

    # Recursive call to find manager's manager
    $Manager = Get-ADUser -Filter "Name -like $ManagerName"
    Get-Manager $Manager

}

# Loop through all ADusers as you did before
$Users = Get-ADUser -Filter * -Properties extensionattribute9,Displayname,mail,title

Foreach ($User in $Users) {
    Get-Manager $User
}

请注意,我没有使用Powershell和Active Directory的经验,因此语法可能不正确,但不应该很难修复。希望这有帮助!