1

我有一个接受来自用户的一些 DN 的 GUI。我知道如何获取文本,但我一生都无法弄清楚如何将此 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。我只是不知道如何将 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,但我需要将它们分开以用于将在代码中完成的其他工作。也很高兴看到他们分开,这样我就可以单独抓住 ou。

4

3 回答 3

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通过第一次出现 substring 将输入字符串拆分为 2 部分,dc=。只有,两半之间的被删除,因为(?=...)- 一个(正)前瞻断言 -匹配封闭的表达式,但不捕获它;在这种情况下,它确保第二半仍然以dc=.

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

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

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

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

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

于 2017-08-15T04:34:27.043 回答
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 变量没有什么不同,但应该提供有关如何使用循环的见解。

希望这可以帮助。

于 2017-08-15T03:07:20.410 回答
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
于 2017-08-15T03:15:42.863 回答