2つの基本的な問題:
複合文を括弧に入れておく必要があります。 カッコ内では、変数値の変更は表示されません。SETLOCAL ENABLEDELAYEDEXPANSION
を実行していない限り、!var!を使用する必要があります。ない%のVAR%だから、
:
SETLOCAL ENABLEDELAYEDEXPANSION
if exist "c:\folder1" (
set Folder1=1
echo !Folder1!
goto install
) else if exist "c:\folder2" (
set Folder2=1
echo !Folder2!
goto Install
) else goto Install
:Install
好ましく、
@ECHO off
if exist "c:\folder1" (
set Folder1=1
goto install
) else if exist "c:\folder2" (
set Folder2=1
goto Install
) else goto Install
:Install
SET folder
あるいは単純
@ECHO off
if exist "c:\folder1" set Folder1=1&goto install
if exist "c:\folder2" set Folder2=1&goto Install
:Install
SET folder
テスト:
@ECHO OFF
setlocal
SET "folder1="
SET "folder2="
ECHO.----------No folders
DIR /b /ad c:\folder*
CALL :test
ECHO.----------Folder 1 only
MD c:\folder1
DIR /b /ad c:\folder*
CALL :test
ECHO.----------Folder 2 only
RD c:\folder1
MD c:\folder2
DIR /b /ad c:\folder*
CALL :test
ECHO.----------Both
MD c:\folder1
DIR /b /ad c:\folder*
CALL :test
RD c:\folder1
RD c:\folder2
GOTO :eof
:test
if exist "c:\folder1" set Folder1=1&goto install
if exist "c:\folder2" set Folder2=1&goto Install
:Install
SET folder
SET "folder1="
SET "folder2="
GOTO :eof
このテストでは、問題の2つのディレクトリが作成され、削除されます。
----------No folders
----------Folder 1 only
folder1
Folder1=1
----------Folder 2 only
folder2
Folder2=1
----------Both
folder1
folder2
Folder1=1
注開始時に各レポートの後の両方で実行される
SET "folder1="
SET "folder2="
が問題になっている環境変数を防ぐために、環境から削除されることを保証していること:ここで
の結果です古くなった情報に誤った結果を与えるコード。
このコメントシステムは、(私はこのコメントシステムの使用方法がわからない限り)嫌です。 Peter、私はあなたの簡単な解決策を試しましたが、C:\ Folder1が存在しない場合でも、常にFolder1を1に設定します。 – Brian
すべての確率で、変数は以前の実行によってSETされました。変数を環境から削除するには、変数を明示的に何も設定しないでください。だからこそ、ほとんどのバッチプログラムは '@echo off'の直後に' SETLOCAL'を持っています。 'setlocal'では、ルーチンの終了時に環境の変更が取り消されます。 – Magoo
OK、SET "folder1 ="を先に行ったり、SETLOCALをゼロにしたりしていませんでした。だから、古いデータを使用していた可能性があります。もう一度試してみましょう。 – Brian