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

从Windows批处理文件中的文件读取简单数值时出现问题,windows,batch-file,Windows,Batch File,我的同事和我整天都在为这件事发愁 我们有一个简单的Windows批处理文件。我们希望它从一个文本文件中读取,我们正在以编程方式生成该文件的文件路径,获取该文件中的单个数值,并将其与局部变量进行比较。但我们有了完全无法解释的行为 该文件包含单个标量数,如数字2。代码如下: ThisAppFlagFileName=foo.txt if not exist "%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%" ( ECHO do something

我的同事和我整天都在为这件事发愁

我们有一个简单的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
我们只看到第一条跟踪消息(在
if
语句之前),而没有看到第二条跟踪消息。因此,我们的结论是,文件的内容以某种方式被插入到行
if exist”%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%
,但我们当然不理解为什么第一个
if exist
可以工作,而第二个不行


有人能认出这个错误吗?环境是Windows 7
cmd.exe
window,但我们希望同时部署到Windows 7和Windows XP。

这里的问题是,在执行其中的SET/p语句之前,会对整个IF表达式进行求值。尚未设置InstalledVersion,因此将计算此无效表达式:

IF GEQ 2 (
IF表达式内部不会执行任何内容,因为它无法完全求值

解决方案是启用%InstalledVersion%并将其替换为!已安装版本!,如中所述


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

这里的问题是,在执行整个IF表达式中的SET/p语句之前,对整个IF表达式进行求值。尚未设置InstalledVersion,因此将计算此无效表达式:

IF GEQ 2 (
IF表达式内部不会执行任何内容,因为它无法完全求值

解决方案是启用%InstalledVersion%并将其替换为!已安装版本!,如中所述


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

您的代码有几个错误。第一行:

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
setlocal EnableDelayedExpansion
设置ThisAppFlagFileName=foo.txt
如果不存在“%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%”(
我在这里做点什么
)否则(

SET/P InstalledVersion=

您的代码有几个错误。第一行:

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
setlocal EnableDelayedExpansion
设置ThisAppFlagFileName=foo.txt
如果不存在“%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%”(
我在这里做点什么
)否则(

SET/P InstalledVersion=您根本没有读取该文件的内容。您正在将
InstalledVersion
设置为
抱歉。我忘记了/P开关。我已编辑了代码。联机引用表明SET/P不接受
SET/P something=@KenWhite-SET/P与重定向一起工作,读取stdin的任何命令也是如此。但是它只读取文件的第一行。OP的文件可能有很多行。@dbenham:你能引用一个引用吗?它在这里不起作用(Win7 64)在评论之前我做的快速测试中。你根本没有阅读文件的内容。你正在将
InstalledVersion
设置为
抱歉。我忘记了/p开关。我编辑了代码。在线参考表明SET/p确实接受
SET/p something=@KenWhite-SET/p可以重定向,就像任何命令t一样hat读取stdin。但它只读取文件的第一行。OP的文件可能有许多行。@dbenham:你能引用一个引用吗?它在这里不起作用(Win7 64)在评论之前的快速测试中,我做了。谢谢,马克!成功了。修复,修复!谢谢,马克!成功了。修复,修复!谢谢,阿奇尼!缺失的
set
只是抄写到StackOverflow时的一个打字错误,但其他东西意义非凡。谢谢!谢谢,阿奇尼!缺失的
set
只是抄写到StackOverflow时的一个打字错误N归因于StackOverflow,但其他东西很有意义。谢谢!