[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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 均没停顿,

回复 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 判断永远不会生效。
2

评分人数

    • GNGW: 乐于助人,感谢教学技术 + 1
    • 77七: 感谢分享技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

回复 4# GNGW


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

例如:
1

评分人数

    • GNGW: 感谢耐心技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

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

回复 7# GNGW


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

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 8# Batcher


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

TOP

回复 8# Batcher


[img][/img]

TOP

回复 10# GNGW


   if 0 equ 3(错了,参考5楼
bat小白,请多指教!谢谢!

TOP

注意复合命令可能需要
setlocal enabledelayedexpansion

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

本帖最后由 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. )
复制代码
bat小白,请多指教!谢谢!

TOP

返回列表