Are you trying to manage Scheduled Tasks with PowerShell?
This guide is for you.
Most of us use the taskschd.msc graphical interface console to create and manage scheduled tasks on Windows.
However, in various scripts and automated flows, it is much more convenient to use the PowerShell features to create scheduled tasks.
Scheduled tasks that perform simple actions are quick to make and comfortable enough to repeat using the Task Scheduler app interface (GUI). But, system admins or developers may need to deploy more complicated tasks with multiple schedules, triggers, or arguments.
Here at Ibmi Media, as part of our Server Management Services, we regularly help our Customers to perform related Windows queries.
In this context, we shall look into Scheduling Tasks with PowerShell.
How to Manage Scheduled Tasks on Windows via PowerShell ?
The ScheduledTasks PowerShell module is to manage scheduled tasks on Windows 10/Windows Server 2016.
To list the cmdlets in a module, we can run:
Get-Command -Module ScheduledTasks
1. How to Create Scheduled Task with Windows PowerShell ?
In modern versions of PowerShell, to create them we can use the New-ScheduledTaskTrigger and Register-ScheduledTask cmdlets.
Suppose, we need to create a scheduled task to run at a specific time and execute some PowerShell script or command.
For instance, a scheduled task named StartupScript1 should run the PowerShell script file C:\PS\StartupScript.ps1 at 11:00 AM every day.
The task will execute with elevated privileges (checkbox “Run with highest privileges”) under the SYSTEM account:
$Trigger= New-ScheduledTaskTrigger -At 11:00am -Daily
$User= "NT AUTHORITY\SYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:\PS\StartupScript1.ps1"
Register-ScheduledTask -TaskName "StartupScript1" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force
A successful task creation will give us the status “Ready” appears. Now, it will run on the schedule.
If we enable PowerShell Execution Policy on our computer, we can run a PowerShell script from a scheduled task with the –Bypass parameter.
We need to use the below code while creating a new task:
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument “-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File C:\PS\StartupScript.ps1"
For the task to run every time during the computer startup, the first command has to be:
$Trigger= New-ScheduledTaskTrigger -AtStartup
If we want to run a task when a user logs on:
$Trigger= New-ScheduledTaskTrigger -AtLogon
Make sure to open the taskschd.msc console to check a new scheduler task in the Task Scheduler Library.
In Powershell 2.0, to create a scheduled task from PowerShell, we can use the Schedule.Service COM interface.
Here, we create a scheduled task that will execute the specific file containing the PowerShell script during startup. The task performs with the NT AUTHORITY\SYSTEM privileges:
$TaskName = "NewPsTask"
$TaskDescription = "Running PowerShell script from Task Scheduler"
$TaskCommand = "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe"
$TaskScript = "C:\PS\StartupScript.ps1"
$TaskArg = "-WindowStyle Hidden -NonInteractive -Executionpolicy unrestricted -file $TaskScript"
$TaskStartTime = [datetime]::Now.AddMinutes(1)
$service = new-object -ComObject("Schedule.Service")
$rootFolder = $service.GetFolder("\")
$TaskDefinition = $service.NewTask(0)
$TaskDefinition.RegistrationInfo.Description = "$TaskDescription"
$TaskDefinition.Settings.Enabled = $true
$TaskDefinition.Settings.AllowDemandStart = $true
$triggers = $TaskDefinition.Triggers
$trigger = $triggers.Create(8)
2. How to View and Run Scheduled Tasks with PowerShell ?
We can list all active scheduled tasks on Windows with the command:
Get-ScheduledTask -TaskPath | ? state -ne Disabled
To get information about a specific task:
Get-ScheduledTask CheckServiceState| Get-ScheduledTaskInfo
LastRunTime : 4/7/2021 10:00:00 AM
LastTaskResult : 267011
NextRunTime : 4/8/2021 10:00:00 AM
NumberOfMissedRuns : 0
TaskName : CheckServiceState
TaskPath : \
We can disable this task via:
Get-ScheduledTask CheckServiceState | Disable-ScheduledTask
On the other hand, to enable a task:
Get-ScheduledTask CheckServiceState | Enable-ScheduledTask
To run the task immediately (without waiting for the schedule), we run:
Then to completely remove a task from the Task Scheduler library:
Unregister-ScheduledTask -TaskName CheckServiceState
If we need to change the username from which the task launch and for example, the compatibility mode, use the Set-ScheduledTask cmdlet:
$task_user = New-ScheduledTaskPrincipal -UserId woshub\j.abrams' -RunLevel Highest
$task_settings = New-ScheduledTaskSettingsSet -Compatibility 'Win8'
Set-ScheduledTask -TaskName CheckServiceState_PS -Principal $task_user -Settings $task_settings
However, if we receive the error:
Set-ScheduledTask: No mapping between account names and security IDs was done
Make sure the username is correct.
3. How to Export and Import Scheduled Tasks via XML Files ?
With PowerShell we can export the current settings of any scheduled task into a text XML file. Hence, we can export the parameters of any task and deploy it to other computers.
We can export it both from the Task Scheduler GUI and from the PowerShell console.
To export the task with the name StartupScript to the file StartupScript.xml, we run:
Export-ScheduledTask StartupScript | out-file c:\tmp\StartupScript.xml
Since the Export-ScheduledTask cmdlet is not available in PowerShell 2.0, we use the built-in tool schtasks to export the task settings and redirect the result into a text file:
schtasks /query /tn "NewPsTask" /xml >> "c:\tmp\NewPsTask.xml"
Once the tasks export to the XML file, we can import it to any network computer using the GUI, SchTasks.exe or PowerShell.
Register-ScheduledTask cmdlet can help us to import task settings from an XML file and register it:
Register-ScheduledTask -Xml (Get-Content “\\mun-fs01\public\NewPsTask.xml” | out-string) -TaskName "NewPsTask"
In PowerShell 2.0, it is easier to import a task using the schtasks tool:
schtasks /create /tn "NewPsTask" /xml "\\Srv1\public\NewPsTask.xml" /ru corp\skrutapal /rp Pa$$w0rd
schtasks /Run /TN "NewPsTask"
Take note that this example uses the credentials of the account that is used to run the task.
If it doesn't specify the credentials, because they are not stored in the job, they will request when importing.