簡體   English   中英

從Windows批處理文件中的文件讀取簡單數值時出現問題

[英]Problems reading simple numeric values from files in Windows batch files

我和我的同事整天都在拉扯頭發。

我們有一個簡單的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 exist "%HOMEPATH%\\ourcompanyname\\%ThisAppFlagFileName%"某種方式插值到該行中,但是我們當然不明白為什么第一個( if not exist起作用,而第二個卻if not exist沒錯

任何人都可以發現錯誤嗎? 環境是Windows 7 cmd.exe窗口,但是我們希望同時部署到Windows 7和Windows XP。

這里的問題是在執行其中的SET / P語句之前,先評估整個IF表達式。 InstalledVersion尚未設置,因此將評估此無效表達式:

IF GEQ 2 (

IF表達式內部什么都不會執行,因為它無法完全求值。

解決方案是啟用延遲擴展 ,並將%InstalledVersion%替換為!InstalledVersion !,如本文章中所述

您還可以重組代碼,以便在IF表達式之后進行GEQ比較。

您的代碼有幾個錯誤。 第一行:

ThisAppFlagFileName=foo.txt

錯過了set命令,因此嘗試將其作為ThisAppFlagFileName命令執行。 這意味着您的程序中未定義ThisAppFlagFileName 變量 ,因此永遠不會從文件中讀取InstalledVersion變量。

InstalledVersion變量的所有引用都必須使用Delayed Expansion,也就是說,將它們括在感嘆號之間,而不是百分數之間,並在程序開始時包含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

您必須意識到,所有在括號內修改的變量也必須用感嘆號代替百分號。 搜索“延遲擴展”以獲取詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM