当变量为空时,IF变量LSS变量失败

时间:2017-03-22 14:16:01

标签: batch-file if-statement

我有以下批处理文件将检查和比较两个变量,但是,当其中一个变量为空时它失败..任何想法如何处理LocalVersion可以为空的情况,也就是文件version.txt不存在。

test.bat的:

for /f "tokens=1 " %%a in ('%Tools%\cat.exe version.txt') do set LocalVersion=%%a
for /f "tokens=1 " %%a in ('%Tools%\cat.exe \\UNC_Share\version.txt') do set RemoteVersion=%%a

echo LocalVersion %LocalVersion%
echo RemoteVersion %RemoteVersion%

if %LocalVersion% LSS %RemoteVersion% ( goto :skip )
if %LocalVersion% GTR %RemoteVersion% ( goto :Update)

结果:

c:\test.bat
LocalVersion
RemoteVersion 4.0.1
4.0.1 was unexpected at this time.

1 个答案:

答案 0 :(得分:1)

对于版本的比较,如果版本号包含点,强烈建议不要运行文字比较。最好将带有点的版本号转换为整数并比较整数。

示例1使用乘法和加法:

@echo off
setlocal EnableExtensions
set "LocalVersion=0.0.0"
set "LocalVersNum=0"
set "RemoteVersion=0.0.0"
set "RemoteVersNum=0"

if exist "version.txt" (
    for /F "usebackq tokens=1-3 delims=." %%A in ("version.txt") do (
        set "LocalVersion=%%A.%%B.%%C"
        set /A LocalVersNum=%%A * 1000000 + %%B * 1000 + %%C
    )
)
if exist "\\Sever\Share\version.txt" (
    for /F "usebackq tokens=1-3 delims=." %%A in ("\\Sever\Share\version.txt") do (
        set "RemoteVersion=%%A.%%B.%%C"
        set /A RemoteVersNum=%%A * 1000000 + %%B * 1000 + %%C
    )
)

if %LocalVersNum% LSS %RemoteVersNum% goto Skip
if %LocalVersNum% GTR %RemoteVersNum% goto Update

echo %LocalVersion% is equal %RemoteVersion%.
goto EndBatch

:Skip
echo %LocalVersion% is lower %RemoteVersion%.
goto EndBatch

:Update
echo %LocalVersion% is greater %RemoteVersion%.

:EndBatch
endlocal

示例2使用位操作:

@echo off
setlocal EnableExtensions
set "LocalVersion=0.0.0"
set "LocalVersNum=0"
set "RemoteVersion=0.0.0"
set "RemoteVersNum=0"

if exist "version.txt" (
    for /F "usebackq tokens=1-3 delims=." %%A in ("version.txt") do (
        set "LocalVersion=%%A.%%B.%%C"
        set /A "LocalVersNum=(%%A << 24) | (%%B << 16) | %%C"
    )
)
if exist "\\Sever\Share\version.txt" (
    for /F "usebackq tokens=1-3 delims=." %%A in ("\\Sever\Share\version.txt") do (
        set "RemoteVersion=%%A.%%B.%%C"
        set /A "RemoteVersNum=(%%A << 24) | (%%B << 16) | %%C"
    )
)

if %LocalVersNum% LSS %RemoteVersNum% goto Skip
if %LocalVersNum% GTR %RemoteVersNum% goto Update

echo %LocalVersion% is equal %RemoteVersion%.
goto EndBatch

:Skip
echo %LocalVersion% is lower %RemoteVersion%.
goto EndBatch

:Update
echo %LocalVersion% is greater %RemoteVersion%.

:EndBatch
endlocal

这两个示例都会为LocalVersion提供正确的结果,例如4.0.10RemoteVersion4.0.9,其中像if %LocalVersion% LSS %RemoteVersion% goto Skip这样的字面比较会产生错误的结果

命令行

if "%LocalVersion%" LSS "%RemoteVersion%" goto Skip

结果总是在文字比较中,因为在比较字符串时不会忽略双引号。因此,使用双引号时,在使用整数比较对两个值进行从字符串到整数的隐式转换之后,不再比较引用的值,而是进行字符串比较。

如果两个version.txt文件中的一个不存在,则由于语法错误而导致批处理执行退出的解决方案是使用环境变量的初始化。

每个 FOR 之前的额外if exist条件是为了避免在执行命令 FOR 时出现错误消息,并且相应的version.txt文件不会存在。

FOR 直接读取version.txt文件而没有从Unix移植到Windows的工具cat,因此在Windows上默认不可用。 cat的本机Windows命令是type,这里很可能不需要这些命令。