21

我根本没有真正编写过任何 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           :
4

7 回答 7

18

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时,它没有向我们显示 Recycle 方法。这需要更改为IISApplicationPool(非复数)。通过该更改,您可以使用 Recycle 方法。上面的代码已经更新。

于 2008-10-13T19:35:05.770 回答
6

使用来自这个问题的数据,我能够创建 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 $_ }
于 2011-04-28T19:47:45.633 回答
3

使用 get-WMIObject 时,您可能应该使用 -filter 而不是通过管道连接到 Where-Object。filter 参数使用 WQL 语法语言而不是 PowerShell 的,所以不要让它绊倒你。

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

话虽如此,将管道放在那里应该可以工作,并且肯定会使其更容易使用,除非您已经了解 WQL。

于 2008-10-13T20:37:53.507 回答
2

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

于 2008-10-30T19:49:01.937 回答
1

您还可以使用 WQL 查询来获取您想要的 AppPool;这具有在 WMI 端过滤结果的优点,这在从远程机器获取对象时特别方便。

(Get-WmiObject -Query "SELECT * FROM IIsApplicationPool WHERE Name = 'W3SVC/AppPools/$appPoolName'" -Namespace 'root\MicrosoftIISv2').Recycle()
于 2011-07-06T17:27:44.240 回答
1

在 Powershell 中:

$pool = Get-IISAppPool -Name <name>

$pool.recycle()
于 2018-10-18T02:12:48.807 回答
0

使用 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()
于 2016-03-20T23:13:31.247 回答