# encoding: ascii
# api: powershell
# title: Restart-IISAppPool
# description: Restarts local or remote IIS AppPools
# version: 0.1
# type: function
# author: Joel Bennett
# license: CC0
# function: Restart-IISAppPool
# x-poshcode-id: 2466
# x-archived: 2017-05-22T01:58:25
# x-published: 2011-01-18T11:34:00
#
#
function Restart-IISAppPool {
   [CmdletBinding(SupportsShouldProcess=$true)]
   #.Synopsis
   #  Restarts an IIS AppPool
   #.Parameter ComputerName
   #  The name of an IIS web server where the AppPool resides
   #.Parameter AppPool
   #  The name of the AppPool to recycle (if you include wildcards, results in an initial call to list all app pools)
   #.Parameter Credential
   #  Credentials to connect to the IIS Server
   #.Example
   #  Restart-IISAppPool "Classic .NET AppPool" -Cn WebServer1
   #
   #  Description
   #  -----------
   #  Restart the "Classic .NET AppPool" on WebServer1
   #.Example
   #  Restart-IISAppPool *Classic* -Confirm
   #
   #  Description
   #  -----------
   #  Restart all of the app pools with "Classic" in the name on the local IIS server, prompting for each one
   param(
      [Parameter(ValueFromPipelineByPropertyName=$true, Mandatory= $true, Position=0)]
      [Alias("Name","Pool")]
      [String[]]$AppPool
   ,
      [Parameter(ValueFromPipelineByPropertyName=$true, Position=1)]
      [Alias("CN","Server","__Server")]
      [String]$ComputerName
   ,
      [Parameter()]
      [System.Management.Automation.Credential()]
      $Credential = [System.Management.Automation.PSCredential]::Empty
   )
   
   begin {
      if ($Credential -and ($Credential -ne [System.Management.Automation.PSCredential]::Empty)) {
         $Credential = $Credential.GetNetworkCredential()
      }
      Write-Debug ("BEGIN:`n{0}" -f ($PSBoundParameters | Out-String))

      $Skip = $false
      ## Need to test for AppPool existence (it's not defined in BEGIN if it's piped in)
      if($PSBoundParameters.ContainsKey("AppPool") -and $AppPool -match "\*") {
        $null = $PSBoundParameters.Remove("AppPool")
        $null = $PSBoundParameters.Remove("WhatIf")
        $null = $PSBoundParameters.Remove("Confirm")
        Write-Verbose "Searching for AppPools matching: $($AppPool -join ', ')"

        Get-WmiObject IISApplicationPool -Namespace root\MicrosoftIISv2 -Authentication PacketPrivacy @PSBoundParameters | 
        Where-Object { @(foreach($pool in $AppPool){ $_.Name -like $Pool -or $_.Name -like "W3SVC/APPPOOLS/$Pool" }) -contains $true } |
        Restart-IISAppPool
        $Skip = $true
      }
      $ProcessNone = $ProcessAll = $false;
   }
   process {
      Write-Debug ("PROCESS:`n{0}" -f ($PSBoundParameters | Out-String))
   
      if(!$Skip) {
        $null = $PSBoundParameters.Remove("AppPool")
        $null = $PSBoundParameters.Remove("WhatIf")
        $null = $PSBoundParameters.Remove("Confirm")
         foreach($pool in $AppPool) {
            Write-Verbose "Processing $Pool"
            if($PSCmdlet.ShouldProcess("Would restart the AppPool '$Pool' on the '$(if($ComputerName){$ComputerName}else{'local'})' server.", "Restart ${Pool}?", "Restarting IIS App Pools on $ComputerName")) {
               Write-Verbose "Restarting $Pool"
               # if($PSCmdlet.ShouldContinue("Do you want to restart $Pool?", "Restarting IIS App Pools on $ComputerName", [ref]$ProcessAll, [ref]$ProcessNone)) {
                 Invoke-WMIMethod Recycle -Path "IISApplicationPool.Name='$Pool'" -Namespace root\MicrosoftIISv2 -Authentication PacketPrivacy @PSBoundParameters
               # }
            }
         }
      }
   }
}
