标题: [其他] [已解决]求助批处理IF NOT EXIST 的使用 [打印本页]
作者: GNGW 时间: 2024-2-20 10:17 标题: [已解决]求助批处理IF NOT EXIST 的使用
本帖最后由 GNGW 于 2024-3-5 14:26 编辑
- 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
复制代码
以上是代码--------------------------
问题是
C:\Users\admin\Desktop\vmware_process.txt 文件正常创建
但是两个pause 均没停顿,
作者: Batcher 时间: 2024-2-20 11:01
回复 1# GNGW
从语法层面来说,这样可以停顿:- @echo off
- set "retry_script_count=0"
- set "retry_count=0"
- set "process_count=0"
- set "vmware_process_txt_count=0"
- set "vmrun_count=0"
- set "OutFile=C:\Users\admin\Desktop\vmware_process.txt"
-
- :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" >"%OutFile%"
- if not exist "%OutFile%" (
- 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
复制代码
但是你这个代码逻辑和你想实现的效果是有很大差距的,建议详细描述一下实际需求,我继续帮你修改代码逻辑。
首先第一个逻辑问题是,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 - @echo off
- set "retry_script_count=0"
- set "retry_count=0"
- set "process_count = 0"
- set "vmware_process_txt_count = 0"
- set "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">"F:\vmware_process.txt"
- if %~z1 EQU 0 (
- del "F:\vmware_process.txt"
- taskkill /f /t /im "vmware.exe"
- timeout /t 10
- shutdown /s /t 0
- )
- del "F:\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
- del "F:\vmware_process.txt"
- 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
复制代码
这是我修改之后的代码,问题详见上个楼层(13搂)
作者: 77七 时间: 2024-2-21 09:58
本帖最后由 77七 于 2024-2-21 10:00 编辑
回复 14# GNGW
1楼代码ai写的?
- @echo off
- :command_loop
- set /a n+=1
- echo "第%n%次尝试关闭虚拟机"
- vmrun stop "D:\VMware\VMLib\hengFengBankClone\hengFengBankOne.vmx" soft
-
- tasklist /FI "IMAGENAME eq vmware-vmx.exe" 2>NUL | find /I "vmware-vmx.exe" 1>nul && (
- timeout /t 30
- goto :command_loop
- ) || (
- taskkill /f /t /im "vmware.exe"
- timeout /t 10
- shutdown /s /t 0
- )
复制代码
作者: 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 - 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命令的结果里面找到了指定的关键字,也就是说进程仍然存在。
视频教程:
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 |