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

Aaaand 我不知所措。我试过玩括号。我已将最后一个 ) 移到与之前的同一行上,但它不起作用。问题是,它在定义时工作正常 。它似乎在 或 at 之后立即中断,因为它不会在之后立即插入 echo 命令。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 回答