PowerShell:将用户定义的可分辨名称拆分为单个部分

时间:2017-08-15 02:29:35

标签: string powershell join split distinguishedname

我有一个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的新手,所以任何建议都会非常感激。

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

3 个答案:

答案 0 :(得分:1)

# 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=将输入字符串拆分为2部分。只删除了两半之间的,,因为(?=...) - a(正)前瞻断言 - 匹配所附表达式,但不是捕捉它;在这种情况下,它确保后半部分仍以dc=开头。

  • $ouPart, $dcPart = ...指定-split返回单个变量的2元素数组的元素。

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

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

  • -replace '\\'从每个名称中移除\个实例,因为它们可能包含\个转义字符,例如值嵌入式 { {1}}已转义为,

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

答案 1 :(得分:0)

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

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变量没有区别,但应该提供有关如何使用循环的深入信息。

希望这有帮助。

答案 2 :(得分:0)

希望这有助于提出要求。这假设您希望将相对可分辨名称存储在两个组中:在您点击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