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 

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 

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 に答える