代码之家  ›  专栏  ›  技术社区  ›  ATKiwi

更改Powershell输出属性

  •  1
  • ATKiwi  · 技术社区  · 7 年前

    我正在编写一个脚本,将两个目录的内容与同名文件进行比较,并返回不同的文件。这个 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 正确吗 所有物 .

    我想把输出从 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 回复  |  直到 7 年前
        1
  •  2
  •   mklement0    7 年前

    如果你使用 -Property 具有 Compare-Object ,输出对象 只有 具有指定的属性。

    将输入对象传递给 [1] ,添加 -PassThru 转换

    在你的情况下,这应该使 .FullName 属性的输出上可用 比较对象 / Sort-Object .

    总而言之:

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

    [1] 与 -穿越 正在通过的对象被一个 .SideIndicator NoteProperty 成员(PowerShell添加了一个静态值的属性),这样您仍然可以按哪一方筛选输出对象( -ReferenceObject 与。 -DifferenceObject )一个给定的对象是唯一的。

        2
  •  1
  •   Dave Sexton    7 年前

    与其尝试在多个属性上进行比较,不如只在内容的散列上进行比较。比如:

    $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