【问题标题】:how to run a command x number of times inside a while loop - powershell如何在while循环中运行命令x次 - powershell
【发布时间】:2021-12-09 03:52:53
【问题描述】:

所以在这里我有一部分代码,我试图弄清楚如何在 while 循环中运行命令 x 次并结束脚本。

$timer = New-TimeSpan -Minutes 120

$sw = [diagnostics.stopwatch]::StartNew()
while ($sw.elapsed -lt $timer) {  
    $ReleaseStatus = Invoke-RestMethod -Uri "https://vsrm.dev.azure.com/company/Project/_apis/release/releases/$RId/environments/$EId/?`api-version=6.0" -Method GET -Headers $Header -Verbose
    start-sleep -seconds 10
    #if release is successful return message and end script. 
    if ($ReleaseStatus.Status -eq 'Succeeded') {
        write-host "Release Succeeded"
        return
    }
        
    #if the release fails run the command x number of times. 
    if ($ReleaseStatus.status -eq 'Rejected') {
        Write-Host "Release failed, Re-running release for you"
        #input command here to run release x number of times and then end whole script.
    }
}

我尝试了各种方法,但没有成功,有人知道我该怎么做吗?

【问题讨论】:

  • 您确定Invoke-RestMethod 返回一个具有Status 属性的对象吗?
  • 是的,我已经对其进行了彻底的测试,它返回了状态属性,因此我在我的“if”语句中使用了该表达式。

标签: powershell azure-devops scripting


【解决方案1】:

使用变量来记录重试次数:

$timer = New-TimeSpan -Minutes 120

# configure number of attempts - this will run up to 5 times (initial attempt + 4 retries)
$retries = 5

$sw = [diagnostics.stopwatch]::StartNew()
while ($sw.elapsed -lt $timer -and $retries -gt 0) {
    $ReleaseStatus = Invoke-RestMethod -Uri "https://vsrm.dev.azure.com/company/Project/_apis/release/releases/$RId/environments/$EId/?`api-version=6.0" -Method GET -Headers $Header -Verbose
    start-sleep -seconds 10

    #if release is successful return message and end script. 
    if ($ReleaseStatus.Status -eq 'Succeeded') {
        write-host "Release Succeeded"
        return
    }
    

    # release didn't succeed, decrement retry counter
    $retries--

    if($retries -ge 1){
        Write-Host "Release failed, Re-running release for you"
    }
    else {
        Write-Host "Release failed, but no more retries for you"
    }
}

现在while() 条件仅在以下情况下继续: 1)我们还没有超时,并且 2)我们还有重试 - 如果不再满足任何一个条件,它将停止

【讨论】:

  • 这太棒了,是的,这对我有用,但我做的方式略有不同。感谢您帮助 Mathias!
【解决方案2】:

好的,这就是我的做法。请阅读哈希注释。

#Check the status of release every y seconds 

$timer = New-TimeSpan -Minutes 120
#set the value of I to 0 outside of the while loop.
$i = 0
$sw = [diagnostics.stopwatch]::StartNew()
while ($sw.elapsed -lt $timer) {  
    $ReleaseStatus  = Invoke-RestMethod -Uri "https://vsrm.dev.azure.com/$Organisation/$Project/_apis/release/releases/$RId/environments/$EId/?`api-version=6.0" -Method GET -Headers $Header -Verbose
    start-sleep -seconds 10
    
    if ($ReleaseStatus.Status -eq 'Succeeded') {
        write-host "Release Succeeded"
        return
    }
    if ($ReleaseStatus.status -eq 'Rejected') {
        Write-Host "Release failed, Re-running release for you"

        $Uri = "https://vsrm.dev.azure.com/$Organisation/$Project/_apis/Release/releases/$RId/environments/$EId/?api-version=6.0-preview.6"
         #we've put the value of retries into a variable to be parametrised. If I is greater than number of retries then return(cancel operation)
        if ($i -gt $NumberOfRetryAttempts) {
            return
        }

        Invoke-RestMethod -uri $uri -Method PATCH -Headers $Header -Body $body2 
        #you put the I variable inside the while loop and you increment by 1 each time the condition comes back false.
        $i++ 
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 2014-12-18
    • 2014-11-03
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多