我根本没有真正完成任何Windows脚本,所以我对如何解决这个问题感到茫然。无论如何,基本上我们想要做的是有一个脚本,它将对哪个IIS AppPool进行回收。我已经对谷歌进行了一些研究,并且在开展工作方面没有取得多大成功。
以下是我现在正在尝试的内容:
$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 :
答案 0 :(得分:18)
Where-Object 是一个过滤器,需要输入内容。在过滤器之前,似乎缺少管道。
尝试:
$appPoolName = $args[0]
$appPool = get-wmiobject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" | Where-Object {$_.Name -eq "W3SVC/APPPOOLS/$appPoolName"}
$appPool.Recycle()
编辑:我注意到WMI类是 IISApplicationPools ,正如您所见,当管道传输到 Get-Member <时,没有向我们展示回收方法/ strong>即可。这需要更改为 IISApplicationPool (非复数)。通过该更改,您可以使用Recycle方法。上面的代码已更新。
答案 1 :(得分:6)
使用这个问题的数据,我能够创建2个非常有用的功能。
代码:
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 $_ }
答案 2 :(得分: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,否则肯定会更容易使用。
答案 3 :(得分:2)
这不是特定于Powershell的答案,但iisapp.vbs将列出正在运行的应用程序池,并且有一个/ r标志来回收特定的应用程序池。
答案 4 :(得分:0)
您还可以使用WQL查询来获取所需的AppPool;这样做的好处是可以在WMI端过滤结果,这在从远程计算机获取对象时尤其方便。
(Get-WmiObject -Query "SELECT * FROM IIsApplicationPool WHERE Name = 'W3SVC/AppPools/$appPoolName'" -Namespace 'root\MicrosoftIISv2').Recycle()
答案 5 :(得分: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()
答案 6 :(得分:0)
在Powershell中:
$pool = Get-IISAppPool -Name <name>
$pool.recycle()