我有一个命令,可以使用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.
答案 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
}