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