Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell循环迭代计数_Powershell_Loops_Iteration - Fatal编程技术网

Powershell循环迭代计数

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

脚本的目的是捕获Elasticsearch的错误登录,并提供重试输入密码的机会。这个想法是通过在
$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){