首页 > 解决方案 > Powershell正则表达式匹配第一次出现字符串后的所有内容

问题描述

所以我在 Powershell 中有一个脚本,该脚本从 AD 下载用户列表,然后将其导出到 CSV 文件。代码如下:

$AllADUsers | Select-Object @{Label = "First Name";Expression = {$_.GivenName}},
@{Label = "Last Name";Expression = {$_.Surname}},
@{Label = "Password Last Set";Expression = {"Password last set: "+$_.passwordlastset}},
@{Label = "Expiration date";Expression = {"Expires on: "+[datetime]::fromfiletime($_.accountexpires[0])}}, 
@{Label = "OU";Expression = {$_.DistinguishedName}} |
 Export-Csv -Path $csvfile -Encoding "UTF8"  -NoTypeInformation

我需要在DistinguishedName中执行以下操作:

CN=Test,OU=Test,OU=Test,OU=Test,OU=Test,DC=Test,DC=Test

删除从 CN 到第一个逗号的所有内容并仅保留

OU=测试,OU=测试,OU=测试,OU=测试,DC=测试,DC=测试

我试过使用正则表达式,但我不知道如何只匹配第一次出现的,OU=并保留它之后的所有内容。我已经设法做到了,但它一直在删除 OU,因此我需要在所有 DistinguishedNames 前面添加一个“OU =”字符串,但这不能在没有循环的情况下完成,而且我无法创建Select-Object内的循环 我还尝试从 Select-Object 之前的 DistinguishedName 中删除所有文本,但随后我将无法使用 Select-Object 内的索引为当前用户提供正确的 DistinguishedName。

所以我需要一个正则表达式来保留第一个OU=之后的所有内容并保留这个OU=而不会删除它。

谢谢

标签: regexpowershell

解决方案


你可以用一个简单的正则表达式来做到这一点:

@($_.DistinguishedName -split '(?<!\\),',2)[1]

正则表达式模式可以分解为:

(?<!   # negative lookbehind group
  \\   # for a literal backslash \
)      # end group
,      # literal comma ,

包含lookbehind的原因是RDN包含逗号的DN将被拆分(想象CN=Doe\, John,OU=SomeOrgUnit,DC=domain,DC=tld


推荐阅读