Powershell 生成批处理文件以备份计划任务的启用/禁用状态

Powershell 生成批处理文件以备份计划任务的启用/禁用状态,powershell,batch-file,cmd,scheduled-tasks,backup,Powershell,Batch File,Cmd,Scheduled Tasks,Backup,从批处理文件中,我尝试: 捕获Windows 10 x64中所有计划任务的任务名称和启用/禁用状态 将这些文件导出到第二个批处理文件,每个任务的TASKNAME和SCHEDULED_TASK_STATE由以下命令填充: schtasks/Change/TN“\TASKNAME”/SCHEDULED\u TASK\u STATE 其想法是,第二个批处理文件用作所有现有任务的启用/禁用状态的一键备份/恢复。这样,通过GUI工具(例如,任务调度器、自动运行、taskschedulerview-x64等

从批处理文件中,我尝试:

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

  • 将这些文件导出到第二个批处理文件,每个任务的TASKNAMESCHEDULED_TASK_STATE由以下命令填充:

    schtasks/Change/TN“\TASKNAME”/SCHEDULED\u TASK\u STATE

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

    对于源批处理文件,命令

    SCHTASKS /Query /FO LIST /v
    
    。。。将检索所有任务的列表以及我感兴趣的两个值--“任务名称”“和“计划任务状态”

    根据从其他堆垛机收集到的信息,下面是我使用临时文件方法所得到的信息,但这只完成了一半,我有点不知所措:)

    如果源批处理文件:

  • 执行命令SCHTASKS/Query/FO LIST/v

  • 是否所有处理/解析都到位,即,将变量分配给每个任务所需的两个值——“TaskName”和“Scheduled task State”——而不创建临时文件,以及

  • 将这些值插入所有任务的“schtasks/Change”命令,并导出到目标批处理文件


  • 非常感谢您的帮助。

    因为您只需要任务名和状态,所以不需要
    /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%]!
    

    因为变量(
    n
    )在一个代码块中被更改和使用。

    关于@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修改过的代码,以便:

  • 引用his变量以填充命令“schtasks/Change/TN”\TASKNAME”/SCHEDULED\u TASK\u STATE”,以及

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

  • …但包括当前系统上的所有任务

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


    我意识到了另一个问题:获取任务状态的命令使用语言“Enabled”或“Disabled”(末尾是“d”);但是设置任务状态的命令需要语言“ENABLE”或“DISABLE”(末尾都不带“d”)。因此,绘图变厚了:在输出到目标批处理文件时,如何删除不必要的值“d”结尾

    谢谢Stephan的努力和解释。我将在回答中提供更多细节。更糟糕的是:1)
    schtasks
    使用当地语言。在我的系统中是“Aktiviert”和“Deaktiviert”。2) 某些任务名称包含逗号和引号,因此
    tokens=12
    不可靠!。您应该在问题中添加
    powershell
    标记。我自己的PowerShell知识水平很低,但我很确定,它可以更好地处理这个问题。再次感谢您尝试Stephan。我将研究使用Powershell,或者可能使用我试图避免的临时文件方法。该过程将是:1)查询TaskName并将其全部保存到testa;2) 查询任务状态并保存到文件B;3) 在文本文件B中,用“启用”查找并替换“启用”,用“禁用”查找并替换“禁用”;4)将文件A和文件B中的值连接到命令“schtasks/Change/TN”File-A_值“/File-B_值”中,并保存到文件-C.bat。然后在文件中,我将得到我在文件-C.1/2中想要的东西:请记住,两个查询不会同时运行。如果在该时间段内添加或删除任务(任务计划程序设置“如果任务未计划再次运行,请将其删除”),则整个结果列表将出错。(不太可能,但实践不好)
    :: 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 (
    
    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