Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
301 views
in Technique[技术] by (71.8m points)

IF and ELSE IF code help - Batch Scripting

i just need a help on the if condition in the below sample batch script code, how do I implement an if and else if condition? if else doesnt recognize in my .bat file when running inw windows command:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // constant variables
set "_ROOT=%~dp0." & rem // (common root directory; `%~dp0.` is script's parent, `.` is current)
set "_DIR1=%_ROOT%Directory1" & rem // (1st directory containing files)
set "_DIR2=%_ROOT%Directory2" & rem // (2nd directory containing files)
set _MASKS="*INV*" "*SLS*"     & rem // (list of quoted file masks)
set "_TMP1=%TEMP%\%~n0_1_%RANDOM%.tmp" & rem // (1st temporary file)
set "_TMP2=%TEMP%\%~n0_2_%RANDOM%.tmp" & rem // (2nd temporary file)

rem // Resolve 1st directory to be an absolute path:
for %%E in ("%_DIR1%") do set "RDIR1=%%~fE"
rem // Resolve 2nd directory to be an absolute path:
for %%E in ("%_DIR2%") do set "RDIR2=%%~fE"

rem // Write all matching files in 1st directory to 1st temporary file:
pushd "%RDIR1%" && (
    for %%F in (%_MASKS%) do (
        echo(%%~nxF
    )
    popd
) > "%_TMP1%"
rem // Write all matching files in 2nd directory to 2nd temporary file:
pushd "%RDIR2%" && (
    for %%F in (%_MASKS%) do (
        echo(%%~nxF
    )
    popd
) > "%_TMP2%"

rem // Loop over all common files from both temporary files:
for /F %%L in ('findstr /L /I /X /G:"%_TMP1%" "%_TMP2%"') do (
    rem // Build absolute `wmic`-compatible file paths:
    set "FILE1=%RDIR1:=\%\%%L" & set "FILE2=%RDIR2:=\%\%%L"
    setlocal EnableDelayedExpansion
    rem set "FILE1=%!FILE1:&=&!" & set "FILE2=%!FILE2:&=&!"
    rem // Get standardised file date/time (last modification) of 1st file by `wmic`:
    for /F %%K in ('wmic DataFile where "Name='!FILE1!'" get LastModified') do set "DATE1=%%K"
    rem // Get standardised file date/time (last modification) of 2nd file by `wmic`:
    for /F %%K in ('wmic DataFile where "Name='!FILE2!'" get LastModified') do set "DATE2=%%K"
    rem // Compare file dates/times (last mod.) of both files and return differing ones:

    if !DATE1! gtr !DATE2! (echo "!FILE1:\=!" is newer than "!FILE2:\=!")
   else if !DATE1! leq !DATE2! (echo "!FILE1:\=!" is older than "!FILE2:\=!")
   else if !DATE1! equ !DATE2! (echo "!FILE1:\=!" is same with  "!FILE2:\=!")


    endlocal
)

rem // Clean up temporary files:
del "%_TMP1%" "%_TMP2%"

endlocal
exit /B

This would be a very much help. Thanks

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Use lss instead of leq. So we will have "less than", "greater than" and "equal to", which seems to be what you want.

The correct method of using else in this instance would be:

if !DATE1! gtr !DATE2! (
     echo "!FILE1:\=!" is newer than "!FILE2:\=!"
   ) else if !DATE1! lss !DATE2! (
          echo "!FILE1:\=!" is older than "!FILE2:\=!"
    ) else if !DATE1! equ !DATE2! (
           echo "!FILE1:\=!" is same with  "!FILE2:\=!"
)

However, We do not need else in this instance as each line will be evaluated until one returns true, so you could just do:

if !DATE1! gtr !DATE2! echo "!FILE1:\=!" is newer than "!FILE2:\=!"
if !DATE1! lss !DATE2! echo "!FILE1:\=!" is older than "!FILE2:\=!"
if !DATE1! equ !DATE2! echo "!FILE1:\=!" is same with  "!FILE2:\=!"

I suggest you read the help, open cmd.exe and run:

  • if /?

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...