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 以退出循环。