使用powershell脚本唤醒Web服务器?

Ste*_*e B 2 powershell

我正在构建一个执行 http 请求的脚本,以便“唤醒”一些 asp.net 应用程序。

以下脚本正在运行,但是是同步的:

function WakeUp([string] $url)
{
    Write-Host "Waking up $url ..." -NoNewLine
    $client = new-object system.net.WebClient
    $client.UseDefaultCredentials = $true
    $null = $client.OpenRead($url)
    $client.Dispose()
    Write-Host " Ok"

}
# Run your code that needs to be elevated here
@(
    "http://app1/",
    "http://app2/",
    "http://app3/"
 ) | % { WakeUp $_ }
Run Code Online (Sandbox Code Playgroud)

我想改进此脚本以避免唤醒目标站点。实际上,调用 toOpenRead在返回之前等待答案。

我尝试使用OpenReadAsync,但是在Dispose实际发出请求并且目标应用程序未唤醒之前调用发生。

我有哪些选择?

[编辑]应用 Andy Arismendi 的建议,我的脚本现在是:

$WakeUp = {
    Param ([string] $url)
    try 
    {
        Write-Output "Waking up $url ..."
        $client = new-object system.net.WebClient
        $client.UseDefaultCredentials = $true
        $null = $client.OpenRead($url)
        $client.Dispose()
        Write-Output "$url Ok"
    } catch {
        Write-Error $_
        throw $_
    }
}

$jobs = @()
# Run your code that needs to be elevated here
@(
    "http://app1/",
    "http://app2/",
    "http://app3/"
 ) | % { 
    $jobs += Start-Job -ScriptBlock $WakeUp -ArgumentList $_ 
    }

Receive-Job -Job $jobs -Keep
Wait-Job -Job $jobs
Run Code Online (Sandbox Code Playgroud)

这似乎按预期工作,但我失去了写入主机。任何想法 ?

And*_*ndi 5

后台作业可以使您的工作流异步。

看看我的答案从另一个问题,就看你怎么可以从后台作业接收数据并检测其失败。

更新

这解决了您的版本中有关未接收输出的问题。您想使用Wait-JobbeforeReceive-Job以允许它们完成,因为它们是异步运行的。

$WakeUp = {
    param ([string] $url)
    try {
        Write-Output "Waking up $url ..."
        Start-Sleep -Seconds 3
        if ($url -eq "http://app2/") {
            throw ($url + " failed")
        }
        Write-Output "$url Ok"
    } catch {
        throw $_
    }
}

$jobs = @()
# Run your code that needs to be elevated here
@(
    "http://app1/",
    "http://app2/",
    "http://app3/"
 ) | % { 
    $jobs += Start-Job -ScriptBlock $WakeUp -ArgumentList $_ 
}

Wait-Job -Job $jobs | Out-Null
Receive-Job -Job $jobs -Keep
Run Code Online (Sandbox Code Playgroud)