You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:10:33