繁体   English   中英

powershell匹配多个变量

[英]powershell match multiple variables

因此,我阅读了很多stackoverflow,它总是对我的理解有所帮助,目前,我对匹配多个变量中的任何一个感到有些困惑,因此,我想问一下导出。

我的任务有点背景。

我是具有多个子域(+4)的AD林的系统管理员,我们正在经历将这些域合并为一个域的过程-但是,不幸的是,由于每个域都是独立管理的,因此我们遇到了古老的“重复SAM”问题(一旦我们开始挖掘,肯定也会遇到重复的UPN)。

因此,我正在尝试构建脚本来查找这些重复项,以便与支持这些域中用户的团队联系。

我有一个公平的方法,我导出了一个迁移域的SAM列表,我可以将其解析为PS,并让它针对我的所有域查找每个SAM,或者给我一个变量,用户名或$ null。

因此,我现在只想了解“ IF”命令用于匹配多个变量并显示匹配的变量的含义。

因此,例如,从这些变量中...

$one="MSmith01"
$oneNT="DOMAIN1\MSmith01"
$two="MSmith01"
$twoNT="DOMAIN2\MSmith01"
$three=$null
$threeNT=$null
$four=$null
$fourNT=$null
$five="MSmith01"
$fiveNT="DOMAIN5\MSmith01"
$six=$null
$sixNT=$null

如果有多个变量匹配,我该如何编写IF命令来显示?

如果我这样写:

if ($one -match $two -match $three -match $four -match $five -match $six) {write-host "Duplicate Found - $oneNT, $twoNT, $threeNT, $fourNT, $fiveNT, $sixNT." -foregroundcolor "yellow"}

它会告诉我:

Duplicate Found - DOMAIN1\MSmith01, DOMAIN2\MSmith01, , , DOMAIN5\MSmith01,.

但是,如果变量是:

$one=$null
$oneNT=$null
$two="MSmith01"
$twoNT="DOMAIN2\MSmith01"
$three="MSmith01"
$threeNT="DOMAIN3\MSmith01"
$four=$null
$fourNT=$null
$five=$null
$fiveNT=$null
$six=$null
$sixNT=$null

然后结果似乎忽略了DOMAIN 2和DOMAIN3具有匹配的SAM的事实,并且看来“ x -match y -match z”实际上仅是比较x和y,因此我什么也没得到。 这显然是不正确的。

谁能解释我如何比较和寻找多个变量之间的任何重复项?

谢谢

详细说明:为了获取变量,我正在这样做:

$SAMAccountList=gc "C:\My Documents\Domain2SAMList.txt"

$SamAccountList | % {
$one=Get-QADUser -SamAccountName $_ -IncludedProperties SamAccountName -Server dc.domain1.local | foreach { $_.SAMAccountName }
$oneNT=Get-QADUser -SamAccountName $_ -IncludedProperties NTAccountName -Service dc.domain1.local | foreach { $_.NTAccountName }
$twoSAM=Get-QADUser -SamAccountName $_ -IncludedProperties SamAccountName -Service dc.domain2.local | foreach { $_.SAMAccountName }
$twoNT=Get-QADUser -SamAccountName $_ -IncludedProperties NTAccountName -Service dc.domain2.local | foreach { $_.NTAccountName }
#...
#...
#...etc for each domain
}

然后这给了我上面提到的一组变量

我将它们放在一个customobject中,并使用唯一的名称进行搜索。

$NAMES = @()

$NAMES  += [pscustomobject] @{name=$one;nameNT=$oneNT}
$NAMES  += [pscustomobject] @{name=$two;nameNT=$twoNT}
$NAMES  += [pscustomobject] @{name=$three;nameNT=$threeNT}
$NAMES  += [pscustomobject] @{name=$four;nameNT=$fourNT}
$NAMES  += [pscustomobject] @{name=$five;nameNT=$fiveNT}
$NAMES  += [pscustomobject] @{name=$six;nameNT=$sixNT}

$UniqueNames=($NAMES  | Sort-Object -Property name -Unique).Name

ForEach($Uniquename in $UniqueNames){

  if($Uniquename -ne $NULL){

     $SEARCH_RESULT=$NAMES|?{$_.Name -eq $Uniquename}

     if ( $SEARCH_RESULT.Count -gt 1)
     {     
            $SEARCH_RESULT
     }
  }
}

我得到以下结果

First data set
name         nameNT
----         ------
MSmith01     DOMAIN1\MSmith01
MSmith01     DOMAIN2\MSmith01
MSmith01     DOMAIN5\MSmith01

Second data set
name         nameNT
----         ------
MSmith01     DOMAIN2\MSmith01
MSmith01     DOMAIN3\MSmith01

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM