2016-03-04 2 views
1

У меня есть команда для извлечения информации из базы данных 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: Операция успешно завершена. Таким образом, каждую линию можно обрабатывать индивидуально

Возможно, это может быть выполнено с помощью массива?

Также безуспешными

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

Выход тот же:

UNAME=Administrator OK: Operation completed successfully. 
+0

пытались ли вы что-нибудь? У вас уже есть смысл идеи. Вы знакомы с циклами на PowerShell и конвейером? – Matt

+0

Я на самом деле пробовал много вещей: в то время как для foreach, но я не вижу, чтобы получить результат, который я хочу, поэтому я прошу о помощи. В конце концов мне нужно обработать каждую строку индивидуально в зависимости от данных. –

+0

Это потрясающе. Я ценю ваши усилия. Вы можете показать это здесь? – Matt

ответ

2

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

#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. 
+0

Здесь я использовал foreach-loop, потому что, похоже, я помню, что 'break' не останавливал конвейер в' Foreach-Object' (вам нужно было выкинуть 'PipelineStoppedException'), но в Win10, используя как PS5.0, так и PS2.0, он работает так, как должен с '1..10 | Foreach-object {if ($ _ -eq 5) {break}; $ _} '? Кто-нибудь знает, почему? –

+0

Спасибо Frode, это то, что я хочу на самом деле, но я получаю сообщение об ошибке: вы не можете вызвать метод на нулевом значении. В Z: \ CSP \ deploys \ aplicacional \ teste.ps1: 26 char: 24 + if ($ line.StartsWith <<<< ("OK:")) {break} + Категория: InvalidOperation: (Начало + FullyQualifiedErrorId: InvokeMethodOnNull. Швы вроде ничего не попадают в переменную $ line –

+0

check '$ output' содержит что-нибудь? –

Смежные вопросы