我有一个简单的批处理脚本,它将读取文件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"
不确定我必须设置任何东西以使其有效吗?
答案 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 /b
或goto :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"
)