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]','')
}