更改Powershell输出属性

时间:2018-06-01 20:59:04

标签: powershell output

我正在编写一个脚本,该脚本将两个目录的内容与同名文件进行比较,并返回不同的文件。 {I}用于确定文件是否不同的propertyLastWriteTimeSize

这是我目前的剧本:

$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 :(得分:2)

如果-PropertyCompare-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)过滤输出对象。

答案 1 :(得分:1)

为什么不在内容的散列上进行比较,而不是尝试在多个属性上进行比较。像这样:

$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