如何修改PowerShell OU脚本,实现子OU存在性检查并独立创建?
问题需求
原PowerShell脚本可基于CSV文件在MyLab OU下创建指定OU,同时为每个新建OU生成Department1、Department2两个子OU,且能检查CSV中的OU是否存在并输出提示。
需修改实现:对子OU单独做存在性校验——若其中一个子OU已存在,另一个仍可正常创建,不会因单个子OU存在而跳过全部子OU的创建流程。
修改后的脚本
# 导入CSV文件 $MyOUs = Import-Csv C:\OUs.csv -Delimiter "," # 设定父OU的基础路径 $ParentPath = "OU=MyLab,DC=MyLab,DC=local" # 遍历CSV中的每个OU条目 foreach ($OU in $MyOUs) { $ouName = $OU.Name # 精准检查当前OU是否在MyLab下已存在(优化查询效率) $targetParentOU = Get-ADOrganizationalUnit -Filter "Name -eq '$ouName'" -SearchBase $ParentPath -SearchScope OneLevel -ErrorAction SilentlyContinue if ($targetParentOU) { Write-Host "提示:$ouName OU 已存在" # 父OU存在时,检查并补全缺失的子OU $subOUParentPath = "OU=$ouName,$ParentPath" $subOUList = "Department1", "Department2" foreach ($subOU in $subOUList) { # 检查当前子OU是否已存在 $existingSubOU = Get-ADOrganizationalUnit -Filter "Name -eq '$subOU'" -SearchBase $subOUParentPath -SearchScope OneLevel -ErrorAction SilentlyContinue if ($existingSubOU) { Write-Host "提示:子OU $subOU 在 $ouName 下已存在" } else { New-ADOrganizationalUnit -Name $subOU -Path $subOUParentPath -ProtectedFromAccidentalDeletion $false Write-Host "已创建:子OU $subOU 在 $ouName 下" } } } else { # 创建父OU New-ADOrganizationalUnit -Name $ouName -Path $ParentPath -ProtectedFromAccidentalDeletion $false Write-Host "已创建:OU $ouName" # 检查并创建子OU $subOUParentPath = "OU=$ouName,$ParentPath" $subOUList = "Department1", "Department2" foreach ($subOU in $subOUList) { $existingSubOU = Get-ADOrganizationalUnit -Filter "Name -eq '$subOU'" -SearchBase $subOUParentPath -SearchScope OneLevel -ErrorAction SilentlyContinue if ($existingSubOU) { Write-Host "提示:子OU $subOU 在 $ouName 下已存在" } else { New-ADOrganizationalUnit -Name $subOU -Path $subOUParentPath -ProtectedFromAccidentalDeletion $false Write-Host "已创建:子OU $subOU 在 $ouName 下" } } } }
关键修改说明
- 优化父OU查询效率:原脚本遍历所有OU做匹配,改为通过
-SearchBase限定查询范围、-SearchScope OneLevel仅查直接子节点,配合Filter精准定位,同时用-ErrorAction SilentlyContinue避免OU不存在时抛出错误。 - 子OU独立校验逻辑:将子OU的处理逻辑从“仅父OU新建时执行”调整为“无论父OU是否存在都执行”,且对每个子OU单独做存在性判断:
- 先查询目标子OU是否在对应父OU下存在
- 存在则输出提示,不存在则执行创建操作
- 统一逻辑避免重复:父OU存在/不存在两种场景下,子OU的检查和创建逻辑完全一致,保证代码可维护性。
内容的提问来源于stack exchange,提问作者learningnewstuff
相关产品推荐
相关产品推荐

