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 的默认输出格式自动提供漂亮的表格表示。
我有一个 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 的默认输出格式自动提供漂亮的表格表示。