不带正则表达式的Powershell条件筛选器



我正在尝试按名称筛选ADC计算机。

我们的命名约定如下<CuntryCode>-<Location>-<DeviceType And Number>我们在美国和墨西哥都有不同的位置,我们也有几种类型的设备

示例:
<Device Type>Servers = SDesktops = DLaptops = LTablet = TRouters = RSwitches = U

实际命名示例:

MX-BCN-D002或US-TAM-L001

我正在创建一个脚本,它将查看远程PC文件系统,并检查用户是否有本地文件系统。PST文件。我只想要类型为:台式机和笔记本电脑的设备,但似乎无法创建过滤所有其他设备类型的条件

部分脚本:

$Enabled_PC_list =@()
$Enabled_Online_PC_List =@()
# $Enabled_Offline_PC_list =@()
$data = @()
$PCs = Get-ADComputer -filter "Enabled -eq '$true'" -SearchBase "DC=some,DC=domain" -properties name | Select-Object -ExpandProperty name
$Enabled_PC_list += $PCs
foreach($device in $Enabled_PC_list){
Write-Output ">>> testing  Device: $device <<<"
if ($device -like "*-*-D*" -or  $device -like "*-*-L*" ) {
if(Test-Connection -TargetName $device -Count 1 -Quiet){
$Enabled_Online_PC_List += $device
}
}else{
Write-Output "Device  $device not valid "
}

}
} 

因此,通过这条线路if ($device -like "*-*-D*" -or $device.name -like "*-*-L*" ),我希望过滤掉所有与我想要的相匹配的设备,并在这些设备上进行测试连接。

我需要使用regex吗
如何在powershell中使用regex?有更好的方法吗?

您可以让Active Directory为您进行筛选,而不是从您这边进行筛选,从而更好地做到这一点。您可以通过字符串操作生成LDAP筛选器,为每种设备类型添加LDAP子句:

$filter = '(&(!userAccountControl:1.2.840.113556.1.4.803:=2)(|'
'S', 'D', 'L', 'T', 'R', 'U' | ForEach-Object {
$filter += '(name=*-*-{0}*)' -f $_
}
$filter += '))'
$onlinePCs = Get-ADComputer -LDAPFilter $filter -SearchBase "DC=some,DC=domain" | Where-Object {
Test-Connection -TargetName $_.DNSHostName -Count 1 -Quiet
}

生成的LDAP筛选器如下所示(带有一些格式(:

(&
(!userAccountControl:1.2.840.113556.1.4.803:=2)
(|
(name=*-*-S*)
(name=*-*-D*)
(name=*-*-L*)
(name=*-*-T*)
(name=*-*-R*)
(name=*-*-U*)
)
)

并且可以读取为,所有启用的对象(在这种情况下是计算机,因为我们使用的是Get-ADComputer(,其Name属性类似于*-*-S**-*-D**-*-L*,依此类推

阅读您的回复,我开始思考,如果LDAP可以进行过滤,powershsell能做到吗?所以我试了一下,它能自动识别

where子句起了作用Where-Object {$_.Name -like "*-*-D*" -or $_.Name -like "*-*-L*" -or $_.Name -like "*-*-T*"}

$Enabled_Online_PC_List =[System.Collections.ArrayList]@()
$Enabled_Offline_PC_list =[System.Collections.ArrayList]@()
# $data = @()
$searchBase = "OU=USA,DC=some,DC=domain"

$Enabled_PC_list = Get-ADComputer -filter "Enabled -eq '$true'" -SearchBase $searchBase -properties name | Where-Object {$_.Name -like "*-*-D*" -or  $_.Name -like "*-*-L*" -or $_.Name -like "*-*-T*"} | Select-Object -ExpandProperty name
foreach($device in $Enabled_PC_list){
# Write-Output "testing  now  $device"
if(Test-Connection -ComputerName $device -Count 1 -Quiet){
Write-Output " Now Adding  $device to  Enabled_Online_PC-List"
$Enabled_Online_PC_List.Add($device)
}else{
Write-Output " Now Adding  $device to  Enabled_Offline_PC_list"
$Enabled_Offline_PC_list.Add($device)
}
}
Write-Output $Enabled_Online_PC_List

所以剧本的工作时间被戏剧性地缩短了,现在我又问有更好的方法吗?出于某种原因,LDAP不想停留在我的脑海中

最新更新