我是一个powershell。我已经盯着我的屏幕看了一个下午,试图弄清楚如何比较两个不同目录中的多个文件的文件哈希。($cDlPath)并最终将它们复制到另一个目录($cDestPath)。我希望比较文件的文件哈希,以确保自下载文件以来未发生任何更改。我正在使用Get-Hash cmdlet获取文件哈希,但我不知道如何比较这两个哈希值。如果文件不相等,我希望能够通过名称识别被修改的文件,以便检查文件。
我一直在摆弄下面的代码,但它似乎不是我所追求的。
Compare-Object `
-ReferenceObject $(Get-ChildItem $cDestPath -Recurse | Where-Object {!$_.psiscontainer } | Get-Hash -Algorithm $cHashAlg) `
-DifferenceObject $(Get-ChildItem $cDlPath -Recurse | Where-Object {!$_.psiscontainer } | Get-Hash -Algorithm $cHashAlg)
如有任何帮助,我们将不胜感激。
我使用下面的代码,我似乎有点接近.
Compare-Object $(Get-ChildItem $cDlPath -Recurse $_ | Where-Object { !$_.PsIsContainer } |
Select-Object Name, FullName, Length, @{Name=”SHA256 Hash”; Expression={ Get-Hash $_.FullName
-Algorithm "SHA256" }}, LastWriteTime) $( Get-ChildItem $cDestPath -Recurse $_ | Where-Object
{ !$_.PsIsContainer } | Select-Object Name, FullName, Length, @{Name=”SHA256 Hash”;
Expression={ Get-Hash $_.FullName -Algorithm "SHA256" }}, LastWriteTime) -property @
("Name", “FullName”,”SHA256 Hash”, "Length", "LastWriteTime" ) | Add-Content -Path $cLogFile
但看起来还是不完全正确,因为有些哈希值是相同的,日志文件的输出很难看。只有哈希值相同的文件才应该在日志文件中。
@{Name=nothing.xlsx; FullName=C:\Test\nothing.xlsx; SHA256 Hash=E74424B6324DE014CB0C896DA29D67A2A729E31DF57119E840CA4BD9A9E41754; Length=8891; LastWriteTime=7/31/2012 1:33:11 PM; SideIndicator=<=}
@{Name=test.txt; FullName=C:\Test\test.txt; SHA256 Hash=FC43E73579DB001751A29C1F7A8E2E36E46A53662B63013F0AE500AA896DE056; Length=174; LastWriteTime=7/31/2012 4:52:52 PM; SideIndicator=<=}
@{Name=testfile.txt; FullName=C:\Test\testfile.txt; SHA256 Hash=2B2DB80CAF93224A49A7C94E8EA5BCB1B86D421EA2DB83285149ECAE6DEAA105; Length=415; LastWriteTime=7/27/2012 12:01:21 PM; SideIndicator=<=}
@{Name=nothing.xlsx; FullName=C:\Test\Old\nothing.xlsx; SHA256 Hash=22603417927343A485862CE93790203EE7C2DB092C2060C92D44B736A01FD37E; Length=8978; LastWriteTime=7/31/2012 4:40:43 PM; SideIndicator=<=}
@{Name=test.txt; FullName=C:\Test\Old\test.txt; SHA256 Hash=FC43E73579DB001751A29C1F7A8E2E36E46A53662B63013F0AE500AA896DE056; Length=174; LastWriteTime=7/31/2012 4:52:52 PM; SideIndicator=<=}
@{Name=testfile.txt; FullName=C:\Test\Old\testfile.txt; SHA256 Hash=0B35A9F7F500B46469E2C1759F92D222983C4FDF4AAE316C0F2861FC70D0FD2B; Length=447; LastWriteTime=7/31/2012 4:52:40 PM; SideIndicator=<=}
6条答案
按热度按时间nlejzf6q1#
我知道这是一个陈旧的线程(16个月前),但它是谷歌的顶部结果,这意味着它得到了很多的意见。我认为这可能会有利于其他人...
Mack是对的,使用Get-Hash有一个更漂亮更简单的解决方案。你可以通过比较Hash来简单地比较IF语句中的Hash。
jqjz2hbq2#
一定有更漂亮的解决方案,但这就是我最终使用的。
c90pui9n3#
因此,这里有一个未经测试的解决方案,至少应该让你走在正确的方向:
就像我说的,我现在没有时间测试和解决任何bug,但至少这应该作为我如何解决这个问题的伪代码。
ukqbszuj4#
这对我来说非常有效-比较源代码的两个分支。计数为1的组在另一个分支中没有MD5哈希孪生。例如:
km0tfn4u5#
使用MD5散列进行递归目录文件内容比较
我写了这个纯PowerShell v3+(没有相依性)递归目录diff,透过MD5杂凑比较内容。使用
-ExportSummary [summary/path]
参数,它会汇出一组左、右手目录的csv diff,以及diff的摘要档案。否则会在stdout上给予标准的比较对象diff结果。您可以将rdiff.ps1档案放到您的路径中,然后使用Set-ExecutionPolicy RemoteSigned
、或者将内容直接复制到脚本中。USAGE: rdiff path/to/left,path/to/right [-s path/to/summary/dir]
这是gist。推荐使用gist版本,因为它可能在下面的版本上添加了额外的功能。
t5fffqht6#
使用Powershell的简单方法
SHA1 SHA256 SHA384 SHA512 MD5接口模块