Изменить свойство вывода Powershell - PullRequest
0 голосов
/ 01 июня 2018

Я работаю над сценарием, который сравнивает содержимое двух каталогов с файлами с одинаковыми именами и возвращает файлы, которые отличаются.property Я использую, чтобы определить, отличаются ли файлы LastWriteTime и Size.

Вот мой текущий скрипт:

$var1 = Get-ChildItem -path C:\proj\BIN\ -Recurse 
$var2 = Get-ChildItem -path C:\proj2\BIN\ -Recurse 
Compare-Object -ReferenceObject $var1 -DifferenceObject $var2 -Property Name, LastWriteTime, Size | Sort-Object Name

Вот мой текущий вывод:

Name          LastWriteTime          Size SideIndicator
----          -------------          ---- -------------
folder1       6/1/2018 3:20:37 PM         =>
folder1       5/21/2018 12:08:36 PM       <=
folder2       6/1/2018 3:20:37 PM         =>
folder2       5/21/2018 12:08:36 PM       <=
CustomReports 6/1/2018 3:20:37 PM         =>
CustomReports 5/21/2018 12:08:39 PM       <=
folder3       6/1/2018 3:20:38 PM         =>
folder3       5/21/2018 12:08:38 PM       <=
blank.XML     6/1/2018 3:37:49 PM         =>
blank.XML     11/22/2017 12:36:04 PM      <=

Насколько я знаю, причина в том, что размер пуст, потому что ониодинакового размера (которые они есть).Если это правда, нет проблем.Если это просто совпадение, тогда мне нужно будет исправить это.

РЕДАКТИРОВАТЬ: size неверно.length является правильным property.

Я хочу изменить вывод с Name на Fullname.Если я изменю его в моем скрипте, он перечислит все файлы, потому что они находятся в разных каталогах.

Вместо этого я добавил эту трубу в последнюю строку к этому:

| Format-Table -property FullName, LastWriteTime, Size

Насколько я понимаю, скрипт должен compare-object основываться на name, lastWriteTime, size и на основании этих результатов sort-objectна name и затем верните fullname, lastWriteTime, size из этих результатов.

Мой новый вывод:

FullName LastWriteTime          Size
-------- -------------          ----
         6/1/2018 3:20:37 PM
         5/21/2018 12:08:36 PM
         6/1/2018 3:20:37 PM
         5/21/2018 12:08:36 PM
         6/1/2018 3:20:37 PM
         5/21/2018 12:08:39 PM
         6/1/2018 3:20:38 PM

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Вместо того, чтобы пытаться сравнивать по нескольким свойствам, почему бы просто не сравнить по хешу содержимого.Как то так:

$var1 = Get-ChildItem -path C:\proj\BIN\ -Recurse -File | Get-FileHash -Algorithm SHA1 | Sort Hash
$var2 = Get-ChildItem -path C:\proj2\BIN\ -Recurse -File | Get-FileHash -Algorithm SHA1 | Sort Hash

Compare-Object -ReferenceObject $var1 -DifferenceObject $var2 -Property Hash, {Split-Path $_.Path -leaf} -PassThru
0 голосов
/ 02 июня 2018

Если вы используете -Property с Compare-Object, выходные объекты только имеют указанные свойства.

К пропускают входные объекты через [1] , добавьте переключатель -PassThru.

В вашем случае это должно сделать свойство .FullName доступным на выходе из Compare-Object / Sort-Object.

Чтобы сложить все вместе:

Compare-Object $var1 $var2 -PassThru -Property Name, LastWriteTime, Length | 
  Sort-Object Name | 
    Format-Table FullName, LastWriteTime, Length

[1] С помощью -PassThru объекты, через которые передаются, дополняются элементом .SideIndicator NoteProperty (свойство со статическимдобавлена ​​PowerShell), так что вы все равно можете фильтровать выходные объекты по какой стороне (-ReferenceObject против -DifferenceObject) данный объект был уникальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...