Powershell - 将特定单词保留在字符串中

时间:2013-07-09 18:33:49

标签: powershell powershell-v2.0

我正在进行AD提取,我对字段“distinguishedname”进行排序,我只想保留代表用户本身“父OU”的值的特定部分。

我正在运行此命令来执行所有用户的添加提取:

import-module activedirectory
get-aduser -filter * -properties *| Select-Object -Property SamAccountName,CN,co,ExtensionAttribute10,extensionAttribute11,extensionAttribute12,EmailAddress,whenCreated,Enabled,LastLogonDate,accountexpirationdate,distinguishedname  |Sort-Object -Property Name | Export-Csv -Delimiter ";" -path "u:\theOutFile_NOFILTER_July.txt"

"distinguishedname"如下所示:

distinguishedname
CN=familly\, user,OU=Remote Users,OU=New York,OU=My,DC=Company,DC=Local
CN=nameless\, cat,OU=Remote Users,OU=Ottawa,OU=My,DC=Company,DC=Local
CN=Cameron\, James,OU=Regular Users,OU=Hollywood,OU=My,DC=Company,DC=Local
CN=Bon\, Jean,OU=regular Users,OU=Springfield,OU=My,DC=Company,DC=Local

注意7月10日 有一段时间我会点击那条线:

CN=Dog\, Cesar,OU=Special Accounts,OU=Regular Users,OU=Alma,OU=My,DC=Company,DC=Local
CN=keys\, Alicia,OU=Special Accounts,OU=Regular Users,OU=Paris,OU=My,DC=Company,DC=Local
CN=Clansy\, Door,OU=Map Drives,OU=Remote Users,OU=Rome,OU=My,DC=Company,DC=Local

在这种情况下,我得到的结果是Remote UsersRegular Users而不是城市。我已经尝试过你的命令中的一些修改但是徒劳无功。

但我希望第一个命令返回此结果:

distinguishedname
New York
Ottawa
Hollywood
Springfield

我无法找到方法。

提前致谢

1 个答案:

答案 0 :(得分:2)

Select-Object具有非常通用的功能,可以使用散列代替属性名称来创建计算属性,其中键“Name”设置为计算属性的名称(实际上是列标题),以及“表达式”设置为一个代码块,用于确定管道中每个对象的属性值。这将做你想要的:

Get-Aduser -Filter * -Properties * | Select-Object -Property SamAccountName,CN,co,ExtensionAttribute10,extensionAttribute11,extensionAttribute12,EmailAddress,whenCreated,Enabled,LastLogonDate,accountexpirationdate,@{Name='distinguishedname'; Expression={[regex]::match($_.distinguishedname,'OU=.+?OU=(.+?),(OU|DC)=').Groups[1].Value}} | Sort-Object -Property Name | Export-Csv -Delimiter ";" -Path "u:\theOutFile_NOFILTER_July.txt"

以下是故障情况:

  • Name='distinguishedname'告诉它创建一个名为“distinguishedname”的新列。我使用该名称来匹配您正在查找的输出示例,但它不必是现有属性的名称。将名称更改为更能描述您正在计算的值的内容可能更有意义,例如: Name="parentOU"
  • [regex]::match用于使用正则表达式OU=.+?OU=(.+?),(OU|DC)= $ _。distinguishedname 中提取所需部分,使用正则表达式隔离列表中第二个OU的名称匹配组。
  • .Groups[1].Value返回第一个匹配组的值(与第一组括号的内容匹配的部分)。如果没有 .Groups [1] .Value 将返回整个匹配的字符串,从第一个 OU = 返回到 = 以下是父OU的名称。以下也可以使用零宽度断言而不是匹配组:[regex]::match($_.distinguishedname,'(?<=OU=.+?OU=).+?(?=,(OU|DC)=)').Value
相关问题