Powershell循环迭代计数
脚本的目的是捕获Elasticsearch的错误登录,并提供重试输入密码的机会。这个想法是通过在Powershell循环迭代计数,powershell,loops,iteration,Powershell,Loops,Iteration,脚本的目的是捕获Elasticsearch的错误登录,并提供重试输入密码的机会。这个想法是通过在$result=Invoke RestMethod$uri-Credential$Credential步骤之后添加i++来计算循环迭代次数,但结果是-ErrorAction SilentlyContinue过程被忽略,如果它位于try{}部分,那么我将循环计数移到了最后的{$i++/code>部分,但是缺点是最后一次尝试5没有通过条件而($i-lt 6)因为它是最后{$i++}部分中的5+1 $ela
$result=Invoke RestMethod$uri-Credential$Credential
步骤之后添加i++
来计算循环迭代次数,但结果是-ErrorAction SilentlyContinue
过程被忽略,如果它位于try{}
部分,那么我将循环计数移到了最后的{$i++/code>部分,但是缺点是最后一次尝试5
没有通过条件而($i-lt 6)
因为它是最后{$i++}
部分中的5+1
$elasticsearch_pass = Read-Host "Enter ELASTICSEARCH password"
$uri = "https://${elasticsearch_ip}:9200"
$user = "static_user"
$i = 1
while ($i -lt 6) {
try {
Write-Host -ForegroundColor Cyan `n ("Trying to connect to elasticsearch. Attempt $i")
$secpasswd = ConvertTo-SecureString $elasticsearch_pass -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)
$result = Invoke-RestMethod $uri -Credential $credential
if ($result.tagline -eq 'You Know, for Search') {
Write-Host -ForegroundColor Green `n ("Connection to elasticsearch {0} established..." -f $elasticsearch_ip)
break
}
}
catch {
Write-Host -ForegroundColor Red $_
if ("$_" -eq "Unauthorized") {
$elasticsearch_pass = Read-Host `n "Wrong elasticsearch password! Pls enter correct one"
}
}
finally {$i++}
}
设置静态循环迭代计数并执行最后一次尝试的最佳方法是什么?为什么使用,而如果需要迭代变量,通常的解决方案是传统的:
$uri = "https://${elasticsearch_ip}:9200"
$user = "static_user"
$i = 1
$maxTry = 5
For( $i = 1; $i -le $maxTry; ++$i )
{
try {
Write-Host -ForegroundColor Cyan `n ("Trying to connect to elasticsearch. Attempt $i of $maxtry ")
$secpasswd = ConvertTo-SecureString $elasticsearch_pass -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)
$result = Invoke-RestMethod $uri -Credential $credential
if ($result.tagline -eq 'You Know, for Search') {
Write-Host -ForegroundColor Green `n ("Connection to elasticsearch {0} established..." -f $elasticsearch_ip)
break
}
}
Catch {
Write-Host -ForegroundColor Red $_.Exception.Message
if ($_.Exception.Message -match "Unauthorized") {
}
}
}
在这两种情况下,我不认为您需要在finally块中执行+++$I,您可以在catch中执行并继续。然而,for循环允许您在每次迭代的正确点进行操作,而不会产生混乱
还添加了$maxTry,提供了更好的回音
因为这是交互式的,所以我更改了一些catch块,使其回声更清晰一些
还将读取主机移动到循环中。并且稍微改变了语言。尽管有两种方法可以做到这一点……循环似乎是我的合理选择。问题是,$elasticsearch\u pass在Catch
部分给出,执行在try
部分,这是下一次迭代,所以无论在时使用还是For
,最后一次尝试不起作用。我不明白,但再次阅读你的问题。。。For循环将获得正确的迭代,只需5次尝试。如果要调用WebRequest触发捕获,可能需要使用-ErrorAction Stop
。这会将非终止错误转化为终止,从而触发捕获。否则,您可以像以前那样将结果分配给变量,然后手动检查它。让我知道这是否有帮助。-ErrorAction
过程被忽略,如果它找到了try
部分,并且在问题的开头描述了它。由于某些原因,您错过了$elasticsearch\u pass=Read Host`n“错误的elasticsearch密码!请在您的示例中输入一个正确的”
过程。在catch
部分中,我添加$I-le 4
检查解决我的问题的方法,(“$”匹配“未经授权”-和$I-le 4){