2013-04-01 8 views
5

OK、いくつかのネストされたIF EXISTステートメントを実行して、カップルフォルダの有無を確認しようとしています。最初のフォルダが存在する場合は、Folder1を1に設定してから、インストールにスキップします。 Folder2と同じですが、どちらのフォルダも存在しない場合は、インストールをスキップしてください。バッチファイル内にExistステートメントがある場合

しかし、Folder1が存在しない場合でも、これは%Folder1%を1に設定します。何が失われている/していないのですか?

ありがとうございます!

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 

答えて

11

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=" 

が問題になっている環境変数を防ぐために、環境から削除されることを保証していること:ここで

の結果です古くなった情報に誤った結果を与えるコード。

+0

このコメントシステムは、(私はこのコメントシステムの使用方法がわからない限り)嫌です。 Peter、私はあなたの簡単な解決策を試しましたが、C:\ Folder1が存在しない場合でも、常にFolder1を1に設定します。 – Brian

+0

すべての確率で、変数は以前の実行によってSETされました。変数を環境から削除するには、変数を明示的に何も設定しないでください。だからこそ、ほとんどのバッチプログラムは '@echo off'の直後に' SETLOCAL'を持っています。 'setlocal'では、ルーチンの終了時に環境の変更が取り消されます。 – Magoo

+0

OK、SET "folder1 ="を先に行ったり、SETLOCALをゼロにしたりしていませんでした。だから、古いデータを使用していた可能性があります。もう一度試してみましょう。 – Brian

1
if exist "c:\folder1" (
     set Folder1=1 
     echo %Folder1% 
     goto install 
) if exist "c:\folder2" (
     set Folder2=1 
     echo %Folder2% 
     goto Install 
) else goto Install 

:Install 
0

このコードでは、folder1が存在しない場合は%folder1%= 1に設定されず、この場合出力は生成されません。 Folder1が存在しない場合AND Folder2が存在するTHEN%folder2%が1に設定されます。それ以外の場合は%folder2%は空です。 echoコマンドのあとに、変数が空の場合は出力を抑止するために、閉じられていない左括弧を挿入します。

@echo off &setlocal 
if exist "c:\folder1" set "Folder1=1" 
echo(%Folder1% 
if not defined Folder1 if exist "c:\folder2" set "Folder2=1" 
echo(%Folder2% 
goto Install 

:Install 
endlocal 
+0

このソリューションは、もっと複雑なコードですが、うまくいくようです。もう少しテストする必要がありますが、Folder1が存在しているか、folder2が存在しているか、どちらも存在していない場合に動作します。 – Brian

+0

これは** else **のように機能し、folder1が存在しない場合はfolder2のみをテストします。 – Endoro

関連する問題