在 PowerShell 中如何在比较对象的输出中显示文件名

问题描述 投票:0回答:1

我对 PowerShell 脚本非常陌生。

我有两个文件夹,两个文件夹中有数百个同名文件。我正在编写一个长脚本来比较所有文件并将输出发送到文本文件。当我使用这个脚本时:

compare-object  (get-content "D:\Folder1\file1.js")  (get-content "D:\Folder2\file1.js")
compare-object  (get-content "D:\Folder1\file2.js")  (get-content "D:\Folder2\file2.js")
compare-object  (get-content "D:\Folder1\file3.js")  (get-content "D:\Folder2\file3.js")

我得到的是这个:

InputObject SideIndicator
----------- -------------

     * New Text =>
     *          <=

这并没有告诉我哪个文件有这个区别。我希望它也显示文件名(任何人,第一个或第二个文件名)。

我怎样才能做到这一点?

我知道我应该使用 Get-Children,但我需要先学习简单的东西,它可以在循环中实现。

windows powershell batch-file compareobject
1个回答
1
投票

您可以利用

Get-Content
使用包含源文件完整路径的
.PSPath
属性(以及其他属性)装饰其输出行:

Compare-Object (Get-Content D:\Folder1\file1.js) (Get-Content D:\Folder2\file1.js) | 
  Select-Object InputObject, 
                SideIndicator, 
                @{ n = 'Path'; e = { $_.InputObject.PSPath } }

注意使用 calculated property

Path
属性添加到输出对象。

Select-Object
创建具有指定属性的 new 对象。
另一种选择 - 仅用于 display,如果您还需要使用
Compare-Object ... -OutVariable results
保留原始输出对象 - 是使用
Format-Table
.


如果对于来自same文件的任何不同行块,您只想打印块中first行的路径,则需要更多工作,使用辅助。调用者范围内的变量:

$prevPath = ''
Compare-Object (Get-Content D:\Folder1\file1.js) (Get-Content D:\Folder2\file1.js) | 
  Select-Object InputObject, 
                SideIndicator, 
                @{ 
                  Name = 'Path'
                  Expression = { 
                    if ($_.InputObject.PSPath -ne $prevPath) { 
                      (([ref] $prevPath).Value =  $_.InputObject.PSPath)
                    }
                  } 
                } 

注:

  • Expression
    脚本块在调用方的 child 范围内运行,因此直接分配给
    $prevPath
    将创建一个 local 变量,该变量在每次脚本块调用后超出范围。

    • 分配给
      ([ref] $prevPath).Value
      是一种方便的方式,尽管在
      parent
      范围内引用 $prevPath 是一种方便的方式,即调用者的。
      这相当于使用更冗长的
      (Get-Variable -Scope 1 prevPath).Value
  • 将赋值包含在

    (...)
    中传递赋值through,即也outputs值。

  • 注意:在这种情况下,最好使用

    Format-Table
    ,因为输出修改仅用于显示目的.
    然而,至少在 PowerShell 7.3.4 之前,一个长期存在的错误阻止了这种情况 - 请参阅GitHub 问题 #19509

© www.soinside.com 2019 - 2024. All rights reserved.