PowerShell非正则条件筛选AD计算机:仅保留台式机与笔记本
问题解答
1. 现有-like筛选逻辑的合理性
你的-like写法基本能满足需求:按照命名规则<CountryCode>-<Location>-<DeviceType And Number>,D/L作为设备类型标识会放在第三段开头,*-*-D*和*-*-L*能准确匹配台式机和笔记本。
但存在微小漏洞:如果某台设备第三段中间意外出现D/L(比如CN-BJ-XD123),会被误匹配。如果你们的命名规则严格执行,这种情况不会发生,当前写法完全够用。
2. 是否需要正则?PowerShell中如何使用?
如果需要绝对严谨的匹配(避免上述漏洞),可以用正则。PowerShell通过-match运算符实现正则匹配:
- 针对你的命名规则,推荐正则表达式:
^[A-Za-z]+-[A-Za-z]+-[DL]\d*$^:匹配字符串开头[A-Za-z]+:匹配1个以上字母(对应国家/地区编码、地点编码)-:匹配分隔符[DL]:严格匹配D或L作为类型标识的第一个字符\d*:匹配0个或多个数字(对应设备编号)$:匹配字符串结尾
- 使用示例:
if ($device -match '^[A-Za-z]+-[A-Za-z]+-[DL]\d*$') { # 符合规则的设备逻辑 }
3. 更优实现方案
方案一:提前在AD查询阶段筛选
不要先拉取所有启用设备再筛选,直接在Get-ADComputer的过滤条件中匹配设备名,减少数据传输和后续处理量:
$PCs = Get-ADComputer -Filter { Enabled -eq $true -and (Name -like "*-*-D*" -or Name -like "*-*-L*") } -SearchBase "DC=some,DC=domain" | Select-Object -ExpandProperty Name
方案二:避免数组累加(提升性能)
PowerShell中数组是不可变类型,+=会频繁创建新数组,设备数量多时性能极差。改用管道收集结果:
$Enabled_Online_PC_List = foreach ($device in $PCs) { Write-Host ">>> testing Device: $device <<<" if ($device -match '^[A-Za-z]+-[A-Za-z]+-[DL]\d*$') { if (Test-Connection -TargetName $device -Count 1 -Quiet -ErrorAction SilentlyContinue) { $device # 直接输出符合条件的设备,自动存入数组 } } else { Write-Host "Device $device not valid" } }
方案三:并行测试设备在线状态(适合大量设备)
如果设备数量多,串行执行Test-Connection速度慢,可使用Start-ThreadJob(轻量线程作业)并行检测:
# 先确保PSThreadJob模块已安装 # Install-Module -Name PSThreadJob -Scope CurrentUser $jobs = foreach ($device in $PCs) { Start-ThreadJob -ScriptBlock { param($device) if ($device -match '^[A-Za-z]+-[A-Za-z]+-[DL]\d*$' -and Test-Connection -TargetName $device -Count 1 -Quiet) { $device } } -ArgumentList $device } $Enabled_Online_PC_List = $jobs | Receive-Job -Wait -AutoRemoveJob
完整优化脚本示例
# 1. 从AD获取符合规则的启用设备 $PCs = Get-ADComputer -Filter { Enabled -eq $true -and (Name -like "*-*-D*" -or Name -like "*-*-L*") } -SearchBase "DC=some,DC=domain" | Select-Object -ExpandProperty Name # 2. 筛选在线设备 $Enabled_Online_PC_List = foreach ($device in $PCs) { Write-Host ">>> testing Device: $device <<<" if ($device -match '^[A-Za-z]+-[A-Za-z]+-[DL]\d*$') { if (Test-Connection -TargetName $device -Count 1 -Quiet -ErrorAction SilentlyContinue) { $device } } else { Write-Host "Device $device not valid" } } # 输出结果 Write-Host "`nOnline valid devices:" $Enabled_Online_PC_List
内容的提问来源于stack exchange,提问作者victorR
相关产品推荐
相关产品推荐

