[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [已解决]求助批处理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 均没停顿,

回复 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

TOP

回复 2# Batcher


    我不明白,就算if not exist "%OutFile%" 判断中的 pause 不停顿也就算了,为什么这个判断之下的pause 也不生效

TOP

回复 5# Batcher


    感谢,回复很及时,在群里看到公告,很点赞。虽然和这个无关,但还想在问一下,还有没有其他技术论坛,

TOP

回复 5# Batcher


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

TOP

回复 8# Batcher


    只显示命令语法不正确,但具体是哪里不正确,不清楚

TOP

回复 8# Batcher


[img][/img]

TOP

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

TOP

回复 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搂)

TOP

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

TOP

回复 15# 77七


    是的  因为初次接触,没有系统的知识,所以只能AI生成,然后自己在修改

TOP

回复 18# 77七


    好 太感谢

TOP

回复 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、一心想为本站贡献一份力所能及的力量,学习之后也会帮助本站内回复,发展,等,我觉得这份知识的共享和传播是一件很好的事请,所以期待能和你们一起做这件事,共事。所以我想知道我们团队有多少技术站,也期待我们团队有更多的类型的技术网站.

TOP

回复 22# Batcher


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

TOP

回复 22# Batcher


    对了,这个论坛的VIP贡献是累计的方式吗,比如累计500,是VIP3,还是必须单次达到500RMB贡献,才是VIP3,VIP有时间限制吗?

TOP

返回列表