在 powershell 中比较 2 个数组的重复值

问题描述 投票:0回答:0

我正在尝试比较 2 个数组的重复条目。如果两个数组中都存在一个条目,我想将其保存到一个变量中。此外,我希望带有信息的变量包含我从电子表格中提取的现有结构。 (你可以在我的代码中看到我正在提取补丁窗口、ASA、测试、dmz、服务器名称等信息)。

这里有更多关于我想要完成的信息。

首先,我使用 [adsisearcher] 从 Active Directory 中提取服务器列表。唯一真正让我感兴趣的变量是名称,所以这就是它存储的全部内容。 让我们将此变量命名为 $A.

接下来我有一个电子表格,其中包含一堆服务器和其他信息,例如它是否是测试服务器、产品等……我使用“Import-Excel”powershell 模块从我的工作表中导入数据,但不同之处在于这是我拉的一些不同的东西。 服务器名,是否是DMZ,测试服务器,补丁窗口和服务器的系统管理员。

我使用 LINQ 检查两个数组之间相交的值,但输出为空。

最终结果是这样的……我想要一种快速的方法来根据电子表格中的内容对服务器进行抽查,以确保它们仍然处于活动状态并且\或者它不是一个设备。

我尝试做一个foreach循环来检查每个服务器使用:

if(($($ServerList.DMZServer) -eq $true) -OR ($NULL -ne (([adsisearcher]"(&(objectClass=computer)(objectCategory=computer)(samaccountname=$($ServerList.ServerName)$))").FindOne())))    
{
blah
}

然而,这比我想要的要长,所以我希望能快一点。由于我拥有所有可用数据并且我可以比较 2 个数组,我认为这可能是最佳选择,但我没有得到我希望的结果。我愿意接受任何建议或帮助。

这是我的脚本:

CLS

$ErrorActionPreference = 'SilentlyContinue'
$ErrorFile = (Split-Path $script:MyInvocation.MyCommand.Path) + "\ERROR.txt"

#Install the module that will let us perform certain tasks in Excel
#Install PSExcel Module for powershell
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

#Check if Module is imported
if(Get-Module -ListAvailable -Name "ImportExcel")
{
        Import-Module ImportExcel
}
else
{
    #Install NuGet (Prerequisite) first
    Install-PackageProvider -Name NuGet -Scope CurrentUser -Force -Confirm:$False
    
    Install-Module -Name ImportExcel -Scope CurrentUser -Force -Confirm:$False
    Import-Module ImportExcel
}

#Clear screen again
CLS

#Start Timestamp
Get-Date

Write-Host " "

#------------------------------------ Global Variables

$Path = (Split-Path $script:MyInvocation.MyCommand.Path)

$ListA = $ListB = $ServerList = $ServersList = $FilteredServers = @()
    
#------------------------------------  Setup Excel Variables

#The file we will be reading from
$ExcelFile = (Get-ChildItem -Path "$Path\*.xlsx").FullName
    
#Worksheet we are working on (by default this is the 1st tab)
$worksheet = (((New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList (New-Object -TypeName System.IO.FileStream -ArgumentList $ExcelFile,'Open','Read','ReadWrite')).Workbook).Worksheets[1]).Name

$Servers = Import-Excel -Path $ExcelFile -WorkSheetname $worksheet -StartRow 1

#------------------------------------ Populate our variable with data from spreadsheet

foreach($Server in $Servers)
{
    $ServersList += [pscustomobject]@{ 'ServerName'   = $Server."Child"
                                       'TestServer'   = $Server."Test server"
                                       'DMZServer'    = $Server."DMZ"
                                       'PatchWindow'  = $Server."Patch Window"
                                       'ASA'          = $Server."Primary" }
}

#------------------------------------ Remove Duplicate entries

$ServersList = ($ServersList | Sort-Object -Property ServerName -Unique)

#------------------------------------ Seperate Servers from DMZ Servers

foreach($ServerList in $ServersList)
{
    #Check if server is on DMZ
    if($($ServerList.DMZServer) -eq $true)
    {
        $ServerList.ServerName += ".dmz.com"
    }

    $FilteredServers += $ServerList
}

#------------------------------------ Filter out Appliances

#                First Grab all servers from AD

#------------------------------------

#Get Servers
$searcher = [adsisearcher]::new()

$searcher.Sort.PropertyName = "name"

#Search root is the OU level we want to search at
$searcher.SearchRoot = [adsi]"LDAP://OU=Servers,DC=blah,DC=com"

#Make this any non zero value to expand the default result size.
$searcher.PageSize = 100

#Filter Computers only and enabled
$searcher.Filter = "(&(objectCategory=computer)(objectClass=computer)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"

#List the properties we are interested in
$searcher.PropertiesToLoad.AddRange(('name','distinguishedname'))

#Now output the results with the exception of filtering out any machines in the citrix farms (we're not interested in those)
$Servers = Foreach ($Computer in $searcher.FindAll()){ ($Computer.Properties).name }

#------------------------------------

## Compare the 2 arays and pull out the servers that we want.

[String[]]$ListA = $Servers
[String[]]$ListB = $FilteredServers.ServerName

[System.Linq.Enumerable]::Intersect([object[]]$ListA, [object[]]$ListB)
arrays string powershell linq multidimensional-array
© www.soinside.com 2019 - 2024. All rights reserved.