我有以下批处理文件将检查和比较两个变量,但是,当其中一个变量为空时它失败..任何想法如何处理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.
答案 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.10
和RemoteVersion
为4.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
,这里很可能不需要这些命令。