我正在编写一个简单的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
}
}
}
我已经尝试了return
和continue
,但所有这些都有相同的行为。我该怎么办?
欢迎提供一般改进提示:)
答案 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()
变得不必要。