Перебрать несколько строк, пока не будет достигнуто условие

У меня есть команда для получения информации из базы данных keepass, используя kpscript. Эта команда может получить 1 строку, несколько строк ни на одной, но, в конце концов, она всегда возвращает этот вывод:

OK: Operation completed successfully.

Каков наилучший способ обрабатывать каждую строку отдельно с помощью PowerShell и выходить из цикла, если StartsWith("OK:"): Пример:

KPScript -c:GetEntryString $PASSHOME\$PASSFILE -pw:$PASS -Field:UserName $SEARCH

Administrator
OK: Operation completed successfully.

Следующие подходы я попытался безуспешно

$UNAME = KPScript -c:GetEntryString $PASSHOME\$PASSFILE -pw:$PASS -Field:UserName $SEARCH 
IF(! $UNAME){ 
    write-host "UNAME1=$UNAME" 
    write-host "ERROR UNAME" -foreground "red" 
    exit 
}

а также

while (! $UNAME) { KPScript -c:GetEntryString $PASSHOME\$PASSFILE -pw:$PASS -Field:UserName $SEARCH }

Также неудачно

    $UNAME=KPScript -c:GetEntryString $PASSHOME\$PASSFILE -pw:$PASS -Field:UserName $SEARCH
    write-host "UNAME=$UNAME"

Результат:

    UNAME=Administrator OK: Operation completed successfully.

Суть в том, чтобы: UNAME= администратор UNAME=OK: операция успешно завершена. Таким образом, каждая линия может рассматриваться индивидуально

Может быть, это будет достигнуто с массивом?

Также неудачно

    $UNAME=@(KPScript -c:GetEntryString $PASSHOME\$PASSFILE -pw:$PASS -Field:UserName $SEARCH)
    write-host "UNAME=$UNAME"

Выход такой же:

    UNAME=Administrator OK: Operation completed successfully.

1 ответ

Решение

Это то, что вы пытаетесь сделать?

#Sample of kpscript output
#$output = "Administrator","OK: Operation completed successfully.","Should have stopped already"

$output = KPScript -c:GetEntryString $PASSHOME\$PASSFILE -pw:$PASS -Field:UserName $SEARCH

foreach ($line in $output) {
    $UNAME = $line
    Write-Host "UNAME=$UNAME"
    if($line.StartsWith("OK:")) { break }
}

Ouptut (используя выборку-вывод):

UNAME=Administrator
UNAME=OK: Operation completed successfully.

Старая тема, но, возможно, это кому-то поможет, вот как я ее решил. Используйте параметры -FailIfNoEntry -FailIfNotExists, это даст вам строку, начинающуюся с E: *** сообщение, когда поле пустое или запись не найдена

$information будет содержать массив с полезной информацией

$RawEntiries = & $kpscript -c:GetEntryString $PathKeepass -pw:$pscred.GetNetworkCredential().password -Field:$Field -ref-Title:"$title" -FailIfNoEntry -FailIfNotExists

If ($RawEntiries -notlike "E:*")
{
    $information = $RawEntiries[0..($RawEntiries.IndexOf("OK: Operation completed successfully.")-1)]
    $Information
} 
Другие вопросы по тегам