通过命令行回收IIS中的所有应用程序池

3

我有一个PowerShell脚本:

& $psexec $serveraddr -u $remoteuser -p $remotepass -accepteula C:\Windows\System32\inetsrv\appcmd.exe list apppool /xml | C:\Windows\System32\inetsrv\appcmd.exe recycle apppool /in

我正在使用这个脚本来回收所有的IIS池。问题是只有默认的IIS池被回收了,没有私人池被回收。第二个appcmd找不到它们。第一个appcmd可以找到所有由IIS和私人给出的池。

错误信息如下:

ERROR ( message: Can't find object APPPOOL with id "Core1". )

我不能回收私人池。有没有办法绕过这个问题?


1
第一个 appcmd 在远程计算机上由 psexec 调用,但第二个 appcmd 在本地计算机上调用。这是你想要的吗? - user4003407
不行 - 这就是问题。 - pbies
3个回答

4
这是一行代码,用于回收所有应用程序池:
& $env:windir\system32\inetsrv\appcmd list apppools /state:Started /xml | & $env:windir\system32\inetsrv\appcmd recycle apppools /in

这是一个远程服务器,您的答案不包括服务器的远程性。 - pbies

1

因此,命令的第二部分在本地执行。我已将脚本更改为通过单个命令循环每个池:

& $psexec $server -u $remoteuser -p $remotepass -accepteula C:\Windows\System32\inetsrv\appcmd.exe recycle apppool /apppool.name:Core1


0

这可能有点过于复杂了,但你可能会对一般的替代方法感兴趣,以便在多个服务器上并行执行某些操作:

$servers=@('server1', 'server2', 'server3')

$recycleAppPools = {
    echo $(Get-Wmiobject -Class Win32_ComputerSystem).Name
    appcmd list apppools /state:Started /xml | appcmd recycle apppools /in
    echo "`n"
}

workflow Perform-Deployment {
    Param ($servers, $actionBlock)

    # Run on all servers in parallel
    foreach -parallel ($server in $servers) {
        "Doing on $server..."
        # Execute script on the server
        InlineScript {
            $scriptBlock = [scriptblock]::Create($Using:actionBlock)
            Invoke-Command -computername $Using:server -ScriptBlock $scriptBlock
        }
    }
}

cls
# Execute workflow
Perform-Deployment $servers $recycleAppPools

此外,你可以向你的脚本块传递参数,比如说:
$DeployPythonPackage = {
    param($venv, $pythonPackagePath)
    & "$venv\scripts\pip" install --upgrade $pythonPackagePath
}

workflow Perform-Deployment {
    Param ($servers, $actionBlock, $venv, $pythonPackagePath)

    # Run on all servers in parallel
    foreach -parallel ($server in $servers) {
        "Deploying Python package '$pythonPackagePath' on $server..."
        # Execute script on the server
        InlineScript {
            $scriptBlock = [scriptblock]::Create($Using:actionBlock)
            Invoke-Command -computername $Using:server -ScriptBlock $scriptBlock `
                -ArgumentList $Using:venv, $Using:pythonPackagePath
        }
    }
}

cls
# Execute workflow
Perform-Deployment $servers $DeployPythonPackage $venv $pythonPackagePath

foreach '-parallel' 参数保留用于将来使用。- 7.2.1 - pbies
@pbies,那我一定是来自未来;)。实际上这些脚本是完美运行的代码块,执行 powershell -file scriptname.ps1即可。foreach-parallel是PowerShell工作流的一部分,自PowerShell 3.0以来就可用。例如,请查看PowerShell Workflows: The Basics - Sergey Nudnov
PowerShell 7.2.1 告诉我 -parallel 是保留的,但我没有在工作流中尝试过。PowerShell 5.1 - 明确告诉我需要在工作流中使用 -parallel。 - pbies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接