cmd中if条件“and”/“or”的批处理文件问题

Posted

技术标签:

【中文标题】cmd中if条件“and”/“or”的批处理文件问题【英文标题】:Question of batch file with if condition "and" / "or" in cmd 【发布时间】:2021-09-06 23:19:44 【问题描述】:

我想开发一个具有以下条件的批处理文件:

    检查 DayOfWeek 是否等于 Mon - Fri --> (True) --> 复制所有文件 --> (False) --> 转到检查下一个条件 检查 DayOfWeek 是否等于 Sat --> (True) --> 复制某些文件 --> (False) --> 去检查下一个条件 检查 DayOfWeek 是否等于星期日或公共假期 --> 显示错误消息并退出

(备注:我的想法是把那些公共假期商店的日期放到文本文件中,并获得价值来检查它。)

@ECHO OFF
FOR /F %%a IN ('Powershell -noP -c "(Get-Date).DayOfWeek.Value__"') DO SET week=%%a

IF %week% == "1" (GOTO ALLFOLDER) 
IF %week% == "2" (GOTO ALLFOLDER) 
IF %week% == "3" (GOTO ALLFOLDER)
IF %week% == "4" (GOTO ALLFOLDER)
IF %week% == "5" (GOTO ALLFOLDER)
IF %week% == "6" (GOTO CERTAINFOLDER)
IF %week% == "7" (ECHO ERROR! Script Exit!) EXIT(0)

ECHO Copying Files...
TIMEOUT /T 1 /NOBREAK > NUL
ECHO.
    
COPY C:\A.DAT E:\A.BAT
    
TIMEOUT /T 1 /NOBREAK > NUL

COPY C:\B.DAT E:\B.BAT
    
TIMEOUT /T 1 /NOBREAK > NUL

COPY C:\C.DAT E:\C.BAT
    
TIMEOUT /T 1 /NOBREAK > NUL

COPY C:\D.DAT E:\D.BAT
    
TIMEOUT /T 1 /NOBREAK > NUL
COPY C:\E.DAT E:\E.BAT

:ALLFOLDER
    ECHO Checking Folder....
    ECHO.

    IF EXIST %A% (

    ECHO A Folder Already Exists!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    ) ELSE (

    MKDIR %A%
    ECHO A Folder Created!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    )

    IF EXIST %B% (

    ECHO B Folder Already Exists!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    ) ELSE (

    MKDIR %B%
    ECHO B Folder Created!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    )

    IF EXIST %C% (

    ECHO C Folder Already Exists!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    ) ELSE (

    MKDIR %C%
    ECHO C Folder Created!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    )

    IF EXIST %D% (

    ECHO D Folder Already Exists!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    ) ELSE (

    MKDIR %D%
    ECHO D Folder Created!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    )

    IF EXIST %E% (

    ECHO E Folder Already Exists!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    ) ELSE (

    MKDIR %E%
    ECHO E Folder Created!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL
    
    )

    Powershell -noP -c "Write-Host 'INFO: Check Completed!' -ForegroundColor GREEN"
    TIMEOUT /T 2 /NOBREAK > NUL
    
:CERTAINFOLDER
    IF EXIST %A% (

    ECHO A Folder Already Exists!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    ) ELSE (

    MKDIR %A%
    ECHO A Folder Created!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    )

    IF EXIST %B% (

    ECHO B Folder Already Exists!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL

    ) ELSE (

    MKDIR %B%
    ECHO B Folder Created!
    ECHO.
    TIMEOUT /T 1 /NOBREAK > NUL
    
)

Powershell -noP -c "Write-Host 'INFO: Check Completed!' -ForegroundColor GREEN"
TIMEOUT /T 2 /NOBREAK > NUL

谢谢。

【问题讨论】:

您不需要这样的和/或条件,一般方法是@For /F %%G In ('%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoP "(Get-Date).DayOfWeek.Value__"') Do @If %%G Gtr 0 If %%G Equ 6 (Copy "CertainFiles") Else Copy "AllFiles"。在星期日之上添加额外的公共假期,(0),无论是直接还是从单独的文件中,都是一个完全不同的问题,与您的主要问题无关,所以我将把它留给您确定自己。 您正在进行字符串比较。如果引号在比较的一侧,则它们必须在比较的另一侧才能评估为 TRUE。 【参考方案1】:

这是另一种方法。 cmd 解释器可以“转到”标签。

@ECHO OFF
FOR /F %%A IN ('powershell -NoLogo -NoProfile -Command ^
    "@('sun', 'workday', 'workday', 'workday', 'workday', 'workday', 'sat')[$((Get-Date).DayOfWeek.Value__)]"') DO (SET "TARGET=%%~A")
GOTO %TARGET%

:sun
ECHO This is Sunday
GOTO TheEnd

:sat
ECHO This is Saturday
GOTO TheEnd

:workday
ECHO This is a workday
GOTO TheEnd

:TheEnd
EXIT /B

【讨论】:

【参考方案2】:

您的逻辑使事情变得复杂。我会这样做:

    如果 DayOfWeek = 太阳或公共假期 --> 显示错误消息并退出 如果 DayOfWeek = Sat --> 复制某些文件并退出 复制所有其他文件

【讨论】:

以上是关于cmd中if条件“and”/“or”的批处理文件问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Google 表格中使用 IF、AND/OR(许多条件)和数组公式

刀片视图:带有 OR/AND 条件的 if 语句

NGINX实现IF语句里的AND,OR多重判断

JS中使用逻辑 AND/OR 做条件判断及函数默认值

C# 条件 AND (&&) OR (||) 优先级

thinkphp <if> 标签比较中的 或者 用 OR ,那么 且 是否用 AND 或者是啥?