0

我和我的同事整天都在为此烦恼。

我们有一个简单的 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语句之前),没有看到第二条跟踪消息。所以我们的结论是文件的内容以某种方式被插入到 lineif exist "%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%"中,但是我们当然不明白为什么第一个if not exist有效,而第二个无效。

请问有人能看出错误吗?环境是Windows 7cmd.exe窗口,但我们希望同时部署到Windows 7和Windows XP。

4

2 回答 2

2

这里的问题是整个 IF 表达式在其中的 SET /P 语句可以执行之前被评估。InstalledVersion 尚未设置,因此会评估此无效表达式:

IF GEQ 2 (

IF 表达式中的任何内容都不会执行,因为它不能被完全评估。

一种解决方案是启用延迟扩展并将 %InstalledVersion% 替换为 !InstalledVersion!,如本文所述。

您还可以重构代码,以便 GEQ 比较发生在 IF 表达式之后。

于 2013-08-03T01:52:17.653 回答
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

您必须注意,在括号内修改的所有变量也必须用感叹号而不是百分号括起来。搜索“延迟扩展”了解详情。

于 2013-08-03T04:23:44.820 回答