Извлечение второй строки вывода в командный файл - PullRequest
0 голосов
/ 04 апреля 2020

Мой пакетный файл производит вывод:

SHA1 hash of file E:/Test/test.zip:
b04f3ee8f5e43fa3b162981b50bb72fe1acabb33
CertUtil: -hashfile command completed successfully.

Я хочу использовать только: b04f3ee8f5e43fa3b162981b50bb72fe1acabb33. Можно ли извлечь вторую строку и сохранить ее в переменной.

Ответы [ 3 ]

1 голос
/ 04 апреля 2020

Передайте аргумент returnStdout: true на шаг bat для возврата вывода. Затем используйте String.readLines() или регулярное выражение, чтобы извлечь ha sh. Лично я бы использовал регулярное выражение, так как оно более устойчивое. Это дает вам простой способ определить, не соответствует ли выходная информация ожидаемому формату (например, когда инструмент изменяет выходные данные в будущем обновлении).

Вот пример кода для обоих способов:

pipeline{
    agent any

    stages {
        stage('test') {
            steps {
                script {
                    def output = bat( returnStdout: true, script: '''\
                        @echo SHA1 hash of file E:/Test/test.zip:
                        @echo b04f3ee8f5e43fa3b162981b50bb72fe1acabb33
                        @echo CertUtil: -hashfile command completed successfully.
                        ''').trim()

                    // Variant 1: extract 2nd line
                    def hash1 = output.readLines()[1]
                    echo "hash1: $hash1"

                    // Variant 2: use regular expression to extract the hash
                    def regex = /SHA1 hash of file .*:\s*([a-f0-9]{40})/
                    def match = ( output =~ regex )
                    if( match ) {
                        def hash2 = match[0][1]
                        echo "hash2: $hash2"
                    }
                    else {
                        error "Invalid CertUtil output"
                    }
                }
            }
        }
    }
}

Выход:

hash1: b04f3ee8f5e43fa3b162981b50bb72fe1acabb33
hash2: b04f3ee8f5e43fa3b162981b50bb72fe1acabb33
0 голосов
/ 05 апреля 2020

Исходя из предоставленного вами результата, единственная строка, которая вам нужна, не содержит символа :. Вы легко сможете исключить строки, которые показывают этот символ, пропустив команду certutil через find.exe с параметром /V.

@"%__AppDir__%certutil.exe" -HashFile "E:\Test\test.zip"|"%__AppDir__%find.exe" /V ":"

Чтобы установить его в переменную, вы можете добавьте эту команду к For /F l oop:

@For /F Delims^= %%G In ('""%__AppDir__%certutil.exe" -HashFile "E:\Test\test.zip"|"%__AppDir__%find.exe" /V ":""')Do @Set "SHA1=%%G"

В качестве примечания, насколько я понимаю, CertUtil может, в зависимости от версии, выводить результат SHA1 в виде двадцати пар, разделенных пространства. Если вы развертываете свой пакетный файл в системах, которые используют такой вывод, вы все равно можете получить вывод из 40 символов, используя For /F l oop:

@For /F "Tokens=1-20" %%G In ('""%__AppDir__%certutil.exe" -HashFile "E:\Test\test.zip"|"%__AppDir__%find.exe" /V ":""')Do @Set "SHA1=%%G%%H%%I%%J%%K%%L%%M%%N%%O%%P%%Q%%R%%S%%T%%U%%V%%W%%X%%Y%%Z"
0 голосов
/ 04 апреля 2020

Не проверено:

for /f "skip=1 tokens=* delims=" %%# in ('my command') do (
  set "second_line=%%#"
  goto :break
)
:break
echo %second_line%

Но вам придется изменить выражение в скобках с вашей командой, которую вы не дали. Имейте в виду, что это пропустит пустые строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...