0

私の同僚と私は、これについて一日中髪を引っ張っています.

簡単な Windows バッチ ファイルがあります。プログラムでファイル パスを生成しているテキスト ファイルから読み取り、このファイル内の単一の数値を取得し、それをローカル変数と比較します。しかし、私たちは完全に不可解な振る舞いをしています。

このファイルには、数値 2 などの 1 つのスカラー数値が含まれています。コードは次のとおりです。

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. ので、トレース メッセージを挿入し、問題があった場合に備えて、 2 つの異なるステートメント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

また、最初のトレース メッセージ (ステートメントの前)のみが表示され、2 番目のトレース メッセージは表示されません。したがって、私たちの結論は、何らかの形でファイルの内容が行に補間されているということですが、もちろん、最初の機能が機能するのに 2 番目の機能が機能しない理由はわかりません。ifif exist "%HOMEPATH%\ourcompanyname\%ThisAppFlagFileName%"if not exist

誰でも間違いを見つけることができますか?環境は Windows 7cmd.exeウィンドウですが、Windows 7 と Windows XP の両方に展開したいと考えています。

4

2 に答える 2

2

あなたのコードにはいくつかのエラーがあります。最初の行:

ThisAppFlagFileName=foo.txt

コマンドを逃したsetので、コマンドとして実行しようとしますThisAppFlagFileName。これは、変数がプログラムで定義されていないことを意味するThisAppFlagFileName ためInstalledVersion変数がファイルから読み取られることはありません。

variableへのすべての参照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 に答える
2

ここでの問題は、IF 式全体がその中の SET /P ステートメントを実行する前に評価されることです。InstalledVersion はまだ設定されていないため、次の無効な式が評価されます。

IF GEQ 2 (

IF 式は完全には評価できないため、内部では何も実行されません。

この投稿で説明されているように、遅延拡張を有効にして %InstalledVersion% を !InstalledVersion! に置き換えることで解決できます。

IF 式の後に GEQ 比較が行われるようにコードを再構築することもできます。

于 2013-08-03T01:52:17.653 に答える