通过power-shell检查AppPool状态,然后在远程计算机上启动它

时间:2017-03-23 15:46:43

标签: powershell powershell-v4.0

要求是逐个提取服务器名称并检查AppPool状态,如果发现该状态已停止,请使其运行。下面的代码没有帮助。

$ErrorActionPreference = "Continue"
$status = gc -path "D:\Servers\server.txt"|ForEach-Object (invoke-command -ComputerName $_ -ScriptBlock {Import-Module Webadministration Get-WebAppPoolState -name (gc "D:\AppPool.txt")})

if ($status.value -eq "Started") 
{
    Write-Host ("ApppPool already running")
}
else 
{
    Invoke-Command -ScriptBlock {Start-WebAppPool}
    Write-host ("AppPool has started successfully") 
}

1 个答案:

答案 0 :(得分:2)

您的代码存在多个问题,我已经单独完成了这些问题,因此您可以看到阻止其正常工作的原因。

foreach的语法错误,在这种情况下您需要使用{}而不是()。普通括号仅用于ForEach ($number in $numArray ) {CODE}这个你不是。

您正在$status循环之外检查foreach - 所以它只评估$status一次(使用最终的计算机AppPool状态)而不是每台计算机。

您的第二个Invoke-Command没有指定ComputerName参数,因此仅在本地运行该命令而不是远程计算机,这意味着AppPool永远不会启动。

当您使用gc "D:\AppPool.txt"指定AppPool名称时,此文件必须出现在每个远程计算机上才能生效。我已将此更改为作为参数传递给命令,因此该文件只需要在运行该脚本的计算机上。

$Credentials = Get-Credential
$AppPools = Get-Content "D:\AppPool.txt"
$Servers = Get-Content -Path "D:\Servers\server.txt"

ForEach ($Server in $Servers) {
    ForEach ($AppPool in $AppPools) {
        $AppPoolState = Invoke-Command -ComputerName $Server -ScriptBlock {Import-Module WebAdministration; Get-WebAppPoolState -Name $args[0] } -ArgumentList $AppPool -Credential $Credentials

        if ($AppPoolState.Value -eq "Started") 
        {
            Write-Host "$AppPool AppPool already running on $Server"
        }
        else 
        {
            Invoke-Command -ComputerName $Server -ScriptBlock {Start-WebAppPool -Name $args[0] } -ArgumentList $AppPool -Credential $Credentials
            Write-Host "$AppPool AppPool started on $Server"
        }
    }
}

注意:我运行的是非特权帐户,因此必须提供凭据。如果您运行脚本的帐户具有对所有远程计算机的适当权限,则可以删除三个凭据引用。