变量未在批处理文件

时间:2015-08-05 12:13:43

标签: batch-file

我有一个简单的批处理脚本,它将读取文件version.property中的值并执行某个作业,我的代码在下面

TITLE StartEODMaintenance
echo off
cls
set "Build=0"

call:FindString "MAINALGO"
IF /I "%Build%" == "MAINALGO" (
echo "start job on MainAlgo"
) else (
    call:FindString "DRSITEALGO"
    echo build value %Build%
    IF /I "%Build%" == "DRSITEALGO" (
        echo "start job on secondAlgo"
    ) else (
    echo "sth wrong"    
    )
)

:FindString
echo funtioninput %~1
find /I /C "%~1" version.property
if %errorlevel%==1 (
echo "errorlevel 1"
set "Build=0"
)
if %errorlevel%==0 (
echo "errorlevel 0" 
set "Build=%~1"
echo build value in function %Build%
)
:end 

version.property中的内容位于

之下
DRSITEALGO

问题是我发现程序执行时看起来下面的行工作不正确。变量Build未设置为"%〜1"

中的值
set "Build=%~1" 

我得到以下作为输出

funtioninput MAINALGO

---------- VERSION.PROPERTY: 0
"errorlevel 1"
funtioninput DRSITEALGO   ---> the %~1 show the correct value, DRSITEALGO   

---------- VERSION.PROPERTY: 1    
"errorlevel 0"
build value in function 0   ---> here is wrong! the Build variable somehow didn't get updated, it suppose to be DRSITEALGO   
build value 0
"sth wrong"

不确定我必须设置任何东西以使其有效吗?

2 个答案:

答案 0 :(得分:1)

解析命令时会扩展%variables%,并且立即解析后面的命令if 。因此,当你在块中设置一个变量时,它的以下用法(在此echo中)已经被扩展,它会导致在进入块之前显示有效的值!

您需要delayed expansion才能在使用它们时读取变量值,而不是解析它们。首先,发出命令:

setlocal EnableDelayedExpansion

然后在同一个块中引用先前修改过的变量!variable!

if %errorlevel%==0 (
echo "errorlevel 0" 
set "Build=%~1"
echo build value in function !Build!
)

答案 1 :(得分:0)

最大的问题是您的脚本继续作为主运行时的一部分:FindString。在第6行,您call :FindString "MAINALGO",然后您有一个IF代码块。在该代码块之后,您应该exit /bgoto :EOF或者某些东西来停止主运行时的执行,但是您没有。相反,您的脚本会在第二个非预期的时间内继续:FindString,将%ERRORLEVEL%设置为find /I /C "" version.property,然后一直持续到最后。

您可能感兴趣的其他内容是conditional execution。而不是

find /I /C "%~1" version.property
if %errorlevel%==1 (
echo "errorlevel 1"
set "Build=0"
)
if %errorlevel%==0 (
echo "errorlevel 0" 
set "Build=%~1"
echo build value in function %Build%
)

......或......

find /I "%~1" version.property
if errorlevel 1 (
    echo "errorlevel 1"
    set "Build=0"
) else (
    echo "errorlevel 0" 
    set "Build=%~1"
    echo build value in function %Build%
)

...你可以将你的代码浓缩得像这样:

find /I "%~1" version.property && (
    echo "errorlevel 0" 
    set "Build=%~1"
    echo build value in function %Build%
) || (
    echo "errorlevel 1"
    set "Build=0"
)

我还建议您在缩进和格式化时避免懒惰。虽然您的代码不是nearly as bad as it could be,但如果您缩进代码块,仍然可以更轻松地查看:FindString中发生的情况。

无论如何,看看你是否有更好的运气:

TITLE StartEODMaintenance
echo off
cls
set "Build=0"

call :FindString "MAINALGO"

IF /I "%Build%"=="MAINALGO" (
    echo "start job on MainAlgo"
) else (
    call :FindString "DRSITEALGO"
    echo build value %Build%
    IF /I "%Build%"=="DRSITEALGO" (
        echo "start job on secondAlgo"
    ) else (
        echo "sth wrong"
        rem // exit non-zero
        exit /b 1
    )
)

exit /b 0
rem // end main runtime / begin script functions

:FindString
find /I "%~1" version.property && (
    echo "errorlevel 0" 
    set "Build=%~1"
    echo build value in function %~1
) || (
    echo "errorlevel 1"
    set "Build=0"
)