我是一个Powershell。下午的大部分时间我都在盯着屏幕,试图弄清楚如何比较两个不同目录中多个文件的文件哈希。该脚本会将文件从 FTP 站点下载到一个目录 ($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)
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。
我正在使用下面的代码,我似乎更接近一些。
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
Run Code Online (Sandbox Code Playgroud)
它看起来仍然不完全正确,因为有一些哈希是相同的,并且日志文件的输出很难看。如果这些文件具有相同的哈希值,则它们仅应位于日志文件中。
@{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=<=}
Run Code Online (Sandbox Code Playgroud)
小智 10
我意识到这是一个陈旧的线程(16 个月大),但它是谷歌的最高结果,这意味着它获得了很多浏览量。我认为这可能会使其他人受益...
Mack 是对的,使用 Get-Hash 有一个更漂亮、更简单的解决方案。您可以通过比较哈希来简单地比较 IF 语句中的哈希。
# Get the file hashes
$hashSrc = Get-FileHash $file -Algorithm "SHA256"
$hashDest = Get-FileHash $file2 -Algorithm "SHA256"
# Compare the hashes & note this in the log
If ($hashSrc.Hash -ne $hashDest.Hash)
{
Add-Content -Path $cLogFile -Value " Source File Hash: $hashSrc does not
equal Existing Destination File Hash: $hashDest the files are NOT EQUAL."
}
Run Code Online (Sandbox Code Playgroud)
必须有一个更漂亮的解决方案,但这就是我最终使用的。
# Get the file hashes
$hashsourcefile = Get-Hash $file -Algorithm "SHA256"
$hashdestfile = Get-Hash $file2 -Algorithm "SHA256"
# Compare the hashes
Compare-Object -Referenceobject $hashsourcefile -Differenceobject $hashdestfile | % { If ($_.Sideindicator -ne " ==") {$diff+=1} }
# The Hashes are different. Note this in the log
if ($diff -ne 0)
{
Add-Content -Path $cLogFile -Value " Source File Hash: $hashsourcefile does not equal
Existing Destination File Hash: $hashdestfile the files are NOT EQUAL."
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27080 次 |
| 最近记录: |