Powershell传递对象作为.replace的一部分

时间:2014-09-15 21:30:33

标签: powershell replace directoryservices

我正在编写一个脚本来返回所有用户及其拥有邮箱的OU。我唯一的问题是distinguishedname返回

CN =用户,OU = ...

我只想要OU = ...

这是我的最后一行格式不正确

$($objItem.distinguishedname.replace('CN=$($objItem.name),',''))"

在最后一行的这一段中,我想替换我找到的短语CN =从对象返回的空白数据。

所以如果$(objItem.name)包含Bob

我希望这能执行以下替换

$objItem.distinguishedname.replace('CN=Bob,','')

我该如何格式化?我也试过以下

$($objItem.distinguishedname[0].replace('CN=$($objItem.name),',''))

不会返回错误但不替换任何内容。如果我将其更改为

$($objItem.distinguishedname[0].replace('CN=',''))

它会删除前面的所有CN =。我感觉很亲密。

以下是完整的脚本。

$strFilter = "(&(&(&(objectCategory=Person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)(HomeMDB=*)))))"

$objDomain = New-Object System.DirectoryServices.DirectoryEntry

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$objSearcher.SearchScope = "Subtree"

$colProplist = "name","distinguishedname", "samaccountname"

foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}

$colResults = $objSearcher.FindAll()

foreach ($objResult in $colResults)
{
    $objItem = $objResult.Properties; 
    write-Host "$($objItem.samaccountname) $($objItem.name)$($objItem.distinguishedname.replace('CN=$($objItem.name),',''))"
}

3 个答案:

答案 0 :(得分:2)

PowerShell不会在单引号内扩展变量:

'CN=$($objItem.name),'

也许你想要这个:

"... $($objItem.distinguishedname[0].replace(`"CN=$($objItem.name),`",''))"

以下是一个例子:

$objItem = [pscustomobject]@{DistinguishedName='CN=Bob,OU=blah','';Name='Bob'}
"Blah ... $($objItem.distinguishedname[0].replace(`"CN=$($objItem.name),`",''))"

输出:

Blah ... OU=blah

答案 1 :(得分:1)

你可以试试这个:

$($objItem.distinguishedname[0] -creplace 'CN=[^,]+,')

这适合你吗?

....
...
$objItem = $objResult.Properties;
$del = 'CN={0},' -f $($objItem.name)
.......$($objItem.distinguishedname[0] -creplace "$del")

答案 2 :(得分:1)

而不是取代我会提供斯普利特作为替代。这将在逗号上拆分并返回一个2项数组,第一项是CN = Name,第二项是OU = Path。然后我选择并跳过第一个,只返回字符串的OU =部分。

$objItem.distinguishedname -split ",",2|select -skip 1

然后你可以使用它:

Write-Host ("{0} {1}{2}" -f $objItem.samaccountname, $objItem.name, ($objItem.distinguishedname -split ",",2|select -skip 1))

这将在您的SAMAccountName示例中提供类似的输出,后跟一个空格,后跟其名称,紧接其后将是其DistinguishedName,其CN = Name部分已删除。