【问题标题】:generating batch file to back up enabled/disabled state of Scheduled Tasks生成批处理文件以备份计划任务的启用/禁用状态
【发布时间】:2017-05-05 05:17:30
【问题描述】:

我正在尝试从批处理文件中:

  1. 捕获 Windows 10 x64 中所有计划任务的任务名称和启用/禁用状态

  2. 将这些导出到第二个批处理文件,并在每个任务的以下命令中填充 TASKNAMESCHEDULED_TASK_STATE

    schtasks /Change /TN "\TASKNAME" /SCHEDULED_TASK_STATE

这个想法是让第二个批处理文件用作所有现有任务的启用/禁用状态的一键备份/恢复。这样,通过 GUI 工具(例如,任务计划程序、自动运行、taskschedulerview-x64 等)选择性地启用/禁用任务的繁琐过程可以轻松撤消(或重做)。

对于源批处理文件,命令

SCHTASKS /Query /FO LIST /v

... 将检索所有任务的列表以及我感兴趣的两个值——“TaskName”和“Scheduled Task State”。

根据从其他 stackoverflow-ers 收集的信息,以下是我使用临时文件方法所获得的信息,但它只完成了一半,我在我的头上:)

    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

而不是上面的,我更喜欢源批处理文件:

  1. 执行命令SCHTASKS /Query /FO LIST /v

  2. 是否所有处理/解析就地,即,将变量分配给每个任务所需的两个值 - 'TaskName' 和 'Scheduled Task State' - 而不创建临时文件,并且

  3. 将这些值插入到所有任务的 'schtasks /Change' 命令中并导出到目标批处理文件。

任何帮助将不胜感激。

【问题讨论】:

    标签: powershell batch-file cmd scheduled-tasks backup


    【解决方案1】:

    由于您只需要任务名称和状态,因此您不需要/v(详细)
    schtasks 将输出任务名称、下一次运行时间和状态。
    获取csv 的格式而不是list,因此每个任务只在一行上(更容易解析)。
    使用 find 排除标题行。
    使用for 循环来获取所需的令牌(1=taskname,3=status)并将它们设置为变量。

    @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,因为变量 (n) 已更改在代码块中使用。

    【讨论】:

    • 感谢 Stephan 的努力和解释。我会回复以提供更多详细信息。
    【解决方案2】:

    关于@Stephan 下面的回答......

    评论

    任务“状态”值(由 Stephan 使用)与“计划任务状态”略有不同。为了在我尝试创建的备份批处理文件中导出命令“schtasks /Change /TN”,我需要在行尾的“计划任务状态”。

    任务状态仅适用于详细结果;因此,我将 Stephan 代码的第 4 行更改为:

    :: 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 (
    

    待处理

    我仍然不确定如何附加 Stephan 修改后的代码,以便:

    1. 引用他的变量来填充命令 'schtasks /Change /TN "\TASKNAME" /SCHEDULED_TASK_STATE,' 和

    2. 使用此命令为当前系统中的每个计划任务导出一个批处理文件(作为备份/恢复文件)。此导出的批处理文件的外观示例:

    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
    

    ...但包括当前系统上的所有任务。

    ***** 更新 *****

    我意识到另一个问题:获取任务状态的命令使用语言“启用”或“禁用”(末尾带有“d”);但是设置任务状态的命令需要语言“ENABLE”或“DISABLE”(末尾都没有“d”)。所以,情节变厚了:如何在输出到目标批处理文件时也删除不必要的结束值“d”?

    【讨论】:

    • 变得更糟:1) schtasks 使用本地语言。在我的系统上,它是“Aktiviert”和“Deaktiviert”。 2) 一些任务名称包含逗号和引号,所以tokens=12 不可靠!。您应该将powershell 标签添加到您的问题中。我自己的 PowerShell 知识很少,但我很确定,它可以更好地处理这个问题。
    • 再次感谢您尝试 Stephan。我将考虑使用 Powershell 或者使用我试图避免的临时文件方法。流程为: 1) 查询TaskName,全部保存到Test A; 2)查询任务状态并保存到文件B; 3)在文本文件B中,找到“启用”并将“启用”替换为“启用”,并找到“禁用”并将“禁用”替换为“禁用”; 4) 将文件 A 和文件 B 中的值连接到命令 "schtasks /Change /TN "FILE-A_VALUE" /FILE-B_VALUE" 并保存到 File-C.bat。然后在文件中,我将在 File-C 中得到我想要的。
    • 1/2:请记住,两个查询不会同时运行。如果在该时间段内添加或删除了任务(任务计划程序设置“如果任务未计划再次运行,请删除它”),整个结果列表将是错误的。 (不太可能,但不好的做法)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多