cheeseng
cheeseng

Reputation: 65

batch file replace date with yesterday date

i working on a script that detect weird date format in the raw file and replace them with yesterday date. here the raw data assuming yesterday date is 2012-07-19

Input.txt

AAAAAAAA    0001-01-01-00.00.00.000000  Change Password RSO part
BBBBBBBB    0001-01-01-00.00.00.000000  Change Password RSO part
CCCCCCC     0001-01-01-00.00.00.000000  Set Nbr try of password
DDDDDDD     2012-07-19-09.44.25.634000  Change Password 

output.txt

AAAAAAAA    2012-07-19-00.00.00.000000  Change Password RSO part
BBBBBBBB    2012-07-19-00.00.00.000000  Change Password RSO part
CCCCCCC     2012-07-19-00.00.00.000000  Set Nbr try of password
DDDDDDD     2012-07-19-09.44.25.634000  Change Password 

I am new to dos batch file. However, come out a basic strategy which i will first loop through each line to detect this scenario (0001-01-01) in fact there is only this scenario I then replace the date to yesterday.

i have try to write the code as follow

REM Code to Find YEsterday's date
set yyyy=

set $tok=1-3
for /f "tokens=1 delims=.:/-, " %%u in ('date /t') do set $d1=%%u
if "%$d1:~0,1%" GTR "9" set $tok=2-4
for /f "tokens=%$tok% delims=.:/-, " %%u in ('date /t') do (
for /f "skip=1 tokens=2-4 delims=/-,()." %%x in ('echo.^|date') do (
set %%x=%%u
set %%y=%%v
set %%z=%%w
set $d1=
set $tok=))

if "%yyyy%"=="" set yyyy=%yy%
if /I %yyyy% LSS 100 set /A yyyy=2000 + 1%yyyy% - 100

set CurDate=%mm%/%dd%/%yyyy%
set dayCnt=%1

if "%dayCnt%"=="" set dayCnt=1

REM Substract your days here
set /A dd=1%dd% - 100 - %dayCnt%
set /A mm=1%mm% - 100

:CHKDAY
if /I %dd% GTR 0 goto DONE
set /A mm=%mm% - 1
if /I %mm% GTR 0 goto ADJUSTDAY
set /A mm=12
set /A yyyy=%yyyy% - 1

:ADJUSTDAY
if %mm%==1 goto SET31
if %mm%==2 goto LEAPCHK
if %mm%==3 goto SET31
if %mm%==4 goto SET30
if %mm%==5 goto SET31
if %mm%==6 goto SET30
if %mm%==7 goto SET31
if %mm%==8 goto SET31
if %mm%==9 goto SET30
if %mm%==10 goto SET31
if %mm%==11 goto SET30
REM ** Month 12 falls through

:SET31
set /A dd=31 + %dd%
goto CHKDAY

:SET30
set /A dd=30 + %dd%
goto CHKDAY

:LEAPCHK
set /A tt=%yyyy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yyyy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yyyy% %% 400
if %tt%==0 goto SET29

:SET28
set /A dd=28 + %dd%
goto CHKDAY

:SET29
set /A dd=29 + %dd%
goto CHKDAY

    call :process <..\input.txt>> ..\output.txt

    :process 
     set line= 
     if "!line:~12,22!" neq "0001-01-01" goto process
    ## for /F between line:~12,22 do ( 
    ------------------------------------------------
    this part onward i not very sure already.
    intend to do a for loop each line replace "0001-01-01" to %yyyy%-%mm%-%dd% 


)

anyone has idea please help!! thanks

Upvotes: 0

Views: 877

Answers (1)

PA.
PA.

Reputation: 29369

Read HELP FOR and HELP SET; then try this code to get you started...

@echo off
setlocal enabledelayedexpansion
set newdate=9999-99-99
for /f "tokens=*" %%a in (input.txt) do (
  set line=%%a
  set onlydate=!line:~12,10!
  if !onlydate!==0001-01-01 (
    echo !line:0001-01-01=%newdate%!
  ) else (
    echo !line!
  )
)
endlocal

The FOR iterates over all the lines in input.txt. Then, for each line, it extracts the date substring at position 12, and checks if the date is 0001-01-01, in that case, it substitutes it with the contents of newdate variable.

Upvotes: 1

Related Questions