如何使用 Powershell 回收 IIS AppPool?
Posted
技术标签:
【中文标题】如何使用 Powershell 回收 IIS AppPool?【英文标题】:How do I recycle an IIS AppPool with Powershell? 【发布时间】:2010-09-16 22:49:45 【问题描述】:我还没有真正编写过任何 Windows 脚本,所以我不知道如何完成这个脚本。无论如何,基本上我们想要做的是有一个脚本,它将接受一个关于哪个 IIS AppPool 回收的参数。我对 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\MicrosoftIISv2" -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 :
【问题讨论】:
只是一个快速的样式说明.. 而不是使用 $args 来获取应用程序池名称,您可以声明一个命名参数。 PowerShell 脚本将采用命名参数并首先按名称填充它们,然后按位置填充它们。您还可以指定参数的类型。示例:(param [string]$AppPoolName) 想知道我的回答中提出的更新后的 WMI 类名称建议是否符合此要求? 【参考方案1】:Where-Object 是一个过滤器,它期望输入中的某些内容。 where 过滤器之前似乎缺少一个管道。
试试:
$appPoolName = $args[0]
$appPool = get-wmiobject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" | Where-Object $_.Name -eq "W3SVC/APPPOOLS/$appPoolName"
$appPool.Recycle()
编辑:我注意到 WMI 类是 IISApplicationPools,正如您所见,当通过管道传送到 Get-Member。这需要更改为 IISApplicationPool(非复数)。通过该更改,您可以使用 Recycle 方法。以上代码已更新。
【讨论】:
它告诉我我有一个空值表达式。知道如何找出对象的属性吗? 是的。尝试将 Get-WmiObject 的结果通过管道传输到 Get-Member。这将向您显示传入对象的属性/方法。 另外,尝试取出 Where-Object 部分以查看返回的完整结果列表。【参考方案2】:使用这个问题的数据,我能够创建 2 个非常有用的函数。
获取 IisAppPools 回收-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】:使用 get-WMIObject 时,您可能应该使用 -filter 而不是通过管道连接到 Where-Object。过滤器参数使用 WQL 语法语言而不是 PowerShell,所以不要让你绊倒。
$appPoolName = $args[0]
$appPool = get-wmiobject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPools" -filter 'name="W3SVC/APPPOOLS/$appPoolName"'
话虽如此,将管道放在那里应该可以工作,而且除非您已经了解 WQL,否则肯定会更容易使用。
【讨论】:
【参考方案4】:这不是特定于 Powershell 的答案,但 iisapp.vbs 将列出正在运行的应用程序池,并且有一个 /r 标志来回收特定的应用程序池。
【讨论】:
【参考方案5】:您也可以使用 WQL 查询来获取您想要的 AppPool;这具有在 WMI 端过滤结果的优点,这在从远程机器获取对象时特别方便。
(Get-WmiObject -Query "SELECT * FROM IIsApplicationPool WHERE Name = 'W3SVC/AppPools/$appPoolName'" -Namespace 'root\MicrosoftIISv2').Recycle()
【讨论】:
【参考方案6】:在 Powershell 中:
$pool = Get-IISAppPool -Name <name>
$pool.recycle()
【讨论】:
【参考方案7】:对于 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()
【讨论】:
以上是关于如何使用 Powershell 回收 IIS AppPool?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PowerShell 在 IIS 中停止和启动各个网站?
如何使用 powershell 设置 IIS 的表单身份验证(system.web/authentication)的 overrideMode?
如何通过 windows powershell 命令在 IIS 网站中设置 ID 属性