美文网首页
Batch获取计划任务信息

Batch获取计划任务信息

作者: 不正经运维 | 来源:发表于2018-04-23 20:06 被阅读40次

    来源:Windows计划任务状态监控

    需求

    采集Windows计划任务信息,步骤分为:

    1. 通过脚本获取符合条件的计划任务列表;
    2. 通过脚本查询指定计划任务状态上次运行结果

    分析

    其实有了上面的步骤,batch方面就好办多了。

    具体思路如下:

    1. 确认Windows下有获取计划任务信息的命令;
    2. 测试命令输出的内容是否满足需求;
    3. 清理命令输出内容,精简至所需结果;
    4. 测试,发布。

    解决方案

    有了分析结果,那么就好办了,分为三步:

    1. 测试计划任务命令;
    2. 编写计划任务的发现脚本;
    3. 编写计划任务信息的获取脚本;

    计划任务的命令

    到微软官方查询了计划任务的命令,Windows中有提供schtasks.exe这个程序。学习下使用。

    基本信息获取(不能使用/nh参数):

    schtasks.exe /query  | findstr “Taskname1 Taskname2"
    Folder: \
    TaskName                                 Next Run Time          Status
    ======================================== ====================== ===============
    Taskname1                                N/A                    Disabled
    Taskname2                                N/A                    Disabled
    

    获取所有计划任务的人物名、状态和上次运行结果:

    for /f "tokens=2,5,9" %a in ('schtasks.exe /query /v /nh') do @echo %a %b %c
    

    增加具体计划任务的过滤:

    for /f "tokens=2,5,9" %a in ('schtasks.exe /query /v /nh') do @echo %a %b %c | findstr "taskname1 taskname2 …"
    

    如果上述命令放在batch里,上述命令的变量就需要加入%,如%%a
    其中,上次运行结果的字段为16进制,输出为10进制,注意转换。
    因部分计划任务的名称中含有空格,可以考虑将注释提取出来。

    计划任务的自动发现

    使用方法:schtasksdiscovery.bat "name1 name2 name3"

    REM 计划任务的自动发现
    REM schtasksdiscovery.bat "name1 name2 name3"
    @echo off
    @setlocal enabledelayedexpansion
    REM IMPORTANT!!! ext is bat.
    REM discovery all want monitored scheduled tasks name.
    set "str={ ^"data^":["
    if NOT [%1]==[] (set "para=%*") else set "para=none"
    for /f "tokens=2 delims=," %%a in ('schtasks.exe /query /v /nh /fo csv ^| findstr %para%') do set "str=!str! {"{#SCHTASKNAME}^":^%%a^},"
    if "%str:~-1,1%"=="," set "str=%str:~0,-1%"
    set "str=%str%  ] }"
    echo %str%
    

    计划任务信息的采集

    使用方法:schtaskstat.bat taskname

    REM 计划任务信息的采集
    schtaskstat.bat taskname
    @echo off
    REM IMPORTANT!!! ext is bat.
    REM get status of specified task
    for /f "tokens=5,9" %%a in ('schtasks.exe /query /v /nh /fo csv^| findstr "%1"') do @echo %%a %%b
    

    其他

    该脚本在Windows2003、2008上执行通过。下面说说其他未能解决的问题。

    语言包问题

    部分机器由于本地语言包问题,在执行schtasks.exe /query命令的时候会报错:

    错误: 无法加载列资源。

    此时,如果是在命令行中,可以使用chcp 437,并修改脚本中的2,5,92,5,10。可以得到正确的结果。

    但是会发现,chcp 437执行后是新开了一个子进程。经过测试这种方法至少在Zabbix中不能正常使用,依旧是乱码。无论chcp怎么加入,都无法正常生效。

    结果返回问题

    因为遇到部分系统仅在运行时返回状态Running,其他情况下为空,因此考虑使用/fo csv方式来进行处理。

    相关文章

      网友评论

          本文标题:Batch获取计划任务信息

          本文链接:https://www.haomeiwen.com/subject/irxrlftx.html