Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex PowerShell不是组的成员_Regex_Powershell_Filter - Fatal编程技术网

Regex PowerShell不是组的成员

Regex PowerShell不是组的成员,regex,powershell,filter,Regex,Powershell,Filter,我在看,它对我不起作用。比赛结果总是正确的。因此,我将在组列表中使用一些简单的东西,比如域计算机,-notmatch应该过滤掉属于域计算机组的任何内容,它仍然返回属于域计算机的计算机。我所需要的只是一个脚本,它可以获取计算机并对照组列表检查它们的成员资格,如果它们不是组列表的一部分,则返回它们 $groups = @("Terminal Server License Servers","Exchange Trusted Subsystem","Cert Publishers","Domain C

我在看,它对我不起作用。比赛结果总是正确的。因此,我将在组列表中使用一些简单的东西,比如域计算机,
-notmatch
应该过滤掉属于域计算机组的任何内容,它仍然返回属于域计算机的计算机。我所需要的只是一个脚本,它可以获取计算机并对照组列表检查它们的成员资格,如果它们不是组列表的一部分,则返回它们

$groups = @("Terminal Server License Servers","Exchange Trusted Subsystem","Cert Publishers","Domain Computers")
$regex = '^({0})' -f ($groups -join '|')
get-adcomputer -Filter {OperatingSystem -like "Windows Server 200*"} -properties * | Where-Object{($_.MemberOf | Get-ADGroup).Name -notmatch $regex} | Select-Object Name | fl
你想要

Where-Object {-not (($_.MemberOf | Get-ADGroup).Name -match $regex) }
因为
Y-notmatch X
并不意味着“没有与X匹配的Y”,它意味着“至少有一个Y与X不匹配”(正如
Y-match X
并不意味着“所有Y都与X匹配”,而是“至少有一个Y与X匹配”)

您想要的是
Y-match X
,它是
-而不是(Y-match X)

试一试

查看
-match
-notmatch
实际执行的操作


通过聊天,OP和我找到了更好的问题解决方案,为了方便起见,在此处重复:

我们在这里比较两个列表,即 ADComputer和您的参考列表,您希望消除所有 其中至少有一个匹配项,并显示其余项

因此,对于每个计算机对象,对于它所属的每个组, 如果该组出现在您的参考列表中,请过滤掉计算机

PowerShell代码:

$referenceListOfGroups =
    "CN=group_1....",
    "CN=group_2....",
    "CN=group_N...."

Get-ADComputer -LDAPFilter "OperatingSystem=Windows Server 200*" -Properties MemberOf | Where-Object {
    ($_.MemberOf | Where-Object { $_ -in $referenceListOfGroups }).Count -eq 0
}
你想要

Where-Object {-not (($_.MemberOf | Get-ADGroup).Name -match $regex) }
因为
Y-notmatch X
并不意味着“没有与X匹配的Y”,它意味着“至少有一个Y与X不匹配”(正如
Y-match X
并不意味着“所有Y都与X匹配”,而是“至少有一个Y与X匹配”)

您想要的是
Y-match X
,它是
-而不是(Y-match X)

试一试

查看
-match
-notmatch
实际执行的操作


通过聊天,OP和我找到了更好的问题解决方案,为了方便起见,在此处重复:

我们在这里比较两个列表,即 ADComputer和您的参考列表,您希望消除所有 其中至少有一个匹配项,并显示其余项

因此,对于每个计算机对象,对于它所属的每个组, 如果该组出现在您的参考列表中,请过滤掉计算机

PowerShell代码:

$referenceListOfGroups =
    "CN=group_1....",
    "CN=group_2....",
    "CN=group_N...."

Get-ADComputer -LDAPFilter "OperatingSystem=Windows Server 200*" -Properties MemberOf | Where-Object {
    ($_.MemberOf | Where-Object { $_ -in $referenceListOfGroups }).Count -eq 0
}

您能否向我们展示您所附代码的实现,以便我们更好地了解您正试图做什么?请发布您实际运行的代码,而不是指向其他问题的链接。请编辑您的问题以提供此代码。不要将其作为注释发布。这与链接问题中的答案完全相同(除非您删除了一些属性)。您没有更改任何内容以使其适用于您?您能否向我们展示所附代码的实现,以便我们更好地了解您正试图执行的操作?请发布您实际运行的代码,而不是指向其他问题的链接。请编辑您的问题以提供此代码。不要将其作为注释发布。这与链接问题中的答案完全相同(除非您删除了一些属性)。你没有做任何改变来让它为你工作?谢谢。即使有了这些变化,它仍然不起作用。我认为这是因为在组名中有parenths,这是在摆脱匹配。有没有办法让它忽略字符串中的那个
$groups=@(“server-(number)Extra text”)
新版本-我让它忽略字符串中的正则表达式字符,但现在当我引入多个要检查的组时,它不起作用
$groups=[regex]::escape(@(“server-(1)Extra text”,“server-(2)Extra text”))
我建议您使用实际组名数组和
-in
运算符:
-not(($.MemberOf | Get ADGroup).Name-in$groups)代替regex
谢谢。我试过了。还是不行。当你说实际的群组名称时,我假设你指的是群组名称,而不是完整的CN名称,对吗?让我们来看看。谢谢。即使有了这些变化,它仍然不起作用。我认为这是因为在组名中有parenths,这是在摆脱匹配。有没有办法让它忽略字符串中的那个
$groups=@(“server-(number)Extra text”)
新版本-我让它忽略字符串中的正则表达式字符,但现在当我引入多个要检查的组时,它不起作用
$groups=[regex]::escape(@(“server-(1)Extra text”,“server-(2)Extra text”))
我建议您使用实际组名数组和
-in
运算符:
-not(($.MemberOf | Get ADGroup).Name-in$groups)代替regex
谢谢。我试过了。还是不行。当你说实际的群组名称时,我假设你指的是群组名称,而不是完整的CN名称,对吗?让我们来看看。