PowerShell:将用户定义的专有名称拆分为单独的部分

PowerShell: Split user defined distinguished name into individual parts

我有一个 GUI,可以接受来自用户的一些 DN。我知道如何获取文本,但我终生无法弄清楚如何将此 DN 拆分成各个部分。零件数量可能会有所不同。例如:

$string1 = "ou=this,ou=is,dc=a,dc=string"
$string2 = "ou=this,ou=is,ou=another,dc=dn,dc=string

我想做的是将 ou 与 dc 分开,如果 ou 不存在则创建它们。我只是想不出如何将 ou 与 dc 分开并将它们变成单独的字符串所以我将剩下:

$newString1 = "ou=this,ou=is"
$newString2 = "dc=a,dc=string"
$newString3 = "this,ou=is,ou=another"
$newString4 = "dc=dn,dc=string

我知道我可以使用 $string1.Split(",") 拆分字符串,但此时我不知道如何将各个值存储在新变量中。我是 PowerShell 的新手,因此非常感谢任何建议。

我知道我可以仅根据我拥有的信息创建 ou,但我需要将它们分开以用于将在代码中完成的其他工作。也很高兴看到它们分开,这样我就可以单独抓住你的。

尝试将它们拆分成一个数组,如下所示:

c:\>$string = "ou=this,ou=is,ou=another,dc=dn,dc=string"
c:\>$array = $string.split(",")
c:\>$array
ou=this
ou=is
ou=another
dc=dn
dc=string
c:\>

使用数组可以确定元素的数量:

c:\>$array.Length
5
c:\>

或者循环处理:

c:\> foreach ($i in $array) { $i }
ou=this
ou=is
ou=another
dc=dn
dc=string
c:\>

显然,该循环与仅输出 $array 变量没有什么不同,但应该提供对如何使用循环的深入了解。

希望对您有所帮助。

希望这对所问的内容有所帮助。这假设您想要将相对可分辨名称存储在两组中:那些在您点击 dc= 之前的那些和那些在您点击 dc=.

之后(包括在内)的
$string1 = "ou=this,ou=is,dc=a,dc=string"
$string2 = "ou=this,ou=is,ou=another,dc=dn,dc=string"

foreach ($dn in $string1, $string2)
{
    # Break the distinguished name up into a list of relative distinguished names
    $rdnList = $dn -split ',';
    $cnList = @();
    $nextIndex = 0;

    while ($nextIndex -lt $rdnList.Length)
    {
        $rdn = $rdnList[$nextIndex];
        $name, $value = $rdn -split '=';

        # Stop looping if we've hit a dc= RDN
        if ($name -eq 'dc')
        {
            break;
        }

        $cnList += $rdn;
        $nextIndex++;
    }
    # The remainder of the array is our RDN list
    $dcList = $rdnList[$nextIndex..($rdnList.Length - 1)];

    # Reassemble both lists into strings
    $cnText = $cnList -join ',';
    $dcText = $dcList -join ',';

    # The data has now been processed; print it out    
    Write-Host "`$dn: $dn";
    Write-Host "`$cnText: $cnText";
    Write-host "`$dcText: $dcText";
    Write-Host;
}

输出是...

$dn: ou=this,ou=is,dc=a,dc=string
$cnText: ou=this,ou=is
$dcText: dc=a,dc=string

$dn: ou=this,ou=is,ou=another,dc=dn,dc=string
$cnText: ou=this,ou=is,ou=another
$dcText: dc=dn,dc=string
# Define input strings.
$strings = 'ou=this,ou=is,dc=a,dc=string',
           'ou=this,ou=is,ou=another,dc=dn,dc=string'

foreach ($string in $strings) {

  # Split each string into the ou=... part and the dc=... part.
  $ouPart, $dcPart = $string -split ',(?=dc=)', 2

  # Now split each part into its constituent OU and DC names as arrays.
  $ous = $ouPart -split '(?:^|,)ou=' -ne '' -replace '\'
  $dcs = $dcPart -split '(?:^|,)dc=' -ne '' -replace '\'

  # Output result.
  [pscustomobject] @{ ouPart = $ouPart; dcPart = $dcPart; ous = $ous; dcs = $dcs}

}

以上结果:

ouPart                   dcPart          ous                 dcs         
------                   ------          ---                 ---         
ou=this,ou=is            dc=a,dc=string  {this, is}          {a, string} 
ou=this,ou=is,ou=another dc=dn,dc=string {this, is, another} {dn, string}

解释:

  • $string -split ',(?=dc=)', 2 根据第一次出现的子字符串 ,dc= 将输入字符串分成两部分。只有两半之间的 , 被删除,因为 (?=...) -(正)前瞻断言 - 匹配 封闭的表达式,但 捕获它;在这种情况下,它确保第二部分仍然以 dc=.

  • 开头
  • $ouPart, $dcPart = ...-split returns 的 2 元素数组的元素分配给各个变量。

  • $ouPart -split '(?:^|,)ou='ou=...,ou=... 一半拆分为嵌入的 OU 名称数组(拆分 dc=...,dc=... 一半的工作类似):

    • (?:^|,)ou= 匹配出现在字符串开头 (^) 或 (|) 和 , 之前的 ou= 次。
      • ^|, 包含在 非捕获 子表达式 ((?:...)) 中确保子表达式不包含在 -split 结果中.
  • -ne '' 过滤掉在输入字符串的 start 处出现的 -split 分隔符表达式产生的空数组元素。

  • -replace '\' 从每个名称中删除 \ 个实例,因为它们可能包含 \-转义字符,例如值- embedded , 转义为 \,

  • [pscustomobject] @{ ... } (PSv3+) 从哈希表文字 (@{ .... }) 构造一个自定义对象,并将提取的值作为属性。 请注意,只是不将对象分配给变量,它是隐式输出,PowerShell 的默认输出格式自动提供漂亮的表格表示。