我正在编写一个脚本,该脚本将两个目录的内容与同名文件进行比较,并返回不同的文件。 {I}用于确定文件是否不同的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
答案 0 :(得分:2)
如果-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
)过滤输出对象。
答案 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