2008-10-13 67 views
21

我還沒有真正完成任何Windows腳本,所以我在如何拉這一關的損失。無論如何,基本上我們想要做的就是創建一個腳本,它將對哪個IIS AppPool進行回收。我對Google進行了一些研究,並沒有取得任何成功。如何使用Powershell回收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   : 
+1

只是快速樣式注意..而不是使用的$ args獲取應用程序池的名稱,你可以聲明一個有名的參數。 PowerShell腳本將採用命名參數並首先按名稱和位置填充它們。您也可以指定參數的類型。 例如: (param [string] $ AppPoolName) – 2008-10-13 22:48:03

+0

好奇,如果你得到這個與我的答案中提出的更新的WMI類名稱建議? – 2008-10-15 00:13:59

回答

18

位置對象是希望的東西作爲輸入的過濾器。似乎有一個管道之前,其中過濾器

嘗試:

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

編輯:我注意到WMI類是IISApplicationPools,當其通過管道輸送到獲取會員如你所看到的,並沒有表現出我們的回收方法。這需要更改爲IISA應用池(非複數)。通過這種更改,您可以使用回收方法。上面的代碼已更新。

+0

它告訴我我有一個空值表達式。任何想法如何我可以找出對象的屬性? – 2008-10-13 19:46:42

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工作。

2

這不是Powershell特定的答案,但iisapp.vbs將列出正在運行的應用程序池,並且有一個/ r標誌來回收特定的應用程序池。

6

使用這個問題的數據,我能夠創建2個非常有用的功能。

  • GET-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 $_ } 
0

您也可以使用WQL查詢來獲取AppPoo你想要的;這具有在WMI端過濾結果的優點,這在從遠程機器獲取對象時特別方便。

(Get-WmiObject -Query "SELECT * FROM IIsApplicationPool WHERE Name = 'W3SVC/AppPools/$appPoolName'" -Namespace 'root\MicrosoftIISv2').Recycle() 
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()