返回列表 发帖

[其他] [已解决]求助批处理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
)
pauseCOPY
以上是代码--------------------------
问题是
C:\Users\admin\Desktop\vmware_process.txt 文件正常创建
但是两个pause 均没停顿,

回复 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
)
pauseCOPY
但是你这个代码逻辑和你想实现的效果是有很大差距的,建议详细描述一下实际需求,我继续帮你修改代码逻辑。

首先第一个逻辑问题是,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
@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_loopCOPY
这是我修改之后的代码,问题详见上个楼层(13搂)

TOP

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

TOP

返回列表