【发布时间】:2020-09-05 19:26:33
【问题描述】:
如何直接比较Get-FileHash的输出和Properties.ContentMD5的输出?
我正在整理一个 PowerShell 脚本,该脚本从我的系统中获取一些本地文件并将它们复制到 Azure Blob 存储容器。
文件每天都在变化,所以我在上传之前添加了检查文件是否已经存在于容器中。
我使用Get-FileHash读取本地文件:
$LocalFileHash = (Get-FileHash "D:\file.zip" -Algorithm MD5).Hash
这导致$LocalFileHash 持有这个:67BF2B6A3E6657054B4B86E137A12382
我使用此代码获取已传输到容器的 blob 文件的校验和:
$BlobFile = "Path\To\file.zip"
$AZContext = New-AZStorageContext -StorageAccountName $StorageAccountName -SASToken "<token here>"
$RemoteBlobFile = Get-AzStorageBlob -Container $ContainerName -Context $AZContext -Blob $BlobFile -ErrorAction Ignore
if ($ExistingBlobFile) {
$cloudblob = [Microsoft.Azure.Storage.Blob.CloudBlockBlob]$RemoteBlobFile.ICloudBlob
$RemoteBlobHash = $cloudblob.Properties.ContentMD5
}
$RemoteBlobHash 的值设置为Z78raj5mVwVLS4bhN6Ejgg==
没问题,我想,我就解密Base64字符串比较一下:
$output = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($RemoteBlobHash))
这给了我g�+j>fWKK��7�#� 所以不能直接比较☹
This question 显示了一个类似泡菜的人,但考虑到他们本地 MD5 结果的格式,我认为他们没有使用Get-FileHash。
我尝试过的其他事情:
- 将
UTF8上方的 System.Text.Encoding 行更改为 UTF16 和 ASCII,这会更改输出,但不会更改为任何可识别的内容。 - 尝试使用 GetBytes 看看是否有帮助:
$output = [System.Text.Encoding]::UTF8.GetBytes([System.Text.Encoding]::UTF16.GetString([System.Convert]::FromBase64String($RemoteBlobHash)))
注意:使用 md5sum 比较本地文件和下载的 file.zip 副本会得到与 Get-FileHash 相同的 MD5 字符串:67BF2B6A3E6657054B4B86E137A12382
提前谢谢你!
【问题讨论】:
标签: powershell encoding hash md5 azure-blob-storage