【问题标题】:PowerShell Compare OutputsPowerShell 比较输出
【发布时间】:2019-06-12 06:24:53
【问题描述】:

我有一个文本文件,其中存储了一些带有哈希表的备份文件名。我有另一个文本文件,我只存储哈希表。我在第一个文档下添加了第二个文本文件。我想比较这些哈希表是否相同,我想在哈希表-2附近添加,否则我想在哈希表-1附近添加。

  • "SHA256","89EC548C14582B2BDC7739BC0FA007","C:\WINDOWS\system32@Ap.png"

  • "SHA256","0B99B2576F1FA0689FF6E03462076C","C:\WINDOWS\system32@AudioTot"

  • "SHA256","F3B178AD338023AA3CBCB071CC0063","C:\WINDOWS\system32@biage.png"

  • "SHA256","383D8CBFCD078B3D661655A816676F","C:\WINDOWS\system32@edage.mui"

  • “89EC548C14582B2BDC7739BC0FA007”-2

  • “0B99B2576F1FA0689FF6E03462076C”-2

  • “0A57D7F60CDD9DB6F6F461BBC464FD”-1

  • “F3B178AD338023AA3CBCB071CC0063”-2

  • “7BCA060610F1A753A881593F967G47”-1

  • “383D8CBFCD078B3D661655A816676F”-2

我正在使用从另一个文件添加 txt 文件下的哈希值但无法比较:

$From = Get-Content -Path .\CopyFromFile.txt

Add-Content -Path .\CopyToFile.txt -Value $From

Get-Content -Path .\CopyToFile.txt

【问题讨论】:

  • 订单是否相关? -1 的哈希值属于不在目录中的文件?
  • 不,这不相关。我有超过 65k 条这样的线。我只是想举个例子。在其他 txt 文件中也一样,有一个相同格式的目录。我想指定相同的哈希表,但我无法指定“SHA256”概念(我的猜测是给出类似 -2 然后删除 -1 的内容。)
  • 你的问题我不清楚。你有多少个文件,它们的内容是什么?请创建示例输入文件并将其内容复制/粘贴到您的问题中。明确哪些内容属于哪个文件。同时提供所需输出的样本。

标签: powershell compare


【解决方案1】:

请原谅,但我不认为创建内部具有不同格式的文本文件是一种聪明的方法。

为什么不使用更类似于PowerShell 的方式与Import-CsvCompare-Object 创建一个也可以保存为csv 文件的新对象。

假设上述数据存储在文件hashes.csvhashes.txt 中的纯哈希

这个小脚本(行)

Compare-Object -ref (Import-Csv .\hashes.csv -Header Algorythm,Hash,File) `
               -dif (Import-csv .\hashes.txt -Header Hash) -Property Hash -PassThru -IncludeEqual

产生这个输出:

Algorythm Hash                           File                          SideIndicator
--------- ----                           ----                          -------------
SHA256    89EC548C14582B2BDC7739BC0FA007 C:\WINDOWS\system32@Ap.png    ==
SHA256    0B99B2576F1FA0689FF6E03462076C C:\WINDOWS\system32@AudioTot  ==
SHA256    F3B178AD338023AA3CBCB071CC0063 C:\WINDOWS\system32@biage.png ==
SHA256    383D8CBFCD078B3D661655A816676F C:\WINDOWS\system32@edage.mui ==
          0A57D7F60CDD9DB6F6F461BBC464FD                               =>
          7BCA060610F1A753A881593F967G47                               =>

可以对其进行调整以将 SideIndicator 替换为您的值 -2,-1

【讨论】:

  • 是的,我之前尝试过这种方法,但对于我的场景来说还不够,谢谢你的帮助。
【解决方案2】:

检查以下代码是否有助于解决您的问题。
代码被包装在一个脚本块中以创建一个新范围和preserve $ErrorActionPreference$OFS preference variables 的值。
ReadAllText方法用于读取CopyToFile.txt文件的内容。

& {
  $ErrorActionPreference = 'Stop'
  $OFS = ','
  try {
    $To = [System.IO.File]::ReadAllText('.\CopyToFile.txt')
    $From = & {
      # Add a line if the file .\CopyToFile.txt did not end with a newline.
      if ( -not $To.EndsWith([System.Environment]::NewLine) ) { '' }
      Get-Content -Path .\CopyFromFile.txt |
        ForEach-Object { "$($_, @(-1, -2)[[int]$To.Contains($_)])" }
    }
    Add-Content -Path .\CopyToFile.txt -Value $From
    Get-Content -Path .\CopyToFile.txt
  } catch {
    $_ | Out-String | Write-Warning
  }
}

输出:

"SHA256","89EC548C14582B2BDC7739BC0FA007","C:\WINDOWS\system32@Ap.png"
"SHA256","0B99B2576F1FA0689FF6E03462076C","C:\WINDOWS\system32@AudioTot"
"SHA256","F3B178AD338023AA3CBCB071CC0063","C:\WINDOWS\system32@biage.png"
"SHA256","383D8CBFCD078B3D661655A816676F","C:\WINDOWS\system32@edage.mui"
"89EC548C14582B2BDC7739BC0FA007",-2
"0B99B2576F1FA0689FF6E03462076C",-2
"0A57D7F60CDD9DB6F6F461BBC464FD",-1
"F3B178AD338023AA3CBCB071CC0063",-2
"7BCA060610F1A753A881593F967G47",-1
"383D8CBFCD078B3D661655A816676F",-2

【讨论】:

    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多