AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1558327
Accepted
HTWingNut
HTWingNut
Asked: 2020-06-06 17:25:31 +0800 CST2020-06-06 17:25:31 +0800 CST 2020-06-06 17:25:31 +0800 CST

Powershell比较对象但忽略特定字符?

  • 772

感谢这里的另一个用户,我能够发现 Powershell 比较对象。

我使用的代码很简单,这里是:

$array = Compare-Object $(Get-Content $Source1) $(Get-Content $Source2)
$array | where {$_.SideIndicator -eq "<="} | Format-Table -Property InputObject -AutoSize -HideTableHeaders | Out-File -Width 512 -Encoding utf8 NoMatchA.txt
$array | where {$_.SideIndicator -eq "=>"} | Format-Table -Property InputObject -AutoSize -HideTableHeaders | Out-File -Width 512 -Encoding utf8 NoMatchB.txt

我比较的文件是哈希+文件路径,看起来像这个测试输入源A:

0004250736cc617f596b24d69c52a1276ea7f81cd5f7c7e49458894987d02538 D:\Documents\Server\DBackupServer\snapraid\Archive\authors.txt
5a10fd71a62ca272908ded8a7f20826722c0fc67da22256accb42159baa13af2 D:\Documents\Server\DBackupServer\snapraid\Archive\copying.txt
d3d868c751b91c5bd5105db5b9c4f35429fe85a6405bf7fa073d969a0f24a4bc D:\Documents\Server\DBackupServer\snapraid\Archive\history.txt
a1ca63b535996640ac4c5ae0fb91998ebcb495928a637d8d8f71508573c289bd D:\Documents\Server\DBackupServer\snapraid\Archive\install.txt
62f9bfd975bc0773be108b20467d6ece969e06e033b5ae51fb56597d09800000 D:\Documents\Server\DBackupServer\snapraid\Archive\readme.txt

来源B:

0004250736cc617f596b24d69c52a1276ea7f81cd5f7c7e49458894987d00000 E:\Documents\Server\DBackupServer\snapraid\Archive\authors.txt
06d99bb9e6b9c0f57828b29a465a769628da86faca48a104fbdd3263d85eda4d E:\Documents\Server\DBackupServer\snapraid\Archive\backup_snapraid.bat
5a10fd71a62ca272908ded8a7f20826722c0fc67da22256accb42159baa13af2 E:\Documents\Server\DBackupServer\snapraid\Archive\history.txt
a1ca63b535996640ac4c5ae0fb91998ebcb495928a637d8d8f71508573c289bd E:\Documents\Server\DBackupServer\snapraid\Archive\install.txt
62f9bfd975bc0773be108b20467d6ece969e06e033b5ae51fb56597d098969f3 E:\Documents\Server\DBackupServer\snapraid\Archive\readme.txt

但我希望它忽略驱动器号,以便我可以比较来自两个不同来源的两个文件。现在我通过for /f批处理文件中的命令运行哈希日志文件以删除驱动器号,但是对于大量条目可能需要很长时间。

compare-object 有什么方法可以忽略驱动器号?这:是驱动器号的唯一标识符(尽管最终希望让它与前面的 UNC 一起工作\\)并且考虑到哈希值,它应该始终位于相同的位置,所以这可能会有所帮助。

我尝试使用该Split()命令,虽然我可以根据空格字符拆分对象,但我不确定如何将它实现到比较对象中。

我尝试使用:get-content $Source1 | foreach {$_ -replace "D:", ""} | Set-Content "$Source1a"这与批处理文件一样长...

谢谢你的帮助。

编辑:谢谢大家到目前为止的帮助。我还没有机会测试一个提案,明天应该会去。

无论如何,为了澄清我正在寻找三个文件输出:

  1. A 中的文件而不是 B 中的文件- 与输入相同的输出格式(哈希 + 文件路径/名称),但仅比较文件名/路径,以识别源 A 中而不是源 B 中的文件。

从上面的测试输入中,结果输出将是“FileAnotInB.txt”:

5a10fd71a62ca272908ded8a7f20826722c0fc67da22256accb42159baa13af2 D:\Documents\Server\DBackupServer\snapraid\Archive\copying.txt
  1. B 中的文件而不是 A 中的文件- 与输入相同的输出格式(哈希 + 文件路径/名称),但仅比较文件名/路径,以识别源 B 中而不是源 A 中的文件。

从上面的测试输入中,结果输出将是“FileBnotInA.txt”:

06d99bb9e6b9c0f57828b29a465a769628da86faca48a104fbdd3263d85eda4d E:\Documents\Server\DBackupServer\snapraid\Archive\backup_snapraid.bat
  1. 散列不匹配- 与输入相同的输出格式(散列 + 文件名路径),但仅比较散列,以识别不匹配的散列,最好将 sourceA 和 SourceB 相互叠加以进行简单比较:

从上面的 Test INPUT 中,结果输出将是(通知 00000 在哈希末尾替换以进行测试)“FailedHashes.txt”:

0004250736cc617f596b24d69c52a1276ea7f81cd5f7c7e49458894987d02538 D:\Documents\Server\DBackupServer\snapraid\Archive\authors.txt
0004250736cc617f596b24d69c52a1276ea7f81cd5f7c7e49458894987d00000 D:\Documents\Server\DBackupServer\snapraid\Archive\authors.txt
62f9bfd975bc0773be108b20467d6ece969e06e033b5ae51fb56597d09800000 E:\Documents\Server\DBackupServer\snapraid\Archive\readme.txt
62f9bfd975bc0773be108b20467d6ece969e06e033b5ae51fb56597d098969f3 E:\Documents\Server\DBackupServer\snapraid\Archive\readme.txt

看起来 JosefZ 的回应可能会做到这一点,或者至少我可以调整它来做到这一点。我必须测试才能看到,但想编辑以澄清并感谢您的帮助!

windows powershell
  • 2 2 个回答
  • 1047 Views

2 个回答

  • Voted
  1. Best Answer
    JosefZ
    2020-06-08T05:52:36+08:002020-06-08T05:52:36+08:00

    以下代码片段显示了如何忽略驱动器号的一种可能方法:

    Compare-Object $((Get-Content $Source1) -replace "\s[A-Z]\:\\", ' \') $((Get-Content $Source2) -replace "\s[A-Z]\:\\", ' \')
    

    ...是否还有一种简单的方法可以使用 compare-object 和/或 where-object 来吐出一个文件,该文件显示文件名匹配的位置,但哈希文件不匹配?这最终是我的目标是三个文件:源 A 中的文件不在 B 中。源 B 中的文件不在 A 中。然后是相同的文件名/路径但哈希不匹配?

    我不确定这种三分法是否如上述补充要求中所述定义良好。但是,这是我解决它的尝试(稍微更改了变量和文件名):

    $sourcePath = 'D:\PShell\DataFiles'
    $utf8     = 'utf8'     # $utf8 = 'Default'  # debugged using Default
    $sourceA  = "$sourcePath\1558327A.txt"
    $sourceB  = "$sourcePath\1558327B.txt"
    $contentA = (Get-Content -Path $SourceA)
    $contentB = (Get-Content -Path $SourceB)
    $array = Compare-Object -ReferenceObject  $(
                $contentA -replace "\s[A-Z]\:\\", ' \')  -DifferenceObject $(
                $contentB -replace "\s[A-Z]\:\\", ' \')
    $arrNotInB = $array | Where-Object {$_.SideIndicator -eq "<="} # |    Select-Object -ExpandProperty InputObject #| 
    $arrNotInA = $array | Where-Object {$_.SideIndicator -eq "=>"} # |    Select-Object -ExpandProperty InputObject #|
    
    # Files in Source B not in A. 
    $arrNotInA |
        Select-Object -ExpandProperty InputObject |
        Where-Object {
            -not ($arrNotInB -match [regex]::Escape($($_ -split '\s', 2)[1]))
        } | Out-File -Width 512 -Encoding $utf8 -FilePath "$sourcePath\NotInA.txt"
    # Files in source A not in B.
    $arrNotInB |
        Select-Object -ExpandProperty InputObject |
        Where-Object {
            -not ($arrNotInA -match [regex]::Escape($($_ -split '\s', 2)[1]))
        } | Out-File -Width 512 -Encoding $utf8 -FilePath "$sourcePath\NotInB.txt" 
    # And then same filenames/paths but with mismatched hash
    (
    $arrNotInB |
        Select-Object -ExpandProperty InputObject |
        Where-Object {
            ($arrNotInA -match [regex]::Escape($($_ -split '\s', 2)[1]))
        } | ForEach-Object {
            $auxHash, $auxPath = $_ -split '\s', 2
            $contentA | Where-Object {
                ($_ -replace "\s[A-Z]\:\\", ' \') -match [regex]::Escape("$auxHash $auxPath")
            }
        }
    ),(
    $arrNotInA |
        Select-Object -ExpandProperty InputObject |
        Where-Object {
            ($arrNotInB -match [regex]::Escape($($_ -split '\s', 2)[1]))
        } | ForEach-Object {
            $auxHash, $auxPath = $_ -split '\s', 2
            $contentB | Where-Object {
                ($_ -replace "\s[A-Z]\:\\", ' \') -match [regex]::Escape("$auxHash $auxPath")
            }
        }
    ) | Out-File -Width 512 -Encoding $utf8 -FilePath "$sourcePath\NotMatchHash.txt"
    
    • 1
  2. Keith Miller
    2020-06-08T14:57:22+08:002020-06-08T14:57:22+08:00

    样本数据:

    # --- SourceA --    --- SourceB --
    # --------------    --------------
    # 123 c:\123.txt    123 c:\123.txt  <-- FullMatch
    # 456 c:\456.txt    789 c:\789.txt  <-- NoMatch
    # 0ab c:\0ab.txt    0ab d:\0ab.txt  <-- Hash + RelPathMatch
    

    创建示例文件:

    @'
    123 c:\123.txt
    456 c:\456.txt
    0ab c:\0ab.txt
    '@ | Set-Content A.txt
    @'
    123 c:\123.txt
    789 c:\789.txt
    0ab d:\0ab.txt
    '@ | Set-Content B.txt
    
    

    Import-Csv如果您可以控制源文件的创建,则可以将以下内容简化为操作:

    Function Import-Log ($Path) {
       Get-Content $Path | ForEach{
          $_ -match '(^.+ )[A-Za-z]\:\\(.+$)' | out-null
          [PSCustomObject]@{
             Full    = $matches[0]
             NoDrive = $matches[1] + $matches[2]
          }
       }
    }
    

    定义了上述函数:

    $oA = Import-Log A.txt
    $oB = Import-Log B.txt
    
    $NoMatches = Compare-Object $oA $oB -Property NoDrive
    $AnotB     = $NoMatches | ? SideIndicator -like '<='
    $BnotA     = $NoMatches | ? SideIndicator -like '=>'
    $HashMatch = Compare-Object $oA $oB -Property Full, NoDrive | ? NoDrive -notIn $NoMatches.NoDrive
    

    结果:

    PS C:\> $NoMatches
    
    NoDrive     SideIndicator
    -------     -------------
    789 789.txt =>
    456 456.txt <=
    
    
    PS C:\> $AnotB
    
    NoDrive     SideIndicator
    -------     -------------
    456 456.txt <=
    
    
    PS C:\> $BnotA
    
    NoDrive     SideIndicator
    -------     -------------
    789 789.txt =>
    
    
    PS C:\> $HashMatch
    
    full           NoDrive     SideIndicator
    ----           -------     -------------
    0ab d:\0ab.txt 0ab 0ab.txt =>
    0ab c:\0ab.txt 0ab 0ab.txt <=
    
    
    • 1

相关问题

  • Python 的“pass”参数的批处理等价物是什么?

  • 禁用后无法启用 Microsoft Print to PDF

  • 我可以让这个 PowerShell 脚本接受逗号吗?

  • 在 Windows 上与 Docker 守护进程通信

  • 资源管理器侧面板中的桌面外壳快捷方式

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve