ScheduledTasks/Uninstall-ScheduledTask.ps1

# Copyright 2012 Aaron Jensen
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

function Uninstall-ScheduledTask
{
    <#
    .SYNOPSIS
    Uninstalls a scheduled task on the current computer.
 
    .DESCRIPTION
    The `Uninstall-ScheduledTask` function uses `schtasks.exe` to uninstall a scheduled task on the current computer. If the task doesn't exist, nothing happens.
 
    .LINK
    Get-ScheduledTask
 
    .LINK
    Test-ScheduledTask
 
    .LINK
    Install-ScheduledTask
 
    .EXAMPLE
    Uninstall-ScheduledTask -Name 'doc'
 
    Demonstrates how to delete a scheduled task named `doc`.
 
    .EXAMPLE
    Uninstall-ScheduledTask -Name 'doc' -Force
 
    Demonstrates how to delete a scheduled task that is currently running.
    #>

    [CmdletBinding(DefaultParameterSetName='AsBuiltinPrincipal')]
    param(
        [Parameter(Mandatory=$true)]
        [Alias('TaskName')]
        [string]
        # The name of the scheduled task to uninstall.
        $Name
    )

    Set-StrictMode -Version 'Latest'

    $Name = Join-Path -Path '\' -ChildPath $Name

    if( -not (Test-ScheduledTask -Name $Name) )
    {
        Write-Verbose ('Scheduled task ''{0}'' not found.' -f $Name)
        return
    }

    $errFile = Join-Path -Path $env:TEMP -ChildPath ('Carbon+Uninstall-ScheduledTask+{0}' -f ([IO.Path]::GetRandomFileName()))
    schtasks.exe /delete /tn $Name '/F' 2> $errFile | ForEach-Object { 
        if( $_ -match '\bERROR\b' )
        {
            Write-Error $_
        }
        elseif( $_ -match '\bWARNING\b' )
        {
            Write-Warning $_
        }
        else
        {
            Write-Verbose $_
        }
    }

    if( $LASTEXITCODE )
    {
        Write-Error ((Get-Content -Path $errFile) -join ([Environment]::NewLine))
    }
}