【问题标题】:Pause on failure, retry input from CSV失败时暂停,从 CSV 重试输入
【发布时间】:2016-02-01 16:01:12
【问题描述】:

我有 2 段 PowerShell 代码在失败时退出脚本。在考虑之后,我意识到暂停失败并让管理员有时间进行补救会更有意义......然后当任何键暂停时,重试 CSV 中的同一行。这是它现在的样子:

#check tools status first
Write-Host ""
Write-Host "Checking VMware Tools Status before proceeding." -foreground green
Write-Host ""
foreach ($item in $vmlist) {
    $vmname = $item.vmname
    $ToolsStatus = (Get-VM $vmname).extensiondata.Guest.ToolsStatus -eq "toolsNotRunning"
    if ($ToolsStatus -eq $true) {
        Write-Host ""
        Write-Host "Tools is not installed or running on $vmname. Remediate on guest and restart the script" -foreground Yellow
        Write-Host "Script will continue to exit until tools is running on $vmname" -foreground yellow
        Write-Host ""
        exit
    } else {
        Write-Host ""
        Write-Host "Tools running on all VMs, script will continue" -foreground green
        Write-Host ""
    }
}

我知道如何在$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown') 中设置暂停,但我不知道要执行循环,所以它会重试。

我在其他地方使用了类似的代码来验证虚拟机是否已启动,因此这将在两个部分都有效。

编辑:这是重新编写的脚本。这行得通吗?

foreach ($item in $vmlist) {
    $vmname = $item.vmname
    do {
        $ToolsStatus = (Get-VM $vmname).extensiondata.Guest.ToolsStatus -eq "toolsNotRunning"
        if ($ToolsStatus) {
            Write-Host ""
            Write-Host "Tools is not installed or running on $vmname." -Foreground yellow
            Write-Host "Remediate VMware tools on $vmname and"
            Write-host "Press any key to retry..."
            $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
        }
    } until ($ToolsStatus -eq "PoweredOn")
    Write-Host "Tools running on $vmname, script will continue" -Foreground green
}

【问题讨论】:

    标签: powershell powercli


    【解决方案1】:

    像这样添加一个嵌套的do..while 循环:

    foreach ($item in $vmlist) {
        $vmname = $item.vmname
        do {
            $ToolsMissing = (Get-VM $vmname).extensiondata.Guest.ToolsStatus -eq "toolsNotRunning"
            if ($ToolsMissing) {
                Write-Host "Tools is not installed or ..." -Foreground yellow
                $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
            }
        } while ($ToolsMissing)
    }
    
    Write-Host "Tools running on all VMs, script will continue" -Foreground green
    

    【讨论】:

    • 是否会从 csv 重试同一行(例如 $vmname)?
    • 另外,我可以把它作为一个暂停来做吗?
    • 基本上一直到 ($ToolsStatus -eq 'PoweredOn')?
    • 当然。不过,将 Start-Sleep -Milliseconds 200 添加到循环中,这样它就不会消耗所有 CPU 资源。
    • 是的,循环将重复相同的$item,直到它停止返回“toolsNotRunning”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多