我的同事和我一直在整理头发。
我们有一个简单的Windows批处理文件。我们希望它从我们以编程方式生成其文件路径的文本文件中读取,获取此文件中的单个数值,并将其与本地变量进行比较。但是我们的行为完全莫名其妙。
该文件包含一个标量数字,例如数字2.这是代码:
ThisAppFlagFileName=foo.txt
if not exist "%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%" (
ECHO do something here
) else (
SET /P InstalledVersion=<"%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%"
ECHO We think the file contains: %InstalledVersion%
IF %InstalledVersion% GEQ %ThisVersionInstallDataNum% (
ECHO Version %ThisVersion% of the %ThisAppVisibleName% has already been installed for this user; exiting.
GOTO TheEnd
)
)
:TheEnd
Echo END
我们一直收到错误信息2 was unexpected at this time.
因此,我们插入了一些跟踪消息,以防else
出现问题,并坚持使用两个不同的if
语句:
ThisAppFlagFileName=foo.txt
if not exist "%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%" (
ECHO do something here
)
ECHO Trace Message 1 before IF
if exist "%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%" (
ECHO Trace Message 2 after IF before CD
SET /P InstalledVersion=<%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%"
ECHO We think the file contains: %InstalledVersion%
IF %InstalledVersion2% GEQ %ThisVersionInstallDataNum% (
ECHO Version %ThisVersion% of the %ThisAppVisibleName% has already been installed for this user; exiting.
GOTO TheEnd
)
)
:TheEnd
Echo END
我们只看到 第一条跟踪消息(在if
语句之前),而不是第二条跟踪消息。所以我们的结论是文件的内容被插入到行if exist "%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%"
中,但当然我们不明白为什么第一个if not exist
可以工作但是第二个没有。
有人能发现错误吗?环境是Windows 7 cmd.exe
窗口,但我们希望部署到Windows 7和Windows XP。
答案 0 :(得分:2)
这里的问题是在执行其中的SET / P语句之前评估整个IF表达式。 InstalledVersion尚未设置,因此评估此无效表达式:
IF GEQ 2 (
IF表达式内部没有任何内容执行,因为它无法完全评估。
解决方案是启用delayed expansion并使用!InstalledVersion!替换%InstalledVersion%,如this post中所述。
您还可以重构代码,以便在IF表达式之后进行GEQ比较。
答案 1 :(得分:2)
您的代码有几个错误。第一行:
ThisAppFlagFileName=foo.txt
错过了set
命令,因此尝试将其作为ThisAppFlagFileName
命令执行。这意味着您的程序中未定义ThisAppFlagFileName
变量,因此永远不会从文件中读取InstalledVersion
变量。
对InstalledVersion
变量的所有引用都必须使用延迟扩展,即将它们括在感叹号之间而不是百分比,并在程序开头包含setlocal EnableDelayedExpansion
命令。
setlocal EnableDelayedExpansion
set ThisAppFlagFileName=foo.txt
if not exist "%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%" (
ECHO do something here
) else (
SET /P InstalledVersion=<"%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%"
ECHO We think the file contains: !InstalledVersion!
IF !InstalledVersion! GEQ %ThisVersionInstallDataNum% (
ECHO Version %ThisVersion% of the %ThisAppVisibleName% has already been installed for this user; exiting.
GOTO TheEnd
)
)
:TheEnd
Echo END
您必须知道,在括号中修改的所有变量也必须用感叹号括起来,而不是百分号。有关详细信息,请搜索“延迟扩展”。