匹配条件时,在PowerShell中返回外部循环

时间:2014-08-20 18:51:30

标签: windows powershell

我正在编写一个简单的PowerShell脚本来获取Active Directory(AD)中特定OU中的所有用户以及目录中的所有文件夹,然后将每个用户名与每个foldername进行比较以验证用户是那里有一个文件夹,并做点什么。

下面显示的脚本工作正常,但是当它匹配字符串时,我希望它断开并返回外部For-EachObject,切换用户名。 (没有必要验证列表的其余部分,如果它已经找到了一个),但是中断打破整个脚本,它就结束了。

$PerfilFolder = Get-ChildItem $FileServerPath | Sort
Get-ADUser -SearchBase $SB -Filter * | Sort SamAccountName | % {
    $UserName = $_.SamAccountName
    $PerfilFolder | % {
        if($UserName -match (($_.Name).Split(".")[0])){
            #Match!
            #Do something
            break
        }
    }
}

我已经尝试了returncontinue,但所有这些都有相同的行为。我该怎么办?

欢迎提供一般改进提示:)

3 个答案:

答案 0 :(得分:0)

检查smeltplate对this question的回答。看来你的休息完全退出了foreach循环,但不是管道。

答案 1 :(得分:0)

我通常通过设置两组对象来避免这种情况,然后在另一组对象的属性上对其进行过滤。

$PerfilFolder = Get-ChildItem $FileServerPath | Sort
foreach ($user in Get-ADUser -SearchBase $SB -Filter * | Sort SamAccountName){
   $matchingFolder = $PerfilFolder | ? {$user.SamAccountName -match (($_.Name).Split(".")[0])
   if (($matchingFolder | Measure-Object).Count -gt 0){
       #do something to $matchingFolder | Select -First 1
   }
   else {
       # Do something else
   }
}

答案 2 :(得分:0)

使用Do{} While()循环:

$PerfilFolder = Get-ChildItem $FileServerPath | Sort
Get-ADUser -SearchBase $SB -Filter * | Sort SamAccountName | % {
    $UserName = $_.SamAccountName
    $NoMatch = $true
    Do{$PerfilFolder | % {
        if ($UserName -match (($_.Name).Split(".")[0])){
            #Match!
            #Do something
            $NoMatch = $false
        }
    } While($NoMatch)
}

我很确定你的循环会在你想要的地方结束。这回答了这个问题,但如果那是你真正想做的事情,它确实无法解决你的问题。我认为包含Where声明可以更好地为您服务:

    Do{$PerfilFolder | Where{$UserName -match (($_.Name).Split(".")[0])} |
        %{
            #Match!
            #Do something
            $NoMatch = $false
        }
    } While($NoMatch)

这可能会使Do{} While()变得不必要。