Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何分割区分名称?_Powershell_Distinguishedname - Fatal编程技术网

Powershell 如何分割区分名称?

Powershell 如何分割区分名称?,powershell,distinguishedname,Powershell,Distinguishedname,我有一个名单的人和他们的DN从广告(我没有直接访问该广告)。其DNs的格式为: $DNList = 'CN=Bob Dylan,OU=Users,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com', 'CN=Ray Charles,OU=Contractors,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com', 'CN=Martin Sheen,OU=Us

我有一个名单的人和他们的DN从广告(我没有直接访问该广告)。其DNs的格式为:

$DNList = 'CN=Bob Dylan,OU=Users,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com',
          'CN=Ray Charles,OU=Contractors,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com',
          'CN=Martin Sheen,OU=Users,OU=Dept,OU=Agency,OU=WaySouth,DC=myworld,DC=com'
我想让
$DNList
返回以下内容:

OU=Users,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com
OU=Contractors,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com
OU=Users,OU=Dept,OU=Agency,OU=WaySouth,DC=myworld,DC=com

每个用户有7个项目,以逗号分隔,您希望删除第一个项目

因此,使用逗号作为分隔符拆分数组中的每个项,返回匹配项1-6(0是要跳过的第一个项),然后再次使用逗号连接,例如

$DNList = $DNList|foreach{($_ -split ',')[1..6] -join ','}
如果然后输入
$DNList
,则返回

OU=Users,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com
OU=Contractors,OU=Dept,OU=Agency,OU=NorthState,DC=myworld,DC=com
OU=Users,OU=Dept,OU=Agency,OU=WaySouth,DC=myworld,DC=com

您可以按如下方式替换第一个图元:

$DNList -replace '^.*?,(..=.*)$', '$1'
^.*?,
是从字符串开头到逗号的最短匹配项。

(..=.*)$
匹配字符串的其余部分(从逗号后的两个字符开始,后跟一个
=
字符),并对它们进行分组,因此,在替换中可以将匹配项引用为
$1

,类似于Grahams answer,但删除了硬编码数组值,因此它只删除CN部分,而不必担心DN的长度

$DNList | ForEach-Object{($_ -split "," | Select-Object -Skip 1) -join ","}
Ansgar很可能有一个很好的理由,但您可以使用regex删除第一个逗号之前的每个逗号

$DNList -replace "^.*?,"
基于briantist的更新

为了保持一个不同的答案,但这个正则表达式仍然会有问题,但我怀疑这些字符是否会出现在用户名中

$DNList -replace "^.*?,(?=OU=)"
正则表达式使用一个向前看的方法来确保,后面跟着
OU=

同样,你也可以这样做

($DNList | ForEach-Object{($_ -split "(,OU=)" | Select-Object -Skip 1) -join ""}) -replace "^,"

我决定把我的评论变成一个答案:

$DNList | ForEach对象{

$\ux-replace'^.+?(?很好-如果您对powershell(或正则表达式)不太熟悉,我认为拆分/联接可能更具可读性,但是正则表达式是否更快?(对于本例来说,这无关紧要,但考虑到与这里的3相比,还有更多的项需要处理)@GrahamGold大约快了10倍,根据我刚刚在一个更大的样本(1300个元素)上运行的快速测试。此外,当第一个元素包含逗号时,简单地拆分DNs可能会导致问题。我感觉可能是:-)当我尝试这样做的时候,我得到了一个不是OP想要的结果:-OU=Users,CN=Bob Dylan,DC=com OU=Contractors,CN=Ray Charles,DC=com OU=Users,CN=Martin Sheen,DC=com你是对的。我想到的是另一个场景。请忽略这个建议。@Matt的建议是处理va的更好方法变量长度。有了powershell,实现同一目标的方法不止一种-这个问题的答案是肯定的:-)为什么我喜欢(有时讨厌)powershell!@GrahamGold非常正确。这是我学习其他方法的方式。看看其他人做了什么。这里已经有很多好的答案。我只想指出“田地"在一个DN中,它本身可以包含一个逗号,当它们包含逗号时,会用反斜杠转义,这样你就可以有
CN=Dylan\,Bob,OU=Users
。只要小心你选择的任何一种方法都可以处理这个问题。哦,这不是真的。我的工作使用
Last,First
在广告中显示名称,所以我一直看到:)试图用h这个事实。我确实同意这个答案,结果数据看起来很好,至少在随机抽查中是这样。然而,这很奇怪……在一份包含1600个项目的清单上运行,前十几个项目,整个过程似乎超时和/或堵塞了。但等待了大约20多秒,并快速闪现出正确的结果。尽管看起来很奇怪,但它是工作干净干净。非常非常感谢!