通过power-shell检查AppPool状态并在远程机器上启动

Sam*_*ain 2 powershell powershell-4.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") 
}
Run Code Online (Sandbox Code Playgroud)

Jam*_* C. 5

您的代码存在多个问题,我已经逐一解决了这些问题,因此您可以了解是什么导致它无法正常工作。

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

$statusforeach循环之外进行检查- 因此它只评估$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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 很高兴我能提供帮助,如果您对我的回答感到满意,您可以[将其标记为已接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 (3认同)