0

我正在开发一个用于计算 zip 文件校验和的 PowerShell 脚本。我必须在 W7 和 W10 中执行它。我注意到 certUtil 命令在 W7 中返回 A2 5B 8A... 之类的字符串,但在 W10 中它返回相同的字符串但没有空格。所以我决定删除空格以统一它,将输出设置为变量,然后删除空格......但它不起作用。

for /f  "delims=" %%f in ('dir %~dp0*.zip /b') do (
    echo %%~f:
    $result = certUtil -hashfile "%~dp0%%~f" SHA512 | find /i /v "SHA512" | 
        find /i /v "certUtil"
    $result = $result -replace '\s', ''
    echo %result%
    set /a counter += 1
    echo.
)

你知道如何删除它们吗?

4

2 回答 2

2

因此,在您的示例中,您似乎使用了 For、Echo、Set 等 Shell 命令,然后您混合了诸如 $ 之类的 powershell 命令

您应该使用所有 powershell,因为您说您正在使用 powershell 脚本。

Get-ChildItem "C:\TEST" -Include *.zip -File -Recurse | %{
    Get-FileHash $_ -Algorithm SHA512 | select Path, Hash
}

这将获取测试中的所有 zip 文件,然后使用 Get-Filehash,然后我们使用 Sha512 算法。返回文件和哈希的路径。

这将需要至少 Powershell 4.0

于 2018-10-11T15:07:54.040 回答
0

对于适用于 7 和 10(分别为版本 2 和 5)的内置 powershell 版本的解决方案,我会坚持使用certutil.

输出的第二行certutil -hashfile包含哈希,所以像这样抓取它:

Get-ChildItem -Filter *.zip -Recurse |ForEach-Object {
    # call certutil, grab second line of output (index 1)
    $hashString = @(certutil -hashfile """$($_.FullName)""" SHA512)[1]
    # remove any non-word characters from the output:
    [regex]::Replace($hashString,'[\W]','')
}
于 2018-10-11T15:18:11.150 回答