【问题标题】:Recycle all apps pools in IIS by command line通过命令行回收 IIS 中的所有应用程序池
【发布时间】:2015-12-23 11:18:25
【问题描述】:

我有一个 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 和私有给定的所有池。

错误是:

错误(消息:Nie można odnaleźć obiektu APPPOOL o identyfikatorze "Core1"。)

来自波兰语:

错误(消息:找不到 ID 为“Core1”的对象 APPPOOL。)

我无法回收私人泳池。有没有办法绕过这个?

【问题讨论】:

  • 第一个appcmd 在远程计算机上由psexec 调用,但第二个appcmd 在本地计算机上调用。这就是你想要的吗?
  • 不——这是问题所在。

标签: powershell iis appcmd


【解决方案1】:

这是一个回收所有应用程序池的单行:

& $env:windir\system32\inetsrv\appcmd list apppools /state:Started /xml | & $env:windir\system32\inetsrv\appcmd recycle apppools /in

【讨论】:

  • 这是一个远程服务器,您的回答不包括服务器的远程性。
【解决方案2】:

所以命令的第二部分在本地执行。我已将脚本更改为通过单个命令回收每个池:

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

【讨论】:

    【解决方案3】:

    这对您的问题来说有点矫枉过正,但您可能对在多台服务器上并行执行某些操作的通用替代方法感兴趣:

    $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
    

    【讨论】:

    • The foreach '-parallel' parameter is reserved for future use. - 7.2.1
    • @pbies,所以我一定来自未来;)。事实上,这些都是完美运行的脚本块,执行powershell -file scriptname.ps1foreach -parallel 是自 PowerShell 3.0 起可用的 PowerShell 工作流的一部分。看那里,例如PowerShell Workflows: The Basics
    • PowerShell 7.2.1 告诉 -parallel 是保留的,但我没有在工作流中尝试过。 PowerShell 5.1 - 确切地告诉我需要在工作流中使用 -parallel。
    猜你喜欢
    • 2014-04-24
    • 2011-09-20
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2011-03-10
    • 1970-01-01
    • 2013-10-02
    相关资源
    最近更新 更多