Shell - установить вывод команды в переменную и заменить - PullRequest
0 голосов
/ 11 октября 2018

Я разрабатываю скрипт 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 ]

0 голосов
/ 11 октября 2018

Для решения, которое работает со встроенными версиями 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]','')
}
0 голосов
/ 11 октября 2018

Таким образом, в вашем примере вы используете команды Shell, такие как 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

...