标题: [文本处理] [已解决]批处理BAT脚本if中包含标签的问题 [打印本页]
作者: lonron 时间: 2023-3-22 13:45 标题: [已解决]批处理BAT脚本if中包含标签的问题
本帖最后由 lonron 于 2023-3-22 18:33 编辑
- if exist "%Tmp%\Test\test.lock" (
- for /f "delims=" %%a in ('powershell "(new-timespan (gc '%Tmp%\Test\test.lock') (date -format 'yyyy.MM.dd HH:mm:ss')).totalseconds"') do (
- if %%a geq 60 (
- :Cleaning
- tasklist | find "XXX.exe" >nul && (
- taskkill /im "XXX.exe" /t /f >nul
- goto Cleaning
- )
- rd /s /q "%Tmp%\Test"
- ) else (
- goto tag2
- )
- )
- )
- :tag1
- cls
- echo.
- echo tag1 ...
- pause
- :tag2
- cls
- echo.
- echo tag2 ...
- pause
复制代码
当 "%Tmp%\Test\test.lock" 存在时,如果 "XXX.exe" 是未启动状态,且 %%a 大或等于 60,那么最终测试结果是:关闭了"XXX.exe"、删除了"%Tmp%\Test"、跳转到 tag1 标签。
当 "%Tmp%\Test\test.lock" 存在时,如果 "XXX.exe" 是已启动状态,且 %%a 大或等于 60,那么最终测试结果是:关闭了"XXX.exe"、删除了"%Tmp%\Test"、跳转到 tag2 标签。
这是为什么?
还有就是如果将 geq 换成 lss 然后将 两个返回值调换下也就是:- if exist "%Tmp%\Test\test.lock" (
- for /f "delims=" %%a in ('powershell "(new-timespan (gc '%Tmp%\Test\test.lock') (date -format 'yyyy.MM.dd HH:mm:ss')).totalseconds"') do (
- if %%a lss 60 (
- goto tag2
- ) else (
- :Cleaning
- tasklist | find "XXX.exe" >nul && (
- taskkill /im "XXX.exe" /t /f >nul
- goto Cleaning
- )
- rd /s /q "%Tmp%\Test"
- )
- )
- )
- :tag1
- cls
- echo.
- echo tag1 ...
- pause
- :tag2
- cls
- echo.
- echo tag2 ...
- pause
复制代码
同样是 "%Tmp%\Test\test.lock" 存在时,无论 "XXX.exe" 是否启动,只要 %%a 大或等于 60,结果都是 关闭了"XXX.exe"、删除了"%Tmp%\Test"、跳转到 tag1 标签。
为什么会出现这种情况?没有找到其中的原因,只感觉是不是和判断中的标签 Cleaning 有关?
作者: 77七 时间: 2023-3-22 14:31
goto 跳到for语句里面会出错
作者: Batcher 时间: 2023-3-22 14:32
回复 1# lonron
是不是想要这个效果呢:- set "FileName=%Tmp%\Test\test.lock"
- if exist "%FileName%" (
- for /f "delims=" %%a in ('powershell "(new-timespan (gc '%FileName%') (date -format 'yyyy.MM.dd HH:mm:ss')).totalseconds"') do (
- if %%a geq 60 (
- call :Cleaning
- rd /s /q "%Tmp%\Test"
- goto :tag1
- ) else (
- goto :tag2
- )
- )
- )
- exit /b
-
- :tag1
- echo tag1 ...
- pause
- exit /b
-
- :tag2
- echo tag2 ...
- pause
- exit /b
-
- :Cleaning
- tasklist | findstr /i "XXX.exe" >nul
- if errorlevel 1 (
- exit /b
- ) else (
- taskkill /im "XXX.exe" /t /f >nul
- goto :Cleaning
- )
复制代码
作者: lonron 时间: 2023-3-22 15:23
回复 3# Batcher
可以了,感谢!
但是我还是想知道原代码是geq的时候为什么会出问题呢,是如2楼老师所说的因为goto不能跳转for语句里吗?我之前有考虑过是不是for的问题,所以在for里只定义了set变量,然后再for外if判断,可是还是一样出现实际与逻辑不符的结果。
作者: Batcher 时间: 2023-3-22 15:28
回复 4# lonron
是的。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |