【问题标题】:powershell match multiple variablespowershell匹配多个变量
【发布时间】:2014-12-16 06:52:55
【问题描述】:

所以我读了很多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
}

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

【问题讨论】:

    标签: powershell comparison match matching


    【解决方案1】:

    我会将它们放在一个自定义对象中并使用唯一名称进行搜索。

    $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
    

    【讨论】:

    • 您好,谢谢您的回复。非常感激。我将扩展我最初的问题以尝试帮助自己并帮助你帮助我希望!
    • 我也不太理解关于“唯一”的评论——因为实际上我将有一个列表,其中要么是几个 $null 变量,要么是几个相同的 SAM 名称。如果我使用一个唯一参数,我会不会遇到几个变量也是 $null 的问题?
    • 嗨,我用结果更新了回复。如果你把你关心的数据模式告诉我,我也许能帮到你。
    • 嗨,hysh,我不太了解语法,但是,我尝试并测试了您的建议,它按原样完美运行。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2018-09-07
    • 2023-03-23
    • 2014-03-05
    • 2017-09-26
    • 2013-04-02
    • 1970-01-01
    相关资源
    最近更新 更多