Board logo

标题: [系统相关] BAT批处理如何判断计划任务是否存在? [打印本页]

作者: jwt2014    时间: 2014-3-17 03:40     标题: BAT批处理如何判断计划任务是否存在?

如题,如何判断计划任务是否存在?比如:存在或不存在分别返回一个数值或符号,以便后续计算。
作者: jwt2014    时间: 2014-3-18 21:09

难道没人知道?
顶一下。
作者: DAIC    时间: 2014-3-18 22:41

  1. schtasks /query
复制代码

作者: jwt2014    时间: 2014-3-19 02:46

回复 3# DAIC

这个只能查询,但不能告诉代码结果(存在or不存在),我要根据结果执行不同操作。
作者: DAIC    时间: 2014-3-19 08:20

回复 4# jwt2014


你在有计划任务和没有计划任务的情况下,分别执行那个命令,把结果记录下来,看看有什么不同。根据这个结果来判断就行了。

条件判断的语法在这里:
http://bbs.bathome.net/thread-2530-1-1.html
作者: jwt2014    时间: 2014-3-20 01:18

本帖最后由 jwt2014 于 2014-3-20 01:20 编辑

回复 5# DAIC

最终还是想出了一个变通的方法:
将query结果输出到文本文件(1.txt),再用findstr判断1.txt里有没有需要的计划任务名称,如果有就会生成一个含有指定文件名的文件2.txt。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. chcp 437
  4. schtasks /query /tn ABC >1.txt
  5. findstr /m "ABC" 1.txt >2.txt
  6. for /f  "tokens=1,*" %%a in (2.txt) do (
  7. if "%%a"=="1.txt" (
  8. schtasks /delete /tn ABC /f
  9. )
  10. )
  11. pause
复制代码
这里发现一个有趣的现象,在中文状态下不能使用schtasks /query /tn ABC,在英文状态下则可以输出查询结果。不知何故。
作者: DAIC    时间: 2014-3-20 08:24

回复 6# jwt2014


反正都要删除,干脆别判断了,直接删:
  1. schtasks /delete /tn ABC /f 2>nul
复制代码

作者: jwt2014    时间: 2014-3-20 15:18

回复 7# DAIC
没错。想过这么干,还简单的多。但考虑批处理貌似几乎没有命令会返回不同的结果值,所以想找一个方法,便于以后应用。
前面是通过文件传递的方式进行,有没有可能直接将结果传给变量呢?
作者: jwt2014    时间: 2014-3-20 15:25

找到方法了,贴出来和大家共享。

http://www.netingcn.com/bat-command-to-variable.html

在批处理中,如果需要把一个命令的处理结果赋值给一个变量,可以使用如下方法:

for /f "delims=" %%t in ('命令字符串') do set str=%%t
echo %str%
当命令字符串中含有%时,需要转义。使用imagemagick中的identify命令获取图片的宽和高:

identify -format %wx%h demo.jpg
直接在命令行中使用上述命令可以看到输出了图片的高和宽,但是用它放在批处理脚本中来获取命令的输出结果,则失败,原因是命令字符串中含有%符号,它在批处理有特殊含义,所有需要转义,转义的方法是使用两个%%,正确的做法是:

for /f "delims=" %%t in ('identify -format %%wx%%h demo.jpg') set str=%%t
作者: DAIC    时间: 2014-3-20 16:07

回复 9# jwt2014


其实不用到处搜索,好好学习这两个帖子就行了:
http://bbs.bathome.net/thread-2189-1-1.html
http://bbs.bathome.net/thread-2336-1-1.html
作者: cjiabing    时间: 2014-3-20 19:18

  1. set var=0
  2. schtasks /query /tn ABC |findstr /m "ABC" &&set var=1
  3. if %var%==1 schtasks /delete /tn ABC /f
复制代码
没有测试过!思路是这样的。
作者: jacksen168    时间: 2021-7-5 08:05

根据11楼的修改,11楼的第3条指令没有管理员权限任务是不给删的;据标题可知只需要判断就行了
  1. set var=0
  2. ::读取任务计划中的ABC任务,如果有就显示,如果没有就报错
  3. schtasks /query /tn ABC |findstr /m "ABC" &&set var=1
  4. ::检查上一条指令是否产生与ABC有关的信息,如果没有就执行X;如过有就执行Y
  5. if ERRORLEVEL 1 (X)else (Y)
  6. pause
复制代码

作者: jacksen168    时间: 2021-7-5 08:05

根据11楼的修改,11楼的第3条指令没有管理员权限任务是不给删的;据标题可知只需要判断就行了
  1. set var=0
  2. ::读取任务计划中的ABC任务,如果有就显示,如果没有就报错
  3. schtasks /query /tn ABC |findstr /m "ABC" &&set var=1
  4. ::检查上一条指令是否产生与ABC有关的信息,如果没有就执行X;如过有就执行Y
  5. if ERRORLEVEL 1 (X)else (Y)
  6. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2