【问题标题】:Loop through several lines until a condition is reached循环几行直到达到一个条件
【发布时间】:2016-06-18 09:23:27
【问题描述】:

我有一个使用 kpscript 从 keepass 数据库中检索信息的命令。 此命令可能检索 1 行,多行无,但最终,它总是返回此输出:

OK: Operation completed successfully.

如果 StartsWith("OK:") 使用 PowerShell 单独处理每一行并退出循环的最佳方法是什么: 示例:

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.

【问题讨论】:

  • 你有没有尝试过?你已经有了一个想法。您熟悉 PowerShell 和管道上的循环吗?
  • 其实我已经尝试了很多东西:while、for、foreach,但是我看不到我想要的结果,这就是我寻求帮助的原因。我最终需要的是根据数据单独处理每一行
  • 太棒了。我感谢你的努力。可以在这里展示一下吗?
  • 因为我做了这么多测试,但没有一个能正常工作,我不再有测试了,对不起...
  • 我会重新创建它们,没问题:)

标签: powershell keepass


【解决方案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 }
}

输出(使用样本输出):

UNAME=Administrator
UNAME=OK: Operation completed successfully.

【讨论】:

  • 我在这里使用了一个 foreach 循环,因为我似乎记得 break 并没有停止 Foreach-Object 中的管道(你需要抛出一个 PipelineStoppedException),但是在 Win10 中同时使用两者PS5.0 和 PS2.0 与1..10 | Foreach-object { if ($_ -eq 5) { break }; $_ } 的工作方式一样吗?有人知道为什么吗?
  • 谢谢Frode,这实际上是我想要的,但我收到一个错误:您不能在空值表达式上调用方法。在 Z:\CSP\deploys\aplicacional\teste.ps1:26 char:24 + if($line.StartsWith
  • 检查$output是否包含任何内容?
  • 我的错,它有效,谢谢。如果您可以帮助我解决另一个问题,如果 UNAME 可以有多个值,我想将它们全部放在一个数组中。我该怎么做?
  • 我正在为此提出一个新问题,因为它与原来的不同
【解决方案2】:

老话题,但也许它可以帮助某人,这就是我解决它的方法 使用参数 -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
} 

【讨论】:

    猜你喜欢
    • 2012-07-11
    • 2013-12-09
    • 2016-12-18
    • 2012-09-23
    • 2019-09-19
    • 2019-10-17
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多