从Windows批处理文件中的文件中读取简单数值时出现问题

时间:2013-08-03 00:49:31

标签: windows batch-file

我的同事和我一直在整理头发。

我们有一个简单的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。

2 个答案:

答案 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

您必须知道,在括号中修改的所有变量也必须用感叹号括起来,而不是百分号。有关详细信息,请搜索“延迟扩展”。