代码之家  ›  专栏  ›  技术社区  ›  Evan Carroll

如何使用powershell回收iis应用程序池?

  •  21
  • Evan Carroll  · 技术社区  · 16 年前

    我还没有真正做过任何windows脚本,所以我对如何完成这项工作感到茫然。总之,基本上我们要做的是有一个脚本,它将接受一个参数,在哪个IIS应用程序池上循环使用。我在google上做过一些研究,但在让事情运转方面并没有太大的成功。

    以下是我现在正在尝试的:

    $appPoolName = $args[0]
    $appPool = get-wmiobject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPools" Where-Object {$_.Name -eq "W3SVC/APPPOOLS/$appPoolName"}
    $appPool.Recycle()
    

    我得到的错误是:

    Get-WmiObject : A parameter cannot be found that matches parameter name '$_.Name -eq "W3SVC/APPPOOLS/$appPoolName"'.
    

    不管怎样,如果我也知道如何调试这样的东西会很好。我已经通过执行gwmi-namespace“root\microsoftisv2”-list修复了原始脚本的一个错误。任何其他类似的建议都很好。

    谢谢!

    更新 :以下是更多信息

    $appPool = gwmi -namespace "root\MicrosoftIISv2" -class "IISApplicationPools" | Get-Member
    
    .   TypeName: System.Management.ManagementObject#root\MicrosoftIISv2\IIsApplicationPools
    
    Name                MemberType   Definition
    ----                ----------   ----------
    Caption             Property     System.String Caption {get;set;}
    Description         Property     System.String Description {get;set;}
    InstallDate         Property     System.String InstallDate {get;set;}
    Name                Property     System.String Name {get;set;}
    Status              Property     System.String Status {get;set;}
    __CLASS             Property     System.String __CLASS {get;set;}
    __DERIVATION        Property     System.String[] __DERIVATION {get;set;}
    __DYNASTY           Property     System.String __DYNASTY {get;set;}
    __GENUS             Property     System.Int32 __GENUS {get;set;}
    __NAMESPACE         Property     System.String __NAMESPACE {get;set;}
    __PATH              Property     System.String __PATH {get;set;}
    __PROPERTY_COUNT    Property     System.Int32 __PROPERTY_COUNT {get;set;}
    __RELPATH           Property     System.String __RELPATH {get;set;}
    __SERVER            Property     System.String __SERVER {get;set;}
    __SUPERCLASS        Property     System.String __SUPERCLASS {get;set;}
    ConvertFromDateTime ScriptMethod System.Object ConvertFromDateTime();
    ConvertToDateTime   ScriptMethod System.Object ConvertToDateTime();
    Delete              ScriptMethod System.Object Delete();
    GetType             ScriptMethod System.Object GetType();
    Put                 ScriptMethod System.Object Put();
    
    
    gwmi -namespace "root\MicrosoftIISv2" -class "IISApplicationPools"
    
    
    __GENUS          : 2
    __CLASS          : IIsApplicationPools
    __SUPERCLASS     : CIM_LogicalElement
    __DYNASTY        : CIM_ManagedSystemElement
    __RELPATH        : IIsApplicationPools.Name="W3SVC/AppPools"
    __PROPERTY_COUNT : 5
    __DERIVATION     : {CIM_LogicalElement, CIM_ManagedSystemElement}
    __SERVER         : IRON
    __NAMESPACE      : root\MicrosoftIISv2
    __PATH           : \\IRON\root\MicrosoftIISv2:IIsApplicationPools.Name="W3SVC/A
                       ppPools"
    Caption          :
    Description      :
    InstallDate      :
    Name             : W3SVC/AppPools
    Status           :
    
    7 回复  |  直到 6 年前
        1
  •  18
  •   Scott Saad    16 年前

    何处对象 是一个需要输入内容的筛选器。好像失踪了 之前 何处过滤器 .

    尝试:

    $appPoolName = $args[0]
    $appPool = get-wmiobject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" | Where-Object {$_.Name -eq "W3SVC/APPPOOLS/$appPoolName"}
    $appPool.Recycle()
    

    编辑 :我注意到wmi类是 应用池 ,正如你所看到的,当管道连接到 获取成员 . 这需要改成 应用池 (非复数)。有了这些改变,你就可以使用回收方法了。上面的代码已经更新。

        2
  •  6
  •   Aliostad    11 年前

    利用这个问题的数据,我可以创建两个非常有用的函数。

    • 获取应用程序池
    • 循环IIsAppPool

    代码:

    function Get-IisAppPools {
    
        Get-WmiObject -Namespace "root\MicrosoftIISv2" -Class "IIsApplicationPool" -Filter 'name like "W3SVC/APPPOOLS/%"' 
             | ForEach-Object { $_.Name.ToString().SubString(15) } 
    
    }
    
    function Recycle-IisAppPool([string]$appPoolName) { 
    
         Invoke-WmiMethod -Name Recycle -Namespace "root\MicrosoftIISv2" -Path "IIsApplicationPool.Name='W3SVC/APPPOOLS/$appPoolName'" 
    
    }
    

    你可以像这样使用这些函数

    Recycle-IisAppPool DefaultAppPool
    Get-IisAppPools | ? { $_ -match "v4.0$" } | % { Recycle-IisAppPool $_ }
    
        3
  •  3
  •   EdgeVB    16 年前

    使用get wmiobject时,可能应该使用-filter,而不是管道到where对象。filter参数使用wql语法语言而不是powershell语法语言,所以不要让它绊倒您。

    $appPoolName = $args[0]
    $appPool = get-wmiobject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPools" -filter 'name="W3SVC/APPPOOLS/$appPoolName"'
    

    已经说过,把管道放在那里应该可以工作,而且除非您已经知道wql,否则肯定会更容易使用。

        4
  •  2
  •   jwmiller5    16 年前

    这不是特定于powershell的答案,但iisapp.vbs将列出正在运行的应用程序池,并且有一个/r标志可回收特定的应用程序池。

        5
  •  0
  •   Thomas S. Trias    13 年前

    您还可以使用wql查询来获取所需的apppool;这具有在wmi端过滤结果的优点,这在从远程计算机获取对象时特别方便。

    (Get-WmiObject -Query "SELECT * FROM IIsApplicationPool WHERE Name = 'W3SVC/AppPools/$appPoolName'" -Namespace 'root\MicrosoftIISv2').Recycle()
    
        6
  •  0
  •   user4317867    9 年前

    对于iis 8.0,我发现我不得不使用 -namespace root\webadministration -class ApplicationPool

    例如,要使用powershell远程回收IIS 8中的应用程序池,请执行以下操作:

    一如既往,请首先通过列出应用程序池来测试这一点。只需移除 | where 第一次 ( 从命令:

    gwmi -comp WebServer01 -namespace root\webadministration -class ApplicationPool
    
    #Recycle app pool by name.
    (gwmi -comp WebServer01 -namespace root\webadministration -class ApplicationPool | `
    where {$_.Name -eq 'YourAppPool'}).recycle()
    

    在一条线上:

    (gwmi -comp WebSserver01 -namespace root\webadministration -class ApplicationPool | where {$_.Name -eq 'YourAppPool'}).recycle()
    
        7
  •  0
  •   mvanle    6 年前

    在powershell中:

    $pool = Get-IISAppPool -Name <name>
    
    $pool.recycle()