Powershell 将比较对象的结果添加到数组

Powershell 将比较对象的结果添加到数组,powershell,csv,compareobject,Powershell,Csv,Compareobject,我有两个文件进行比较,一个是CSV文件,另一个是txt文件。CSV文件包含约5000台服务器的信息,txt文件仅包含约3000台服务器的名称。CSV中的列包括名称、操作系统和类型。这是我用来比较对象的方法: $compareObject = Compare-Object -ReferenceObject $txtFile -DifferenceObject $csvFile.Name -IncludeEqual 在这之后,我有三个选择。两个列表中的==、仅在txt文件中的=>和仅在csv文件中

我有两个文件进行比较,一个是CSV文件,另一个是txt文件。CSV文件包含约5000台服务器的信息,txt文件仅包含约3000台服务器的名称。CSV中的列包括名称、操作系统和类型。这是我用来比较对象的方法:

$compareObject = Compare-Object -ReferenceObject $txtFile -DifferenceObject $csvFile.Name -IncludeEqual

在这之后,我有三个选择。两个列表中的==、仅在txt文件中的=>和仅在csv文件中的=您希望通过管道将Compare Object的结果传输到endable SideIndicator的过滤,如下所示:


如果$fields包含您的CSV标题,这可能太复杂了,但您可以这样做:

假设这是您的CSV文件:

"Name","OS","Type"
"htew804","Windows","WindowsAutherServer"
"wddg9028","Windows","WindowsAutherServer"
"other321","Windows","WindowsBackupServer"
这是文本文件的内容:

wddg9028
test1234
htew804
然后这个代码:

$csvFile = 'D:\blah.csv'
$txtFile = 'D:\names.txt'

# import the .csv file
$csv = Import-Csv -Path $csvFile
# read the .txt file which contains only server names, each on a separate line
$txt = Get-Content -Path $txtFile

$items = Compare-Object -ReferenceObject $txt -DifferenceObject $csv.Name -IncludeEqual -PassThru 
$result = foreach ($item in $items) {
    $name = $item.ToString()
    switch ($item.SideIndicator) {
        '<='  { 
            # the servername is only present in the text file
            [PSCustomObject]@{
                Name = $name
                OS = ''
                Type = ''
                SideIndicator = $item.SideIndicator
                Comment = "Name only found in $txtFile"
            }
            break
        }
        default  { 
            # '==' AND '=>': the servername is only present in the csv file or in both files
            $server = @($csv | Where-Object { $_.Name -eq $name })[0]
            [PSCustomObject]@{
                Name = $server.Name
                OS = $server.OS
                Type = $server.Type
                SideIndicator = $item.SideIndicator
                Comment = if ($item.SideIndicator -eq '==') { "Name found in both files" } else { "Name only found in $csvFile" }
            }
        }
    }
}
$result | Format-Table -AutoSize
产生以下结果:

如果要将此信息写入新的CSV文件,请将格式表-AutoSize更改为Export CSV-Path'D:\blah_updated.CSV'-NoTypeInformation

正在获取的示例文件,但正在导入两个文件-头文件名为的文本文件 和s-PassThru方法, 加上颠倒顺序,将csv文件作为参考 就这么简单:

$csvFile = Import-Csv .\sample.csv
$txtFile = Import-csv .\sample.txt -Header Name

Compare-Object -Ref $csvFile -Dif $txtFile -Property Name -IncludeEqual -PassThru
要获得所需的输出,请执行以下操作:

Name     OS      Type                SideIndicator
----     --      ----                -------------
wddg9028 Windows WindowsAutherServer ==
htew804  Windows WindowsAutherServer ==
test1234                             =>
other321 Windows WindowsBackupServer <=

所以两人都从我这里得到+1。

不知何故,比较对象对我来说从来都不容易。。这绝对是最好的答案+1完美的解决方案!:
Name     OS      Type                SideIndicator Comment                        
----     --      ----                ------------- -------                        
wddg9028 Windows WindowsAutherServer ==            Name found in both files       
htew804  Windows WindowsAutherServer ==            Name found in both files       
other321 Windows WindowsBackupServer =>            Name only found in D:\blah.csv 
test1234                             <=            Name only found in D:\names.txt
$csvFile = Import-Csv .\sample.csv
$txtFile = Import-csv .\sample.txt -Header Name

Compare-Object -Ref $csvFile -Dif $txtFile -Property Name -IncludeEqual -PassThru
Name     OS      Type                SideIndicator
----     --      ----                -------------
wddg9028 Windows WindowsAutherServer ==
htew804  Windows WindowsAutherServer ==
test1234                             =>
other321 Windows WindowsBackupServer <=