Shell-将命令输出设置为变量并替换

时间:2018-10-11 14:13:18

标签: shell certutil

我正在开发一个PowerShell脚本来计算zip文件的校验和。我必须在W7和W10中都执行它。我注意到certUtil commmand在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.
)

您知道如何删除它们吗?

2 个答案:

答案 0 :(得分:2)

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

之类的powershell命令。

由于您说过正在使用Powershell脚本,因此应该使用所有Powershell。

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

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

这将需要至少Powershell 4.0

答案 1 :(得分: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]','')
}