Есть ли способ записи изменений в файл журнала в powershell? - PullRequest
0 голосов
/ 30 апреля 2020

Я очень новичок в powershell. Я работаю над экспортом CSV-файлов из базы данных, которая периодически обновляется. Например, он выведет CSV-файлы, такие как Test1.csv, и содержимое для первого запуска будет

Test1.csv

 111,1,111
 222,1,222
 333,1,333

, если сценарий будет запущен во второй раз, вывод того же файла Test1.csv будет

Test1.csv

 111,1,111
 222,1,222

Я хотел бы узнать, есть ли способ сравнить старый Test1.csv и новый Test1.csv и записать разницу?

Это код, который у меня есть:

$location= "C:\Location"
$path = Test-Path $location -IsValid
If($path -eq $True)
{
$checkFile = "C:\Location\Test1.csv"
if(Test-Path $checkFile -PathType leaf)
{
$before = import-csv Test1.csv
}
else
{
  Write-Output "No Exist"
}

# Run some code here that may change Test1.csv

$location= "C:\Location"
$path = Test-Path $location -IsValid
If($path -eq $True)
{
$checkFile = "C:\Location\Test1.csv"
if(Test-Path $checkFile -PathType leaf)
{
$after= import-csv Test1.csv
}
else
{
  Write-Output "No Exist"
}


$after = import-csv Test1.csv
$removed,$added = @(Compare-Object $before $after).where({$_.SideIndicator -eq '<='},'Split')
if ($removed) {
    "The following lines were removed: "
    $removed.InputObject
}
if ($added) {
    "The following lines were added: "
    $added.InputObject
}

1 Ответ

1 голос
/ 30 апреля 2020

Текущие результаты сценария

Похоже, вы уже действительно близко. Мне пришлось немного изменить код сравнения, чтобы он заработал. Я добавил -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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...