Change a property of a task in task scheduler using powershell - powershell

I have two triggers in a task. The first one runs at a specific time. The second one starts at logon and runs every 10 minutes. I have many similar tasks like this situation. I want to use powershell to change the property from 10 minutes to 5 minutes and run indefinitely after logon. How do I specify the SECOND trigger?
$Task = Get-ScheduledTask -TaskName "Task"
$Task.Triggers.LogonTriggers.Repetition.Duration = ""
$Task.Triggers.Repetition.Interval = "PT10M"

You can modify the $Task object and pass it into the Set-ScheduledTask which will apply the changes you've made. The first trigger that runs at a specific time will have it's StartBoundary property set, the second trigger which starts at Logon won't have this property set so we'll use the value of that to make sure we change the correct trigger.
$Task = Get-ScheduledTask -TaskName "Task"
$RepeatingTrigger = $Task.Triggers | Where-Object { $_.StartBoundary -eq $null }
$RepeatingTrigger.Repetition.Interval = "PT5M"
Set-ScheduledTask -InputObject $Task

Related

Specify location with Task Scheduler script

I'm trying to write a PowerShell script that will activate another script on a daily basis. What I have is:
$Sta = New-ScheduledTaskAction -Execute "powershell.exe" -argument "C:\Users\UserName\Desktop\Script.ps1"
$Stt = New-ScheduledTaskTrigger -Daily -At 3am
Register-ScheduledTask Task1 -Action $Sta -Trigger $Stt
It's not working because it can't find the file. PowerShell's default directory is the user's root directory, so I don't know if that's it, even though I've tried using the full path to the file? Or is it due to where the scheduled task is running from? Location says \ and I cannot seem to change that, even in the task scheduler app. I've been Googling for days and I can't figure it out. Anyone have any idea? I'm working on Windows 10 Pro.
Soufflegirl13,
Updated & Tested:
$TaskSet = New-ScheduledTaskSettingsSet -Compatibility Win8
$TaskSet.DisallowStartIfOnBatteries = $True
$TaskSet.StopIfGoingOnBatteries = $True
$TaskSet.IdleSettings.StopOnIdleEnd = $false
#Adjust the following two lines to meet your requirements
$TaskDesc = "Retrieve the status of HyperV"
$TaskName = "Task1 - or whatever you want here"
$Stt = New-ScheduledTaskTrigger -Daily -At 3am
#Adjust the -file parameter to point to your script
$TAArgs = #{Execute = '"' + "c:\windows\system32\windowspowershell" +
"\v1.0\powershell.exe" + '"' ;
Argument = "-file `"G:\BEKDocs\Scripts\Misc\Get-HyperVStatus-V-3.ps1`"" }
$TaskAction = New-ScheduledTaskAction #TAArgs
$RSTArgs = #{Action = $TaskAction
TaskName = "$TaskName"
Trigger = $Stt
User = "$env:USERDOMAIN\$env:username"
RunLevel = "Highest"
Description = "$TaskDesc"
Settings = $TaskSet}
Register-ScheduledTask #RSTargs
I've found that forcing the quote marks around the powershell filespec solved some problems. You might want to try it around the script name if the previous doesn't work.
Of course adjust any settings as you see fit to meet your requirements. Also I've not used this basic code to set a trigger before but I adjusted it to do so according to the documentation for Register-ScheduledTask so it should work.
Update Notes:
I checked the documentation for the New-ScheduledTaskSettingsSet cmdlet and it doesn't include Win10 as a valid value for Compatibility, go figure, so I backed it off to Win8. You can also just not use the Compatibility argument and accept whatever it defaults to.
The code is now fully tested, sorry I forgot to tell you to replace the $TaskName variable with a value or to add the variable, as is now shown in the adjusted code.
HTH

How to configure "If the task is already running, then the following rule applies" in Windows Task Scheduler using PowerShell script?

I am trying to achieve the following settings (select "If the task is already running, then the following rule applies") through PowerShell script but unable to get appropriate settings to configure that.
I am using the following code to configure that
$Trigger = New-ScheduledTaskTrigger -At 07:00am -Daily
$Settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Hour 1) -Compatibility Win7 -StartWhenAvailable -Priority 7
$User = "SYSTEM"
$Action = New-ScheduledTaskAction -Execute "some script" -Argument "some argument" -WorkingDirectory "working dir"
Register-ScheduledTask -TaskName "Test Task" -Trigger $Trigger -User $User -Action $Action -Settings $Settings -RunLevel Highest –Force
To do the advanced configuration for the triggers
$Task = Get-ScheduledTask -TaskName "Example Task"
$Task.Triggers[0].ExecutionTimeLimit = "PT10M"
$Task | Set-ScheduledTask -User $User
The setting is configured via New-ScheduledTaskSettingsSet and the parameter you're looking for is -MultipleInstances:
-MultipleInstances
Specifies the policy that defines how Task Scheduler handles multiple instances of the task. The acceptable values for this parameter are:
IgnoreNew. The new task instance is ignored. Parallel. The new task instance starts immediately. Queue. The new task instance starts as soon as the current instance completes.
Type: MultipleInstancesEnum
Accepted values: Parallel, Queue, IgnoreNew
Position: Named
Default value: None
However, the documentation lists only 3 values, and the respective enum (at least at the time of this writing also only has the listed 3 values:
Parallel → Run a new instance in parallel
Queue → Queue a new instance
IgnoreNew → Do not start a new instance
If you create a task manually via the GUI and select the setting "Stop the existing instance" the value .Settings.MultipleInstances is empty, but if you create a Settings object via New-ScheduledTaskSettingsSet omitting the parameter -MultipleInstances it defaults to IgnoreNew. Attempts to change that to an empty value result in validation errors.
This is obviously a bug (missing value in the referenced enum).
The enum now contains 'StopExisting'.
This is my solution in C#.
static void RegisterMyTask(string taskPath, string remoteServer)
{
try
{
using TaskService ts = new(remoteServer);
TaskDefinition taskDef = ts.NewTask();
taskDef.Settings.MultipleInstances = TaskInstancesPolicy.StopExisting;
...
However PowerShell probably has the new enum as well. As I would guess:
-MultipleInstances StopExisting
I had a task scheduled on multiple remote servers.
On day 1 it started running.
Day 2 it failed to start a new instance, but didn't kill the existing instance
Day 3 it failed to start a new instance, but didn't kill the existing instance. Then 30 seconds later, the existing instance was killed by the day 1 timeout setting, but the new instance had already failed for the day.
This fixed my problem.

How to Get Friendly Description For Scheduled Task Trigger in Powershell

Following https://stackoverflow.com/a/32732879/1378356, I can get a scheduled task's trigger using this syntax:
$task = Get-ScheduledTask -TaskName "SomeTaskName"
$taskTrigger = $task.Triggers[0]
$taskTrigger
But how do I see the friendly name (which is displayed in the Task Scheduler UI), such as "At 8:00 am every Monday"?

How to edit a scheduled task trigger

$taskExists = Get-ScheduledTask $strTaskName
if($taskExists) {
$taskExists.Description = "a daily Report"
$taskExists | set-scheduledtask -user $strUser -Password $strPassword
}
The above piece of power shell code is to update existing schedule task. Could anyone please tell me how to update the trigger values?
The task returned from the Get-ScheduledTask cmdlet has a Triggers property where you can add / remove triggers.

Powershell - Monthly Scheduled Task Trigger

I'm currently automating the creation of scheduled tasks via Powershell, and I'm using the New-ScheduledTaskAction, New-ScheduledTaskTrigger, and Register-ScheduledTask commands. Now, I have a few jobs that need to run under the following conditions :
Run once every Friday
Run once on the 1st of every month
Run once on the 10th day of every month
While the technet documentation for the New-ScheduledTaskTrigger command specifies a Daily and Weekly time span parameter, I do not see one for Monthly, which is critical for defining the run times above.
In the few years I've been using Powershell, I can't think of an instance where I could do something via the standard UI interface, that I couldn't accomplish using one of the available commands.
Is this just flat out not available here, or am I missing something?
UPDATE #1
I just stumbled upon this SuperUser question, which does look promising, but references PSV3 instead of PSV4 - going to give it a shot and report back.
As I said in the original post, the SuperUser question above looked promising, but ultimately did not work with PSV4, and the example given in the post was basically a copy\paste job with almost no context.
I realized I could leverage Schtasks.exe from my Powershell script to handle the monthly aggregations, and it's fairly easy to set up, albeit somewhat tedious :
# set the trigger depending on time, span, and day
$runSpan = $task.SpanToRun;
if ($runSpan.Equals("Daily"))
{
$trigger = New-ScheduledTaskTrigger -Daily -At $task.TimeToRun
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $task.TaskName -User $Username -Password $Password -Description $task.Description
}
if ($runSpan.Equals("Weekly"))
{
$trigger = New-ScheduledTaskTrigger -Weekly -At $task.TimeToRun -DaysOfWeek $task.DayToRun
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $task.TaskName -User $Username -Password $Password -Description $task.Description
}
# script out SchTasks magic to create the monthly tasks
if ($runSpan.Equals("Monthly"))
{
$taskParams = #("/Create",
"/TN", $task.TaskName,
"/SC", "monthly",
"/D", $task.DayToRun,
"/ST", $task.TimeToRun,
"/TR", $filePath,
"/F", #force
"/RU", $Username,
"/RP", $Password);
# supply the command arguments and execute
#schtasks.exe $taskParams
schtasks.exe #taskParams
}
I'm using an in-script class to keep track of all the task properties ($task.TimeToRun, $task.DayToRun, etc.), iterating over a list of those, applying the Powershell implementation for daily and weekly tasks, then switching to SchTasks.exe for the monthly spans.
One thing I want to note, is that at first glance, I thought setting the user context under which the task runs could be achieved with the U and P arguments, but that is not the case. That specifies the creds that Schtasks.exe runs under - in order to set the user context for the task, you must use RU and RP.
In addition to the link above, these two were also very helpful :
http://coding.pstodulka.com/2015/08/02/programmatically-scheduling-powershell-scripts-in-task-scheduler/
https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx