pazdel
pazdel

Reputation: 9

generating batch file to back up enabled/disabled state of Scheduled Tasks

From a batch file I am trying to:

  1. Capture the task name and enabled/disabled state of all scheduled tasks in Windows 10 x64

  2. Export these to a second batch file with TASKNAME and SCHEDULED_TASK_STATE populated in the following command for each task:

    schtasks /Change /TN "\TASKNAME" /SCHEDULED_TASK_STATE

The idea is for this second batch file to serve as a one-click backup/restore of the enabled/disabled state of all existing tasks. This way, the cumbersome process of selectively enabling/disabling tasks one-by-one via a GUI tool (e.g., Task Scheduler, Autoruns, taskschedulerview-x64, etc.) can be easily undone (or redone).

For the source batch file, the command

SCHTASKS /Query /FO LIST /v

... will retrieve a list of all tasks and the two values I am interested in -- 'TaskName' and 'Scheduled Task State.'

With info gleaned from other stackoverflow-ers, below is as far as I have gotten using a temp files approach, but it's only half done and I'm in way over my head :)

    echo

:: Get list and parameters of all tasks; find values for TaskName; save values to temp file 1

    SCHTASKS /Query /FO LIST /v| findstr /r /C:"TaskName: " >"%USERPROFILE%\Desktop\1-SCHTASKS_LIST_QUERY_NAMES.TXT"

:: Re-get list and parameters of all tasks; find values for Scheduled Task State; save values to temp file 2

    SCHTASKS /Query /FO LIST /v| findstr /r /C:"Scheduled Task State: " >"%USERPROFILE%\Desktop\2-SCHTASKS_LIST_QUERY_STATES.TXT"

:: Set delimiter/assign variable to TaskName values in temp file 1; populate schtasks/change command with value; (missing steps to get/populate task state); save to target batch file

    for /f "tokens=2 delims=: " %%n in (%USERPROFILE%\Desktop\1-SCHTASKS_LIST_QUERY_NAMES.TXT) do @echo schtasks /Change /TN "%%n">>"%USERPROFILE%\Desktop\BACKUPS\BACKEDUP_scheduled_tasks_state.bat"

    pause

Rather than the above, I would prefer if the source batch file:

  1. Executes the command SCHTASKS /Query /FO LIST /v

  2. Does all processing/parsing in-place, i.e., assign variables to the two values I need for each task - 'TaskName' and 'Scheduled Task State' -- without creating temp files, and

  3. Inserts these values to 'schtasks /Change' commands for all tasks and export to the target batch file.

Any help will be much appreciated.

Upvotes: 0

Views: 995

Answers (2)

pazdel
pazdel

Reputation: 9

In regards to @Stephan's answer below....

COMMENTS

The task 'Status' value (as used by Stephan) is a little different than 'Scheduled Task State.' In order to export the command 'schtasks /Change /TN' in the backup batch file I'm trying to create, I need the 'Scheduled Task State' at the end of the line.

The task state is only available with verbose results; as such I've changed line 4 of Stephan's code to be:

:: Added /v (verbose); changed tokens to "2" (for task name in CSV) and "12" (for task state in CSV)

for /f "tokens=2,12 delims=," %%a in ('schtasks /query /fo csv /v^|find "\"') do (

PENDING

I am still unsure of how to append Stephan's modified code in order to:

  1. Reference his variables to populate the command 'schtasks /Change /TN "\TASKNAME" /SCHEDULED_TASK_STATE,' and

  2. Export a batch file with this command for every scheduled task in the current system (as a backup/restore file). Example of how this exported batch file would look:

schtasks /Change /TN "GoogleUpdateTaskMachineUA" /DISABLE

schtasks /Change /TN "GoogleUpdateTaskMachineCore" /DISABLE

schtasks /Change /TN "DropboxUpdateTaskMachineCore" /DISABLE

schtasks /Change /TN "DropboxUpdateTaskMachineUA" /DISABLE  

schtasks /Change /TN "\Microsoft\Windows\Application Experience\ProgramDataUpdater" /DISABLE

...but including all tasks on the current system.

***** UPDATE *****

I've realized another issue: the command to get task states uses the language "Enabled" or "Disabled" (with "d" at the end); but the command to set a task's state needs the language "ENABLE" or "DISABLE" (neither with "d" at the end). So, the plot thickens: how to also delete the unnecessary end-of-value "d" when outputting to the target batch file?

Upvotes: 0

Stephan
Stephan

Reputation: 56188

As you need only taskname and status, you don't need /v (verbose)
schtasks will then output taskname, next run time and status.
Get a format of csv instead of list, so each task is on only one line (much easier to parse).
Use find to exclude the header lines.
use a for loop around to get the desired tokens (1=taskname, 3=status) and set them into variables.

@echo off
setlocal enabledelayedexpansion
set n=0
for /f "tokens=1,3 delims=," %%a in ('schtasks /query /fo csv^|find "\"') do (
  set /a n+=1
  set name[!n!]=%%~na
  set state[!n!]=%%~b
)
echo ----- %n% tasks found -----
rem set name
rem set state
set /a num=%random% %% %n% +1
echo example: !name[%num%]! has status of !state[%num%]!

delayed expansion is used, because variables (n) are changed and used within a code block.

Upvotes: 0

Related Questions