【问题标题】:Change Powershell Output Property更改 Powershell 输出属性
【发布时间】:2018-06-01 20:59:03
【问题描述】:

我正在编写一个脚本,该脚本将两个目录的内容与同名文件进行比较,并返回不同的文件。我用来确定文件是否不同的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-objectname,然后从这些结果返回 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

【问题讨论】:

  • [System.IO.FileInfo] 实例没有.Size 属性,只有.Length 属性; [System.IO.DirectoryInfo] 实例(目录又名文件夹)两者都没有。
  • 谢谢!实施它并立即看到变化。
  • 很高兴听到这个消息;如有疑问,请将命令的输出通过管道传送到 Get-Member 以检查其成员(属性和方法)。

标签: powershell output


【解决方案1】:

如果您将-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)是唯一的。

【讨论】:

    【解决方案2】:

    与其尝试比较多个属性,不如只比较内容的哈希值。像这样的:

    $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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 2019-02-12
      • 2014-04-06
      • 2018-07-07
      相关资源
      最近更新 更多