Powershell 将比较对象的结果添加到数组
我有两个文件进行比较,一个是CSV文件,另一个是txt文件。CSV文件包含约5000台服务器的信息,txt文件仅包含约3000台服务器的名称。CSV中的列包括名称、操作系统和类型。这是我用来比较对象的方法: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文件中
$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 <=