我有一个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的新手,所以任何建议都会非常感激。
我知道我可以根据我的信息创建你的,但是我需要将它们分开用于其他将在代码中完成的工作。也很高兴看到它们分开,以便我可以单独抓住你。
答案 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