所以这就是我试图做的事情:
我手动输入一个名称,然后我想得到一个用户名单,这些用户在我输入的名字下工作(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循环放在哪里更好。救命?
答案 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的经验,因此语法可能不正确,但不应该很难修复。希望这有帮助!