当我运行批处理文件时,IF ELSE没有被执行。

问题描述 投票:0回答:1

如果VAR已经被定义,我想根据下面的代码来设置VAR2和其他变量。

@ECHO ON
SET ABC=IQ
SET VAR=value
ECHO %VAR%
VERIFY OTHER 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 (
    ECHO Unable to enable extensions
)
IF DEFINED VAR (
    IF "%VAR%" == "code" call :Result
    IF "%VAR%" == "code2" call :Result
    IF "%VAR%" == "value" call :Result
    SET VAR2=C:\abc\files
) ELSE (
    SET VAR2=C:\abc\file\pic & ECHO VAR not defined
)
endlocal & SET VAR3=val
:Result
      SET NAME=CODE & SET VAR2=C:\abc\file

当我执行上述代码时,我得到了输出。

SET ABC=IQ
SET VAR=valu
ECHO valu
valu
VERIFY OTHER 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 (ECHO Unable to enable extensions )
IF DEFINED VAR (
IF "valu" == "code" call :Result
 IF "valu" == "code2" call :Result
 IF "valu" == "value" call :Result
 SET VAR2=C:\abc\files
) ELSE (SET VAR2=C:\abc\file\pic & ECHO VAR not defined )
endlocal & SET VAR3=val
SET NAME=CODE & SET VAR2=C:\abc\file

但是,当VAR没有定义时,甚至比:RESULT部分也被执行了。

batch-file if-statement cmd
1个回答
1
投票
@ECHO ON
SET "ABC=IQ"
SET "VAR=value"
ECHO(%VAR%

VERIFY OTHER 2>nul

SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 (
    ECHO Unable to enable extensions
)

IF DEFINED VAR (
    IF "%VAR%" == "code" call :Result
    IF "%VAR%" == "code2" call :Result
    IF "%VAR%" == "value" call :Result
    SET "VAR2=C:\abc\files"
) ELSE (
    SET "VAR2=C:\abc\file\pic" & ECHO VAR not defined
)

rem Set VAR2, VAR3 and NAME outside the current local scope.
ENDLOCAL & (
    SET "VAR2=%VAR2%"
    SET "VAR3=val"
    SET "NAME=%NAME%"
)

rem Display variables set beginning with VAR and NAME.
SET VAR
SET NAME

rem End the code here to prevent continuing into the following label.
EXIT /B 0

:Result
    SET "NAME=CODE" & SET "VAR2=C:\abc\file"

添加了双引号 SET 命令名和值,以防止包含尾部空白。

VAR2VAR3 集,解析代码与 ENDLOCAL 所以它们在全局范围内是可用的。这是因为解析后的代码替换了 %VAR2% 的值,然后再执行 SETLOCAL 的任务,并将其转交给联合国。SET 命令。

添加了 EXIT /B 0 来结束代码,这样 :Result 不在代码末尾执行。

的输出。SET VAR:

VAR=value
VAR2=C:\abc\files
VAR3=val

如果VAR未定义,删除该行。SET "VAR=value":

VAR2=C:\abc\file\pic
VAR3=val

许多命令都有帮助信息,所以可以使用 command /?. 命令可以是例子 set /?.


0
投票

你应该移动你的 :Result 块的外面(例如,在 :END 的上方是一个合适的位置;只要在 if 块的外面放一个 goto End 在...之前 :Result块,以免不必要的碰到这个)。) 然后 call :Resultgoto Result 内的if块。更多文档请执行 call /? 在命令行上(也许还有 goto /? 以供参考)。) 这也适用于所有其他命令。set /?, if /? 例如,以此类推。

因为我看不出你在哪里设置了一个值为 VAR 您现在的状况 if defined VAR 将永远是false。所以我认为你的脚本需要比移动结果块更仔细。或者这只是一个简化的例子,那么没关系;) 也许把 echo %VAR% 前的if条件进行调试,并验证是否有一个值。

为了调试的目的,可以尝试在 @ECHO ON 在第一行。这给了你所有的批处理文件的步骤,并有助于发现错误。

在你的第二次代码更新后进行更新。

试试这样的结构

[...]

goto eof
:Result
  ... your result block here
goto eof

[...]

:eof

这样你就可以保护你的 :Result 块不被执行 当解释器只是从上到下运行的时候 另外,我建议不要使用安培链(&). 如果可能的话,最好每行一个命令。你没有把所有的 % 符号。你发布的代码没有这些符号就没有任何意义。另外,你似乎完全删除了:结果块,但你仍然调用它...... 我很困惑。

请查看其他来源的帮助,比如www.ss64.com (CMD)和一些教程。我不会再更新我的答案了,抱歉。反正这个问题已经关闭了。

© www.soinside.com 2019 - 2024. All rights reserved.