Перебрать несколько строк, пока не будет достигнуто условие
У меня есть команда для получения информации из базы данных 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
}