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 を実行して、元のスクリプトのバグを 1 つ修正しました。そのような他のヒントは素晴らしいでしょう。

ありがとう!

更新:ここにいくつかの詳細情報があります

$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 つの非常に便利な関数を作成できました。

  • 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 $_ }
于 2011-04-28T19:47:45.633 に答える
3

get-WMIObject を使用する場合は、おそらく Where-Object にパイプする代わりに -filter を使用する必要があります。フィルター パラメーターは、PowerShell の代わりに WQL 構文言語を使用するため、つまずかないようにしてください。

$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 に答える
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()

そして1行で:

(gwmi -comp WebSserver01 -namespace root\webadministration -class ApplicationPool | where {$_.Name -eq 'YourAppPool'}).recycle()
于 2016-03-20T23:13:31.247 に答える