0

我正在编写一个脚本,该脚本检测原始文件中奇怪的日期格式并将其替换为昨天的日期。这里假设昨天的原始数据是 2012-07-19

输入.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 

输出.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 

我是dos批处理文件的新手。但是,提出一个基本策略,我将首先遍历每一行以检测这种情况(0001-01-01)实际上只有这种情况 我然后将日期替换为昨天。

我尝试编写代码如下

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% 


)

任何人有想法请帮忙!谢谢

4

1 回答 1

1

阅读HELP FORHELP SET; 然后试试这个代码让你开始......

@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

FOR迭代input.txt. _ 然后,对于每一行,它在位置 12 处提取日期子字符串,并检查日期是否为 0001-01-01,在这种情况下,它用newdate变量的内容替换它。

于 2012-07-23T09:49:49.663 回答