Batch file 如果在运行批处理文件时未执行ELSE

Batch file 如果在运行批处理文件时未执行ELSE,batch-file,if-statement,cmd,Batch File,If Statement,Cmd,如果已经定义了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%

如果已经定义了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节。 当VAR!=值,甚至比:正在执行结果节。
有什么建议吗?

您应该将
:Result
块移到if块之外(例如,就在:END上方是一个合适的位置;只需在
:Result
块之前放置一个
转到END
,以避免不必要的运行)。然后在if块内调用:Resultnot
goto Result

有关更多文档,请在命令行上执行
call/?
(也可以执行
goto/?
以供参考)。这也适用于所有其他命令,例如,
set/?
if/?
,等等

由于我看不到您将值设置为
VAR
的位置,您当前的条件
如果定义了VAR
将始终为false。因此,我认为您的脚本需要比移动结果块更谨慎。或者它只是一个简化的例子,那么就不用担心了;)
可以在if条件之前放置一个
echo%VAR%
,以进行调试并验证是否存在值

出于调试目的,请尝试在第一行中的上使用
@ECHO。这为您提供了批处理文件执行的所有步骤,并有助于查找错误

在第二次代码更新后更新: 尝试这样的结构:

[...]

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

[...]

:eof
这样,当解释器从上到下运行时,您可以防止:Result块被执行。
此外,我建议不要使用符号和链(
&
)。如果可能的话,在每行中选择一个命令。
您没有添加所有
%
符号。没有它们,你发布的代码就毫无意义。
另外,您似乎完全删除了:Result块,但仍将其称为…
我很困惑


请查看其他来源的帮助,例如www.ss64.com(CMD)和一些教程。对不起,我下次不会更新我的答案。无论如何,这个问题已经结束。

您应该将
:Result
块移到if块之外(例如,就在:END上方将是一个合适的位置;只需在
:Result
块之前放置一个
转到END
,以避免不必要的运行)。然后在if块内调用:Result
not
goto Result

@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"
有关更多文档,请在命令行上执行
call/?
(也可以执行
goto/?
以供参考)。这也适用于所有其他命令,例如,
set/?
if/?
,等等

由于我看不到您将值设置为
VAR
的位置,您当前的条件
如果定义了VAR
将始终为false。因此,我认为您的脚本需要比移动结果块更谨慎。或者它只是一个简化的例子,那么就不用担心了;)
可以在if条件之前放置一个
echo%VAR%
,以进行调试并验证是否存在值

出于调试目的,请尝试在第一行中的上使用
@ECHO。这为您提供了批处理文件执行的所有步骤,并有助于查找错误

在第二次代码更新后更新: 尝试这样的结构:

[...]

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

[...]

:eof
这样,当解释器从上到下运行时,您可以防止:Result块被执行。
此外,我建议不要使用符号和链(
&
)。如果可能的话,在每行中选择一个命令。
您没有添加所有
%
符号。没有它们,你发布的代码就毫无意义。
另外,您似乎完全删除了:Result块,但仍将其称为…
我很困惑

请查看其他来源的帮助,例如www.ss64.com(CMD)和一些教程。对不起,我下次不会更新我的答案。这个问题已经结束了

@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
命令名和值周围添加了双引号,以防止包含尾随空格

VAR2
VAR3
使用与
ENDLOCAL
相同的解析代码进行设置,因此它们在全局范围内可用。这是因为在执行
SETLOCAL
和执行
SET
命令之前,解析的代码将
%VAR2%
替换为它的值

添加了
EXIT/b0
以结束代码,以便在代码结束时不执行
:Result

设置变量的输出

如果通过删除行
未定义VAR,则设置“VAR=value”

许多命令都有帮助信息,因此可以使用
command/?
。命令可以是示例
set/?

SET
命令名和值周围添加了双引号,以防止包含尾随空格

VAR2
VAR3
使用与
ENDLOCAL
相同的解析代码进行设置,因此它们在全局范围内可用。这是因为在执行
SETLOCAL
和执行
SET
命令之前,解析的代码将
%VAR2%
替换为它的值

添加了
EXIT/b0
以结束代码,以便在代码结束时不执行
:Result

设置变量的输出

如果通过删除行
未定义VAR,则设置“VAR=value”


许多命令都有帮助信息,因此可以使用
command/?
。命令可以是示例
set/?

上述代码将始终将
VAR2
设置为(非空)值。请张贴真实代码,包括设置
VAR
和echo
VAR2
的部分。请注意,如果查看批处理文件外部的
VAR2
,由于
setlocal
,在批处理文件内部设置的任何值都将丢失。如果不是因为Goto的错误使用,这些c