如果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部分也被执行了。
@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
所以它们在全局范围内是可用的。这是因为解析后的代码替换了 %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 /?
.
你应该移动你的 :Result
块的外面(例如,在 :END 的上方是一个合适的位置;只要在 if 块的外面放一个 goto End
在...之前 :Result
块,以免不必要的碰到这个)。) 然后 call :Result
不 goto 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)和一些教程。我不会再更新我的答案了,抱歉。反正这个问题已经关闭了。