Board logo

标题: [其他] [已解决]求助批处理IF NOT EXIST 的使用 [打印本页]

作者: GNGW    时间: 2024-2-20 10:17     标题: [已解决]求助批处理IF NOT EXIST 的使用

本帖最后由 GNGW 于 2024-3-5 14:26 编辑
  1. set /a retry_script_count=0
  2. set /a retry_count=0
  3. set /a process_count = 0
  4. set /a vmware_process_txt_count = 0
  5. set /a vmrun_count = 0
  6. :command_loop
  7. vmrun stop "D:\VMware\VMLib\hengFengBankClone\hengFengBankOne.vmx" soft
  8. :check_process
  9. tasklist /FI "IMAGENAME eq vmware-vmx.exe" 2>NUL | find /I /N "vmware-vmx.exe">C:\Users\admin\Desktop\vmware_process.txt
  10. IF NOT EXIST "C:\Users\admin\Desktop\vmware_process.txt"(
  11. pause
  12. IF %vmware_process_txt_count% EQU 3(
  13. set /a vmrun_count+=1
  14. goto:command_loop
  15. )
  16. IF %vmrun_count% EQU 3(
  17. exit /b 1
  18. )
  19. set /a vmware_process_txt_count = 0
  20. goto:check_process
  21. )
  22. pause
复制代码
以上是代码--------------------------
问题是
C:\Users\admin\Desktop\vmware_process.txt 文件正常创建
但是两个pause 均没停顿,
作者: Batcher    时间: 2024-2-20 11:01

回复 1# GNGW



从语法层面来说,这样可以停顿:
  1. @echo off
  2. set "retry_script_count=0"
  3. set "retry_count=0"
  4. set "process_count=0"
  5. set "vmware_process_txt_count=0"
  6. set "vmrun_count=0"
  7. set "OutFile=C:\Users\admin\Desktop\vmware_process.txt"
  8. :command_loop
  9. vmrun stop "D:\VMware\VMLib\hengFengBankClone\hengFengBankOne.vmx" soft
  10. :check_process
  11. tasklist /fi "imagename eq vmware-vmx.exe" 2>nul | find /i /n "vmware-vmx.exe" >"%OutFile%"
  12. if not exist "%OutFile%" (
  13.     pause
  14.     if %vmware_process_txt_count% equ 3 (
  15.         set /a vmrun_count+=1
  16.         goto :command_loop
  17.     )
  18.     if %vmrun_count% equ 3 (
  19.         exit /b 1
  20.     )
  21.     set /a vmware_process_txt_count=0
  22.     goto :check_process
  23. )
  24. pause
复制代码
但是你这个代码逻辑和你想实现的效果是有很大差距的,建议详细描述一下实际需求,我继续帮你修改代码逻辑。

首先第一个逻辑问题是,find命令即使查不到关键字,它仍然会创建一个空文件,所以下面的 if not exist 判断永远不会生效。
作者: GNGW    时间: 2024-2-20 11:30

回复 2# Batcher


    需求是,vmrun stop 停止了一个虚拟机,需要反复检查此虚拟机进程是否存在,如果不存在,就退出VMware 应用程序,然后等待10秒后关机。如果虚拟机进程存在,则反复关闭虚拟机进程,因为是用的vmrun stop soft ,软关机,所以,虚拟机进程会关闭一段时间。
(简短需要关闭一个虚拟机,并关闭VMware,并关机)
下面是我的代码,全码----------------------------------------------------------
set /a retry_script_count=0
set /a retry_count=0
set /a process_count = 0
set /a vmware_process_txt_count = 0
set /a vmrun_count = 0
:command_loop
vmrun stop "D:\VMware\VMLib\hengFengBankClone\hengFengBankOne.vmx" soft
:check_process
tasklist /FI "IMAGENAME eq vmware-vmx.exe" 2>NUL | find /I /N "vmware-vmx.exe">C:\Users\admin\Desktop\vmware_process.txt
IF NOT EXIST "C:\Users\admin\Desktop\vmware_process.txt"(
pause
        IF %vmware_process_txt_count% EQU 3(
                set /a vmrun_count+=1
                goto:command_loop
        )
        IF %vmrun_count%         EQU 3(
                exit /b 1
        )
        set /a vmware_process_txt_count = 0
        goto:check_process
)
pause
if %~z1 EQU 0 (
        del "C:\Users\admin\Desktop\vmware_process.txt"
        taskkill /f /t /im "vmware.exe"
        timeout /t 10
        shutdown /s /t 0
)
del "C:\Users\admin\Desktop\vmware_process.txt"
echo "虚拟机仍在运行中"
IF %retry_script_count% EQU 3(
        exit /b 1
)
IF %retry_count% NEQ 5 (
        set /a retry_count+=1
        timeout /t 30
        goto:check_process
)
echo "连续检查5次,虚拟机仍没关闭,请等待程序再次尝试关闭虚拟机"
timeout /t 30
set /a retry_count=0
set /a retry_script_count+=1
setlocal
        set /a new_retry_script_count=%retry_script_count%+1
        echo "第%new_retry_script_count%次尝试关闭虚拟机"
        timeout /t 10
endlocal
goto:command_loop
作者: GNGW    时间: 2024-2-20 11:36

回复 2# Batcher


    我不明白,就算if not exist "%OutFile%" 判断中的 pause 不停顿也就算了,为什么这个判断之下的pause 也不生效
作者: Batcher    时间: 2024-2-20 11:53

回复 4# GNGW


因为你代码里面有很多语法错误,请参考Q-01观察一下哪行代码在报错以及详细的报错信息:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA

例如:

作者: GNGW    时间: 2024-2-20 12:05

回复 5# Batcher


    感谢,回复很及时,在群里看到公告,很点赞。虽然和这个无关,但还想在问一下,还有没有其他技术论坛,
作者: GNGW    时间: 2024-2-20 13:37

回复 5# Batcher


    tasklist /FI "IMAGENAME eq vmware-vmx.exe" 2>NUL | find /I /N "vmware-vmx.exe">C:\Users\admin\Desktop\vmware_process.txt,请问我这句代码 ,有什么语法错误问题
作者: Batcher    时间: 2024-2-20 13:42

回复 7# GNGW


你自己执行到这句代码遇到什么报错信息了?

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: GNGW    时间: 2024-2-20 14:24

回复 8# Batcher


    只显示命令语法不正确,但具体是哪里不正确,不清楚
作者: GNGW    时间: 2024-2-20 16:00

回复 8# Batcher


[img][/img]
作者: 77七    时间: 2024-2-20 16:11

回复 10# GNGW


   if 0 equ 3(错了,参考5楼
作者: Five66    时间: 2024-2-20 23:56

注意复合命令可能需要
setlocal enabledelayedexpansion
作者: GNGW    时间: 2024-2-21 09:23

tasklist /FI "IMAGENAME eq vmware-vmx.exe" 2>NUL | find /I /N "vmware-vmx.exe">"F:\vmware_process.txt"   这个有没有更好的方法替代?我想检查一个虚拟机(就是VMware应用内的虚拟机)进程是不是存在,如果存在,进行重复关闭此进程,如果不存在,就关闭虚拟机(VMware程序)进程,然后进行关机。想问下还有没有更好的办法
作者: GNGW    时间: 2024-2-21 09:33

回复 8# Batcher
  1. @echo off
  2. set "retry_script_count=0"
  3. set "retry_count=0"
  4. set "process_count = 0"
  5. set "vmware_process_txt_count = 0"
  6. set "vmrun_count = 0"
  7. :command_loop
  8. vmrun stop "D:\VMware\VMLib\hengFengBankClone\hengFengBankOne.vmx" soft
  9. :check_process
  10. tasklist /FI "IMAGENAME eq vmware-vmx.exe" 2>NUL | find /I /N "vmware-vmx.exe">"F:\vmware_process.txt"
  11. if %~z1 EQU 0 (
  12. del "F:\vmware_process.txt"
  13. taskkill /f /t /im "vmware.exe"
  14. timeout /t 10
  15. shutdown /s /t 0
  16. )
  17. del "F:\vmware_process.txt"
  18. echo "虚拟机仍在运行中"
  19. IF %retry_script_count% EQU 3(
  20. exit /b 1
  21. )
  22. IF %retry_count% NEQ 5 (
  23. set /a retry_count+=1
  24. timeout /t 30
  25. del "F:\vmware_process.txt"
  26. goto:check_process
  27. )
  28. echo "连续检查5次,虚拟机仍没关闭,请等待程序再次尝试关闭虚拟机"
  29. timeout /t 30
  30. set /a retry_count=0
  31. set /a retry_script_count+=1
  32. setlocal
  33. set /a new_retry_script_count=%retry_script_count%+1
  34. echo "第%new_retry_script_count%次尝试关闭虚拟机"
  35. timeout /t 10
  36. endlocal
  37. goto:command_loop
复制代码
这是我修改之后的代码,问题详见上个楼层(13搂)
作者: 77七    时间: 2024-2-21 09:58

本帖最后由 77七 于 2024-2-21 10:00 编辑

回复 14# GNGW


  1楼代码ai写的?
  1. @echo off
  2. :command_loop
  3. set /a n+=1
  4. echo "第%n%次尝试关闭虚拟机"
  5. vmrun stop "D:\VMware\VMLib\hengFengBankClone\hengFengBankOne.vmx" soft
  6. tasklist /FI "IMAGENAME eq vmware-vmx.exe" 2>NUL | find /I "vmware-vmx.exe" 1>nul && (
  7. timeout /t 30
  8. goto :command_loop
  9. ) || (
  10. taskkill /f /t /im "vmware.exe"
  11. timeout /t 10
  12. shutdown /s /t 0
  13. )
复制代码

作者: GNGW    时间: 2024-2-21 09:59

虽然没有用,即使是哪种情况,为1都可以判断认为进程存在,但我还想问errorlevel 为1证明上一句执行失败,那这个失败的定义是上一条命令未能找到最终需求结果,还是因为其他问题,上一条命令没能执行成功?还是皆有?关于bat 的学习资料 ,有没有靠谱的一些资料可以分享,我们都在互联网上,那基本的一些互联网资源我们都能看到,所以靠谱程度不用说,基本上的视频都是讲解的碎片式的,不能系统的学习这些,从历史,到发展到现在的变化,以及如果查询这些东西在什么位置等等,有没有一个合适的资源,视频或者是书籍可以系统的学习整体或部分系统性的知识,并不是网络上碎片化的那种。
作者: GNGW    时间: 2024-2-21 10:00

回复 15# 77七


    是的  因为初次接触,没有系统的知识,所以只能AI生成,然后自己在修改
作者: 77七    时间: 2024-2-21 10:01

回复 17# GNGW


   手误写错一处,重新编辑了
作者: GNGW    时间: 2024-2-21 10:02

回复 18# 77七


    好 太感谢
作者: Batcher    时间: 2024-2-21 10:12

回复 16# GNGW
  1. tasklist /fi "imagename eq vmware-vmx.exe" 2>nul | find /i /n "vmware-vmx.exe" >nul
  2. if errorlevel 1 (
  3.     echo 进程不存在,关闭成功。
  4. ) else (
  5.     echo 进程存在,需要重复关闭。
  6. )
复制代码
if errorlevel 1 判断的是系统变量errorlevel的值是否大于等于1。
errorlevel的值等于0的时候,说明find命令从tasklist命令的结果里面找到了指定的关键字,也就是说进程仍然存在。

视频教程:
http://bbs.bathome.net/thread-31727-1-1.html
抖音、快手、哔哩哔哩等短视频平台能找到很多批处理视频合集
作者: GNGW    时间: 2024-2-21 10:59

回复 20# Batcher

tasklist /fi "imagename eq vmware-vmx.exe" 2>nul | find /i /n "vmware-vmx.exe" >nul
if errorlevel 1 (
    echo 进程不存在,关闭成功。
) else (
    echo 进程存在,需要重复关闭。
)

if errorlevel 1 判断的是系统变量errorlevel的值是否大于等于1。
errorlevel的值等于0的时候,说明find命令从tasklist命令的结果里面找到了指定的关键字,也就是说进程仍然存在。

   

    请阅读一下4条(尽量仔细),下面内容代表了我的所有想法,
    1、我想您应该是没仔细看我的回复,是的,我是这个意思,但我的其他问题是errorlevel 返回值,大于0 的时候,返回的信息,(1)是说明上一个命令没有执行成功,(2)还是没有找到需要的结果.  比如上一条命令出现语法错误,执行到一半,是不是也会返回1?那返回大于1具体的意义就不知道了,我大概查了一下,说是有好多种返回码,且用户不可定义,只能定义本脚本执行的返回码,不能定义errorlevel 。(因为帖子每小时的数量限制,所以只能很多问题放在这里问)
    2、VIP 用户可以提升每小时发帖数量的限制吗。如何从普通组到荣誉组到管理组,晋升机制
    3、大批量的互联网视频这个我们作为互联网一员当然是知道的。但内容你肯定也知道的,碎片式的,所以想寻求一份更系统和高效的学习资料,可以是视频和书籍,如果您回复的上一条评论中的视频就已经很好了,就您觉得很可以,很有含金量了。可以当这一条不存在,没有。
    4、一心想为本站贡献一份力所能及的力量,学习之后也会帮助本站内回复,发展,等,我觉得这份知识的共享和传播是一件很好的事请,所以期待能和你们一起做这件事,共事。所以我想知道我们团队有多少技术站,也期待我们团队有更多的类型的技术网站.
作者: Batcher    时间: 2024-2-21 12:28

回复 21# GNGW


1、errorlevel的返回值非常复杂,不可能用一两句话概括完整。如果一定要概括的话:
大部分命令,执行成功的返回值是0。

批处理各命令错误返回值errorlevel一览
http://bbs.bathome.net/thread-3603-1-1.html

errorlevel的范围是[-2147483648,2147483647]
https://stackoverflow.com/questi ... egative-error-codes

不同的命令设置errorlevel值是不一样的
https://stackoverflow.com/questi ... s/34987886#34987886

[讨论]对批处理中errorlevel的几点猜测
http://bbs.bathome.net/thread-14277-1-1.html

2、VIP http://bbs.bathome.net/thread-67716-1-1.html
管理组 http://bbs.bathome.net/thread-77-1-1.html
荣誉组一般只主动授予,不接受申请。

3、如果你有一天找到了更好的资料,请让我也学习一下。提前感谢!

4、我手上只有这一个网站。
作者: GNGW    时间: 2024-2-21 13:44

回复 22# Batcher


     学习资料一定会放在这个论坛的,因为我也在这个论坛受益。我不知道你是不是这个网站的最高管理员,还是说有其他更高管理员与你并存,实际上我并不知道这个网站的管理组解构。但关于有多少技术论坛,如果有的话,或者你愿意分享你常逛的技术型论坛,如果你不是最高管理者,或者还有其他管理者,你可以帮忙问问你申请的人吗?如果不知道 ,可以逐级上问。期待你的回复。因为现在互联网上,像这种存活且高质量的论坛已经不多见了,大部分论坛都随着发展到现在死掉了。要么就是尸体论坛,论坛还在已经没人使用了。好几年前的帖子还在上面,只是有一个存档的作用。所以这是我殷切你能分享和帮我询问技术论坛的原因。我会很感谢。
作者: GNGW    时间: 2024-2-21 13:46

回复 22# Batcher


    对了,这个论坛的VIP贡献是累计的方式吗,比如累计500,是VIP3,还是必须单次达到500RMB贡献,才是VIP3,VIP有时间限制吗?
作者: Batcher    时间: 2024-2-21 14:30

回复 23# GNGW


我不知道你是不是这个网站的最高管理员

是的,我是。


实际上我并不知道这个网站的管理组解构

参考:http://bbs.bathome.net/stats.php?type=team


或者你愿意分享你常逛的技术型论坛

www.dostips.com
作者: Batcher    时间: 2024-2-21 14:31

回复 24# GNGW


    累计。没有时间限制。
作者: GNGW    时间: 2024-2-21 14:35

回复 25# Batcher


    你们这几个人是真的厉害,向你们致敬。几个人在论坛里回复这么多人的技术需求,还这么大公无私,
作者: GNGW    时间: 2024-2-21 15:10

回复 26# Batcher


    我还想问,就是关注于动手多练,想问有没有可以练习bat 的网站或者地方。比较好的,或者你自己用的。
作者: Batcher    时间: 2024-2-21 15:16

回复 28# GNGW


试试这里:
http://bbs.bathome.net/forumdisplay.php?fid=29
http://bbs.bathome.net/forumdisplay.php?fid=28
其它的我不知道。
作者: GNGW    时间: 2024-2-21 16:04

回复 29# Batcher


    这些短视频平台我都看了,都是碎片化的,就有些问题,视频里面没有,自己去搜,问题扯问题,就扯出来一串自己不懂的问题,如果系统化的学习,基本全有,就不会有这样的过程,所以我想问有没有更好的学习资料,还有分享的帖子里面的视频是swf格式的,需要用什么应用打开?
作者: GNGW    时间: 2024-2-21 16:07

回复 29# Batcher


    我还是不懂,环境变量的环境的含义,还有用户环境变量和系统环境变量的含义,当然我对这个,知道,用户环境变量,就是用户登录时候初始化的环境变量,只能由某个特殊用户使用,系统环境变量,由操作系统初始化时的环境变量,面向所有用户和进程,但是我还是不理解这个环境变量所具备的环境的意义,和这个环境的范围。
作者: Batcher    时间: 2024-2-21 16:45

回复 30# GNGW



作者: GNGW    时间: 2024-2-21 17:01

回复 32# Batcher


    这个知道的,只是主要重要的是问前面那个问题
作者: ShowCode    时间: 2024-2-21 22:26

回复 31# GNGW


不需要扣字眼学理论。
大概知道:普通变量需要经过用户自己定义,可以使用;环境变量不需要用户定义,直接用。
将来遇到具体的问题、具体的代码,拿出来讨论就行了。
暂时不理解的就先跳过,好读书不求甚解。
作者: GNGW    时间: 2024-2-28 10:47

回复 22# Batcher


   
这个就很好的概括了。大致就行。因为很多,确实没办法说的干净和清楚
作者: Batcher    时间: 2024-2-28 20:34

回复 35# GNGW


    恭喜你找到了适合自己的
作者: GNGW    时间: 2024-2-29 09:30

回复 36# Batcher


    谢谢,本着共享精神发出来的,如有打扰多多见谅。也感谢你的无私奉献




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