20

IF ELSE別のステートメント内にネストされたステートメントを作成しようとしていIFます。ここに私が持っているものがあります:

IF %dirdive%==1 ( 
    IF DEFINED log (
        ECHO %DATE%, %TIME% >> %log%
        FOR /R %root1% %%G IN (.) DO (
            SET _G=%%G
            CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% %log%
        )
        GOTO :end
    ) ELSE ( 
        ECHO %DATE%, %TIME%
        FOR /R %root1% %%G IN (.) DO (
            SET _G=%%G
            CALL :TESTEVERYTHINGnolog !_G:~0,-1! %root1% %root2%
        )
        GOTO :end
    )
)

logが定義されていない場合、次のようになります。

The syntax of the command is incorrect.
ECHO Wed 07/18/2012, 15:50:12.34 >>

ああ、私は途方に暮れています。括弧で遊んでみました。最後の ) を前の行と同じ行に移動しましたが、機能しません。問題は、が定義されている場合に正常に動作する ことです。直後に挿入されたエコーコマンドに到達しないため、直後またはで壊れているようです。log IF %dirdive%==1

4

5 に答える 5

19

問題の原因は、IF ステートメントの分岐が実行されない場合でも、有効な構文が必要であるということです。

が定義されていない場合logは、次の行

ECHO %DATE%, %TIME% >> %log%

logが定義されていない場合は、次のように展開されます

ECHO someDate, someTime >>

リダイレクト後にファイル名がないため、構文エラーが発生します。

log変数が引用符で囲まれて定義されていない限り(定義されている場合)、次のように行を変更するだけで修正できます。

ECHO %DATE%, %TIME% >> "%log%"

logが未定義の場合、その行は次のように展開されます

ECHO someDate, someTime >> ""

これは有効な構文です。実行すると「指定されたパスが見つかりません」というエラーで失敗しますが、ログが定義されていないため実行されません:-)

編集

おそらく、より良い解決策は、 が定義されている場合にのみ、値にリダイレクト演算子を含む新しい変数を定義することですlog。そうすれば、大きな IF ステートメントも必要なくなり、コードの保守が容易になります。

SET "redirect="
IF DEFINED log SET "redirect=>>!log!"
IF %dirdive%==1 (
  ECHO %DATE%, %TIME% %redirect%
  FOR /R %root1% %%G IN (.) DO (
    SET _G=%%G
    CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% %log%
  )
  GOTO :end
)

%redirect%ECHO ステートメントでは通常の展開を使用する必要があることに注意してください。コマンド パーサーのリダイレクト フェーズは遅延展開の前に発生するため、遅延展開!redirect!は機能しません。

于 2012-07-18T20:41:31.597 に答える
1

別の解決策は、GOTO を使用することです。それほどエレガントではないかもしれませんが、理解しやすいです。

IF %dirdive%==1 ( 
    IF DEFINED log GOTO logdefined ELSE GOTO nolog
)

:logdefined
ECHO %DATE%, %TIME% >> %log%
FOR /R %root1% %%G IN (.) DO (
    SET _G=%%G
    CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% %log%
)
GOTO :end

:nolog
ECHO %DATE%, %TIME%
FOR /R %root1% %%G IN (.) DO (
    SET _G=%%G
    CALL :TESTEVERYTHINGnolog !_G:~0,-1! %root1% %root2%
)
GOTO :end
于 2013-11-22T18:19:44.993 に答える
0

に変更IF DEFINED log: IF EXIST log。以下は私にとってはうまくいきます:

echo off
set log=log.txt
set /p dirdive= Enter a directory:
IF %dirdive%==1 ( 
    IF EXIST %log% (
        ECHO "in IF" %DATE%, %TIME% >> %log%
        FOR /R %root1% %%G IN (.) DO (
            SET _G=%%G
            CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% %log%
        )
        GOTO :end
    ) ELSE ( 
        ECHO "in ELSE" %DATE%, %TIME%
        FOR /R %root1% %%G IN (.) DO (
            SET _G=%%G
            CALL :TESTEVERYTHINGnolog !_G:~0,-1! %root1% %root2%
        )
        GOTO :end
    )
)
:end
于 2012-07-18T20:04:26.113 に答える
0
****@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION****
IF %dirdive%==1 ( 
    IF DEFINED log (
        ECHO %DATE%, %TIME% >> ****!log!****
        FOR /R %root1% %%G IN (.) DO (
            SET _G=%%G
            CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% ****!log!****
        )
        GOTO :end
    ) ELSE ( 
        ECHO %DATE%, %TIME%
        FOR /R %root1% %%G IN (.) DO (
            SET _G=%%G
            CALL :TESTEVERYTHINGnolog !_G:~0,-1! %root1% %root2%
        )
        GOTO :end
    )
)
****@ENDLOCAL****

ジョアン・マコーミック

于 2013-09-20T21:09:41.817 に答える
-2
@if not "%1" == "max" (start /MAX cmd /Q /C %0 max&X)ELSE title %random%&set C=1&set D=2&wmic process where name="cmd.exe" CALL setpriority "REALTIME">NUL&CLS
:Y
color %D%&ECHO %random%%C%%random%%random%%random%%random%6%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%
IF %C% EQU 46 (TIMEOUT /T 1 /NOBREAK>nul&set C=1&CLS&IF %D% EQU 9 (set D=1)ELSE set /A D=%D%+1)ELSE set /A C=%C%+1
goto Y

`

于 2014-12-26T01:47:45.300 に答える