Текущие результаты сценария
Похоже, вы уже действительно близко. Мне пришлось немного изменить код сравнения, чтобы он заработал. Я добавил -Header "A","B","C"
, потому что у вашего образца ввода есть повторяющиеся значения и нет заголовков (что вызывает ошибку).
После выполнения секции сравнения на вашем примере ввода я получил следующее:
The following lines were removed:
ColumnA ColumnB ColumnC
------- ------- -------
333 1 333
Я запустил его снова, добавив 444,1,444
(в дополнение к добавлению 3 строки назад) и получил это:
The following lines were added:
ColumnA ColumnB ColumnC
------- ------- -------
444 1 444
Похоже, вы хотите видеть что-то, что показывает все строки которые были добавлены и все строки, которые были удалены в одном выводе. Для этого нам нужно сделать сравнение более сложным и выполнить команду для всех возвращаемых значений.
Обновленный сценарий
Чтобы правильно сравнивать объекты, командлет Compare-Object
должен знать, какие свойства сравнивать. Для этого мы определим их с -Property
. Как отмечалось в предыдущем разделе, я добавил аргумент заголовка в Import-Csv
, чтобы он автоматически преобразовывался в свойства объекта.
$comparison = Compare-Object $before $after -Property A,B,C
В вашей логике c не было ничего плохого, чтобы получить массив добавленных и удаленных строк, но на мой взгляд, это гораздо более читабельно:
$removed = @($comparison | Where-Object { $_.SideIndicator -eq '<=' })
$added = @($comparison | Where-Object { $_.SideIndicator -eq '=>' })
Нам не нужно отображать весь объект, потому что мы уже разбили списки на добавленные и удаленные , Итак, мы выберем только те свойства, которые мы используем (-Property A,B,C
). PowerShell любит «помогать» вам красиво отображать вещи, поэтому иногда он будет получать выходные данные с теми же объектами и отображать их в одной и той же таблице. Нам нужно переопределить это поведение по умолчанию, заставив его использовать Format-Table
.
if($removed)
{
Write-Host "The following lines were removed:"
$removed | Select -Property A,B,C | Format-Table
}
if($added)
{
Write-Host "The following lines were added:"
$added | Select -Property A,B,C | Format-Table
}
Образец Test1.csv - «До»
111,1,111
222,1,222
333,1,333
444,1,444
BBB,1,BBB
Образец Test2.csv - «После»
111,1,111
222,1,222
444,1,444
AAA,1,AAA
BBB,1,BBB
CCC,1,CCC
DDD,1,DDD
Результаты нового скрипта
The following lines were removed:
A B C
- - -
333 1 333
The following lines were added:
A B C
- - -
AAA 1 AAA
CCC 1 CCC
DDD 1 DDD
Полный скрипт
$before = import-csv Test1.csv -Header "A","B","C"
$after = import-csv Test2.csv -Header "A","B","C"
$comparison = Compare-Object $before $after -Property A,B,C
$removed = @($comparison | Where-Object { $_.SideIndicator -eq '<=' })
$added = @($comparison | Where-Object { $_.SideIndicator -eq '=>' })
if($removed)
{
Write-Host "The following lines were removed:"
$removed | Select -Property A,B,C | Format-Table
}
if($added)
{
Write-Host "The following lines were added:"
$added | Select -Property A,B,C | Format-Table
}