# 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: 2465
# x-archived: 2016-08-26T03:17:29
# x-published: 2011-01-18T11:25:00
#
#
function Restart-IISAppPool {
   [CmdletBinding(SupportsShouldProcess=$true)]
   #.Synopsis
   #  Restarts an IIS AppPool
   #.Parameter ComputerName
   #  The name of a web server to restart the AppPool on
   #.Parameter Pool
   #  The name of the AppPool to recycle (if you include wildcards, results in an initial call to list all app pools)
   param(
      [Parameter(ValueFromPipelineByPropertyName=$true)]
      [Alias("CN","Server","__Server")]
      [String]$ComputerName
   ,
      [Parameter(ValueFromPipelineByPropertyName=$true, Mandatory= $true)]
      [Alias("Name","Pool")]
      [String[]]$AppPool
   ,
      [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")

        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 "Restarting $Pool"
            if($PSCmdlet.ShouldProcess("Would restart the AppPool '$Pool' on the '$(if($ComputerName){$ComputerName}else{'local'})' server.", "Restart $AppPool?", "Restarting IIS App Pools on $ComputerName")) {
               # 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
               # }
            }
         }
      }
   }

}
