The web is littered with different ways to restart IIS application pools.  Unfortunately, no one method that I’ve found works consistently across both IIS 6 and II7.  In this simple snippet, you can see the simple function I crafted that works across both current versions of IIS.

function Restart-IISAppPool {
    param(
        $PoolName
    )
    
    if (Test-Path c:\Windows\system32\inetsrv\appcmd.exe) {
        Write-Host "Restarting AppPool on IIS7..."
        c:\windows\system32\inetsrv\appcmd stop apppool /apppool.name:$PoolName
        c:\windows\system32\inetsrv\appcmd start apppool /apppool.name:$PoolName
    }
    else {
        Write-Host "Restarting AppPool on IIS6..."
        $appPool = get-wmiobject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" | Where-Object {$_.Name -eq "W3SVC/APPPOOLS/$PoolName"}
        $appPool.Recycle()
    }
}

You can use the function like so:

Restart-IISAppPool "MyAppPool"

Enjoy!