bat 文件中的 else 语句无法识别变量
Variable not recognized in else statement in a bat file
我有以下代码:
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
您直接在 set c=
之后直接将 if 语句告诉 goto :loop
,现在它没有任何价值。将 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
以退出循环。
我有以下代码:
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
您直接在 set c=
之后直接将 if 语句告诉 goto :loop
,现在它没有任何价值。将 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
以退出循环。