感谢这里的另一个用户,我能够发现 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"
这与批处理文件一样长...
谢谢你的帮助。
编辑:谢谢大家到目前为止的帮助。我还没有机会测试一个提案,明天应该会去。
无论如何,为了澄清我正在寻找三个文件输出:
- A 中的文件而不是 B 中的文件- 与输入相同的输出格式(哈希 + 文件路径/名称),但仅比较文件名/路径,以识别源 A 中而不是源 B 中的文件。
从上面的测试输入中,结果输出将是“FileAnotInB.txt”:
5a10fd71a62ca272908ded8a7f20826722c0fc67da22256accb42159baa13af2 D:\Documents\Server\DBackupServer\snapraid\Archive\copying.txt
- B 中的文件而不是 A 中的文件- 与输入相同的输出格式(哈希 + 文件路径/名称),但仅比较文件名/路径,以识别源 B 中而不是源 A 中的文件。
从上面的测试输入中,结果输出将是“FileBnotInA.txt”:
06d99bb9e6b9c0f57828b29a465a769628da86faca48a104fbdd3263d85eda4d E:\Documents\Server\DBackupServer\snapraid\Archive\backup_snapraid.bat
- 散列不匹配- 与输入相同的输出格式(散列 + 文件名路径),但仅比较散列,以识别不匹配的散列,最好将 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 的回应可能会做到这一点,或者至少我可以调整它来做到这一点。我必须测试才能看到,但想编辑以澄清并感谢您的帮助!
以下代码片段显示了如何忽略驱动器号的一种可能方法:
我不确定这种三分法是否如上述补充要求中所述定义良好。但是,这是我解决它的尝试(稍微更改了变量和文件名):
样本数据:
创建示例文件:
Import-Csv
如果您可以控制源文件的创建,则可以将以下内容简化为操作:定义了上述函数:
结果: