如何解决bat文件中else语句中无法识别的变量
我有以下代码:
ECHO OFF
:LOOP
set c=
setlocal ENABLEDELAYEDEXPANSION
tasklist | find /i "calc.exe" >nul 2>&1
IF %ERRORLEVEL% == 0 (
ECHO easymeetingOnCall is running
taskkill /IM calc.exe /F
set c=true
Timeout /T 10
goto LOOP
) ELSE (
IF "!c!" == "true" (
ECHO l'applicazione easymeetingOnCall è spenta.
Timeout /T 10
goto exitLoop
)
ECHO easymeetingOnCall is not running
Timeout /T 5 /Nobreak
GOTO LOOP
)
:exitLoop
我的问题是遵循条件
IF "!c!" == "true"
进入else语句,无法识别。
如果我写echo !c!
,则不会输出任何结果。
我以前set enabledelayedexpansion
,所以我不知道为什么会这样。
你能帮我吗? 谢谢大家。
解决方法
仔细查看以下摘录的代码。
ECHO OFF
:LOOP
set c=
....
set c=true
goto :LOOP
您正在将goto :loop
后面的if语句显式告诉set c=
,现在它没有任何价值。将set c=
移到上方以标记以保留您设置的值。
但是,我建议进行一些更改。您可以在没有delayedexpansion
的情况下摆脱困境,并确实需要所有的for循环。使用taskkill
显式搜索该应用程序比列出所有应用程序要好,@ Mofi在评论中也已提及您。最后,设置单个字符变量并不是一个很好的习惯,尽管它并不总是会引起问题,我建议使用多个字符变量名。我刚刚将您的变量%c%
更改为%_c%
@echo off & set _c=
:loop
tasklist /FI "IMAGENAME eq Calc.exe" | find /i "Calc"
goto :_%errorlevel%
:_0
ECHO easymeetingOnCall is running
taskkill /IM calc.exe /F
set _c=true
Timeout /T 10
goto loop
:_1
IF "%_c%" == "true" (
ECHO l'applicazione easymeetingOnCall è spenta.
Timeout /T 10
goto exitloop
)
ECHO easymeetingOnCall is not running
Timeout /T 5 /Nobreak
goto loop
:exitloop
编辑,因为您希望使用列表:
@echo off & set _c=
set "list=calc.exe StickyNot.exe wordpad.exe"
for %%a in (%list%) do call :loop %%a
goto :eof
:loop
set task=%1
tasklist /FI "IMAGENAME eq %1" | find /i "%1"
if not errorlevel 1 (
ECHO easymeetingOnCall is running %1
taskkill /IM %1 /F
set _c=true
Timeout /T 10
)
if "%_c%" == "true" (
ECHO l'applicazione easymeetingOnCall è spenta. %1
Timeout /T 10
goto exitloop
)
echo easymeetingOnCall is not running %1
Timeout /T 5 /Nobreak
goto :loop
:exitloop
请注意,如果第一个进程未运行,它将永远循环直到找到为止,然后仅将其杀死并转到下一个进程。如果您不希望这样做,请在最后一行更改goto :loop
以退出循环。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。