Powershell正则表达式可在首次出现字符串后匹配所有内容

时间:2018-09-12 14:08:38

标签: regex 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 =测试,OU =测试,OU =测试,OU =测试,OU =测试,DC =测试,DC =测试

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

  

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

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

因此,我需要一个Regex来保留第一个 OU = 之后的所有内容,并保留此 OU = 而不删除它。

谢谢

2 个答案:

答案 0 :(得分:1)

您真的在问解析专有名称,由于某些字符需要转义,因此专有名称并不是真正的简单字符串。

您的问题确实是,“如何删除叶子并仅获得专有名称的父部分?”

为此,您可以使用Windows提供的IADsPathname界面。该接口通过Pathname COM对象提供给脚本。

前一段时间,我写了一个PowerShell module,它为Pathname对象提供了一个cmdlet接口,使调用变得容易。就您而言,您可以使用Get-ADName cmdlet并只需编写:

Get-ADName "CN=Test,OU=Test,OU=Test,OU=Test,OU=Test,DC=Test,DC=Test" -Format Parent

此命令产生以下输出:

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

作为方案中的计算属性,您可以简单地添加以下内容:

@{Label = "OU"; Expression = {Get-ADName $_.DistinguishedName -Format Parent}}

Get-ADName脚本cmdlet非常方便,并且在可分辨名称的字符串解析中节省了大量工作。

(顺便说一句,该模块还具有Convert-ADName脚本cmdlet,该cmdlet实现了NameTranslate COM对象,可用于在不同格式之间转换对象名称。)

我发现Get-ADNameConvert-ADName脚本cmdlet在各种情况下几乎都是必不可少的。

答案 1 :(得分:0)

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

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

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

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

之所以要包含以下内容,是因为RDN包含逗号的DN否则会被分割(想象为CN=Doe\, John,OU=SomeOrgUnit,DC=domain,DC=tld