Shell - установить вывод команды в переменную и заменить

Я занимаюсь разработкой сценария PowerShell для расчета контрольной суммы zip-файлов. Я должен выполнить это как в W7, так и в W10. Я заметил, что команда certUtil возвращает строки, такие как A2 5B 8A... в W7, но в 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 ответа

Таким образом, в вашем примере вы используете Команды оболочки, такие как For, Echo, Set, а затем смешиваете команды powershell, такие как $

Вы должны использовать все PowerShell, так как вы сказали, что работали над сценарием PowerShell.

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

Это получает все zip-файлы в Test in, а затем с помощью Get-Filehash мы затем используем алгоритм Sha512. Верните путь к файлу и хэш.

Это потребует как минимум Powershell 4.0

Для решения, которое работает со встроенными версиями powershell на 7 и 10 (версии 2 и 5 соответственно), я бы придерживался 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]','')
}
Другие вопросы по тегам