循环几行直到达到条件

时间:2016-03-04 15:14:57

标签: powershell keepass

我有一个命令,可以使用kpscript从keepass数据库中检索信息。 此命令可以检索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.

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

旧话题,但也许对某人有帮助,这就是我解决的方式 使用参数-FailIfNoEntry -FailIfNotExists可以在字段为空或找不到条目时给您以E:***开头的行

$信息将包含一个包含有用信息的数组

$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
}