无忧启动论坛

标题: 高手帮忙!!! 怎么获取一个进程的存在,然后根据是否存在分别执行命令? [打印本页]

作者: dreamneo    时间: 2011-12-15 21:32
标题: 高手帮忙!!! 怎么获取一个进程的存在,然后根据是否存在分别执行命令?
假设要查看是否有notepad.exe进程存在,是不用
tasklist /fi "imagename eq notepad.exe"
我用if的errorlevel不行,应该怎么写啊?

[ 本帖最后由 dreamneo 于 2011-12-19 09:30 编辑 ]
作者: pznpt    时间: 2011-12-16 02:24
呵呵,本菜鸟只想出本笨法子,试试看看:

---------------------------------------------分割线---------------------------------------------------
@echo off
set a=notepad.exe
for /f "tokens=2" %%i in ('tasklist /fi "imagename eq %a%" /fo list') do if "%%i"=="%a%" echo %a%进程存在&pause&goto :eof
echo %a%进程不存在&pause
---------------------------------------------分割线---------------------------------------------------
作者: dreamneo    时间: 2011-12-16 20:34
原帖由 pznpt 于 2011-12-16 02:24 发表
呵呵,本菜鸟只想出本笨法子,试试看看:

---------------------------------------------分割线---------------------------------------------------
@echo off
set a=notepad.exe
for /f "tokens=2" % ...


不行,无论是否有NOTEPAD.EXE 都显示没有运行!还是感谢!
还有什么好的命令啊?
作者: 527104427    时间: 2011-12-16 22:15
原帖由 dreamneo 于 2011-12-16 20:34 发表


不行,无论是否有NOTEPAD.EXE 都显示没有运行!还是感谢!
还有什么好的命令啊?

我怎么试了可以呢?
作者: pznpt    时间: 2011-12-16 23:10
原帖由 dreamneo 于 2011-12-16 20:34 发表


不行,无论是否有NOTEPAD.EXE 都显示没有运行!还是感谢!
还有什么好的命令啊?


有可能你的记事本NOTEPAD.EXE是大写?试了下,用errorlevel可以,这样貌似没问题了

@echo off
set a=notepad.exe
tasklist |find /i "%a%">nul
if errorlevel 1 (echo %a%进程不存在) else echo %a%进程存在
pause
作者: x9tian    时间: 2011-12-17 13:23
原帖由 dreamneo 于 2011-12-15 21:32 发表
假设要查看是否有notepad.exe进程存在,是不用
tasklist /fi "imagename eq notepad.exe"
我用if的errorlevel不行,应该怎么写啊?


批处理的 ERRORLEVEL  有一套完整的机制,  一般就是能取得完整的 errorlevel  值的.

但在不合理使用 set 命令call 命令.  合 >&; <&  这两个重定向符时是很容易得到错误的值的.(这两个重定向符一般用得比较少.)

同时批处理提供了, "|" ;"&&"; "||"  三个管道符  它们分别代表 继承; 成功值传剃;  非零值传剃(它通常是我们所说的错误传剃,但如果持行程序存在多号句柄,一样是此参数传剃.)

建议程序参数无多号句柄时,用上面的三个管道符
[曾经我也在无忧遇到过有个人说"||",不是管道符,
  在我的理解"在一整条语句中,它启着'承前启后'的作用, 它就是管道符"
]

套用楼上的代码.
原帖由 pznpt 于 2011-12-16 23:10 发表
@echo off
set a=notepad.exe
tasklist |find /i "%a%">nul
if errorlevel 1 (echo %a%进程不存在) else echo %a%进 ...


  1. set a=notepad.exe
  2. tasklist |find /i "%a%">nul&&echo. %a% 进程存在||echo.%a% 存在.
复制代码


最后提一句:  以上三个管道符的 如果应用于语句块的 变量, 请注意思变量延时问题.(如:for 语句的DO语句块部分)
作者: zhs1997    时间: 2011-12-17 13:48
标题: 回复 #6 x9tian 的帖子
谢谢分享,学习了。。。
  1. @echo off
  2. color 0a
  3. set a=notepad.exe
  4. tasklist | find /i "%a%">nul && echo. && echo. %a% 进程存在 && pause>nul || echo. && echo.%a% 进程不存在. && pause>nul
复制代码

[ 本帖最后由 zhs1997 于 2011-12-17 13:51 编辑 ]

0.JPG (16.69 KB, 下载次数: 65)

打开记事本,运行bat效果

打开记事本,运行bat效果

1.JPG (16.8 KB, 下载次数: 73)

没有打开记事本,运行bat效果

没有打开记事本,运行bat效果

作者: dreamneo    时间: 2011-12-18 22:47
谢谢大家,但是我开始这么写,为什么不行,FIND命令的errorlevel  不是 0 是代表执行正确并找到至少一项,1不是代表执行正确没有找到符合的项吗?


我代码这样写 有什么问题?

@echo off
tasklist|find /i "notepad.exe" >nul
if errorlevel 0 echo 存在
if errorlevel 1 echo 不存在
pause


这样执行的结果 是 有NOTEPAD.EXE存在的时候,显示存在;NOTEPAD.EXE不存在的时候,显示 存在 不存在
这事怎么回事,为什么两个都显示了

难道不存在的时候会同事判断成 0  和 1?

[ 本帖最后由 dreamneo 于 2011-12-18 23:42 编辑 ]

no.jpg (7.68 KB, 下载次数: 86)

不存在的运行结果

不存在的运行结果

作者: pznpt    时间: 2011-12-19 00:56
貌似 if errorlevel 0 的意思是%errorlevel%大于等于0吧,我也不确定。这样改就对:

if %errorlevel%==0 echo 存在
if %errorlevel%==1 echo 不存在

[ 本帖最后由 pznpt 于 2011-12-19 01:13 编辑 ]
作者: dreamneo    时间: 2011-12-19 09:28
标题: 回复 #9 pznpt 的帖子
谢谢高手指点,自己继续学习,感谢!
作者: dos时代菜鸟    时间: 2012-1-23 11:28


  1. @echo off
  2. set y= & set caption=notepad.exe
  3. for /f "skip=1 delims=" %%c in ('wmic process where "caption='%caption%'" get processID 2^>nul') do (set y=1)
  4. if %y%*==1*  (echo %caption% 进程存在! ) else (echo %caption% 进程不存在!)
  5. pause

复制代码

[ 本帖最后由 dos时代菜鸟 于 2012-1-23 11:50 编辑 ]
作者: 2011marlon    时间: 2012-2-4 22:42
学习一下!!!!!




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3