bdill icon

GetSchedTasks.ps1

bdill | PRO | 07/05/21 02:27:55 AM UTC | 0 ⭐ | 1718 👁️ | Never ⏰ | []
PowerShell |

5.31 KB

|

None

|

0 👍

/

0 👎

# Desc: Lists all scheduled tasks and important properties
# Auth: Brian Dill 2021-07-03
# URL:  https://github.com/wbdill/PowerShell-sandbox01/blob/master/GetSchedTasks.ps1
# Inspiration:  https://stackoverflow.com/questions/32731366/how-to-get-trigger-details-associated-with-a-task-in-task-scheduler-from-powersh
# Dependencies: https://dbatools.io/   # Install-Module -Name dbatools  # (must run Powershell as admin to install module)
 
Clear-Host
#------------------------------------------------------------------------------------------
# Config vars
#------------------------------------------------------------------------------------------
$TaskNameLike   = "*"              # "*" to get all tasks.     "Foo*" to get tasks that start with "Foo"
$TaskFolders    = "\", "\Bar\"   # String array of folders.  "\" = tasks in root folder.  "\Bar\" = all tasks in Bar folder
$SaveToCsv      = 1                # 1 to save, 0 to n\ot save
$CsvSaveFolder  = "C:\Tasks\"      # Where you want to save the CSV output
 
$TasksResult = @()                 # var to hold results
#------------------------------------------------------------------------------------------
Function BinaryWeekdaysToString {
    param([int]$DaysOfWeek) 
    
    [string]$output = ""
    If ($DaysOfWeek -eq -1) { 
        $output = "No Trigger"
        Return $output;    
    }
    $WeekdaysBits7 = ([convert]::ToString([int32]$DaysOfWeek,2)).PadLeft(7, "0")
    If ($WeekdaysBits7.Substring(0,1) -eq "1") { $output += 'Su,' }
    If ($WeekdaysBits7.Substring(1,1) -eq "1") { $output += 'M,' }
    If ($WeekdaysBits7.Substring(2,1) -eq "1") { $output += 'Tu,' }
    If ($WeekdaysBits7.Substring(3,1) -eq "1") { $output += 'W,' }
    If ($WeekdaysBits7.Substring(4,1) -eq "1") { $output += 'Th,' }
    If ($WeekdaysBits7.Substring(5,1) -eq "1") { $output += 'F,' }
    If ($WeekdaysBits7.Substring(6,1) -eq "1") { $output += 'Sa,' }
    Return $output.TrimEnd(",")
}
#------------------------------------------------------------------------------------------
$TaskFolders | ForEach-Object {
    $TaskFolder= $_
    Get-ScheduledTask -TaskPath $TaskFolder | 
        Where-Object { $_.TaskName-like $TaskNameLike } | ForEach-Object {
 
        $Task = $_
        Write-Host $Task.TaskName
        Try {
            [string]$Name          = $Task.TaskName
            [string]$Author        = $Task.Author
            [string]$Description   = $Task.Description
            [bool]$Enabled         = $Task.Settings.Enabled
            [string]$Action        = $Task.Actions | Select -ExpandProperty Execute
            [string]$Arguments     = $Task.Actions | Select -ExpandProperty Arguments
            [string]$TaskPath      = $Task.TaskPath
 
            # Init vars in case no trigger
            [datetime]$Start       = (Get-Date -Month 1 -Day 1 -Year 1900 -Hour 0 -Minute 0 -Second 0) # bogus 1900-01-01 date
            [string]$StartTime     = ""
            [string]$Repetition    = "No Trigger"
            [string]$Duration      = "No Trigger"
            [string]$TriggerDays   = "No Trigger"
            [int]$DaysOfWeek       = -1  # -1 to indicate no trigger
 
            Try {
                # If the task has a triger, overwrite the trigger vars with valid values
                $Start         = $Task.Triggers | Select -ExpandProperty StartBoundary
                $StartTime     = $Start.ToString("hh:mm")
                $DaysOfWeek    = $Task.Triggers | Select -Expandproperty DaysOfWeek       #$Task.Triggers[0].DaysOfWeek 
                $Repetition    = $Task.Triggers.Repetition | Select -ExpandProperty Interval
                $Duration      = $Task.triggers.Repetition | Select -ExpandProperty Duration
                $TriggerDays   = $Task.Triggers | Select -ExpandProperty DaysInterval  #$Task.Triggers[0].DaysInterval
            } Catch {
                Write-Host "--- INFO: No Trigger found for $Name"
            }
            
            $splat = @{
                'TaskPath'    = $TaskPath
                'Name'        = $Name
                'Author'      = $Author
                'Description' = $Description
                'Action'      = $Action
                'Arguments'   = $Arguments
                'Start'       = $Start
                'StartTime'   = $StartTime
                'Duration'    = $Duration
                'Repetition'  = $Repetition
                'DaysOfWeek'  = BinaryWeekdaysToString $DaysOfWeek
                'TriggerDays' = If ($TriggerDays -eq 1) { "Daily" } else { $TriggerDays }
                'Enabled'     = If ($Enabled) { "Enabled" } Else { "-" }
            }
 
            $obj = New-Object -TypeName PSObject -property $splat
            $TasksResult += $obj
        }
        Catch {
            Write-Host "ERROR: $Error"
        }
    }
}
#------------------------------------------------------------------------------------------
# Output
 
# select specific columns
$TasksResult = $TasksResult | Select-Object TaskPath, Name, Enabled, DaysOfWeek, TriggerDays, StartTime, Repetition, Duration, Action, Arguments, Description, Author, Start | 
    Sort-Object TaskPath, Name
$TasksResult | Out-GridView
 
If ($SaveToCsv) {
    $SaveFullPath = [System.IO.Path]::Combine($CsvSaveFolder, "SchedTasks.csv")
    $TasksResult | Export-Csv $SaveFullPath -NoTypeInformation
}
 

Comments