2012-09-28 12 views
5

Próbuję napisać skrypt wsadowy, który będzie pobierał bieżący dzień, miesiąc i rok w bezpieczny sposób (tj. Niezależnie od formatu daty). Niestety wszystkie źródła internetowe znalazłem zaproponować coś takiego:Bezpieczny sposób na uzyskanie bieżącego miesiąca i roku w serii

SET CURRENT_DATE=%DATE: =0% 
    SET YEAR=%DATE:~-4% 
    SET MONTH=%DATE:~3,2% 
    SET DAY=%DATE:~5,2% 

To będzie działać, jeśli moja data jest w formacie rrrr/mm/dd lub yyyy-MM-DD, ale nie jeśli jest w formacie RR-MM -dd lub inny format. Czy istnieje bezpieczny sposób na uzyskanie roku, miesiąca i dnia?

I jeszcze jedno pytanie - czy możliwe jest określenie separatora dni (/ w pierwszym przypadku i - w pozostałych przypadkach).

+1

Zastosowanie WMIC zamiast [SO: Log Date/Time] (http://stackoverflow.com/a/7730453/463115) – jeb

Odpowiedz

7

Po pierwsze, można pobrać bieżące ustawienia z rejestru (gdzieś).
Format i separatory.

Ale łatwiej jest użyć wmic zamiast tego, ma zawsze ten sam format, jedyną wadą jest to, że zajmuje trochę czasu, za każdym razem, gdy go uruchomisz.

Zmodyfikowana próba z SO: Log Date/Time

@echo off 
setlocal EnableDelayedExpansion 
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    if "%%B" NEQ "" (
     SET /A FDATE=%%F*10000+%%D*100+%%A 
     SET /A FTIME=%%B*10000+%%C*100+%%E 
    ) 
) 
ECHO !FDATE! - !FTIME! 
+0

co robi ' setlocal EnableDelayedExpansion' i dlaczego jest potrzebny w tym przykładzie? –

+1

Włącza opóźnione rozwinięcie (Wow!), Najlepiej przeczytać pomoc 'set /?'. A mówiąc prawdę: Tu nie jest konieczne :-), Możesz po prostu zmienić echo na "echo% FDATE% -% FTIME%" – jeb

9

Pierwsze cztery wiersze tego kodu daje niezawodne zmienne YY DD MM YYYY HH MIN SEC w XP Pro i wyższym.

@echo off 
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" 
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%" 
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" 

set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" 
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%" 
echo datestamp: "%datestamp%" 
echo timestamp: "%timestamp%" 
echo fullstamp: "%fullstamp%" 
pause 

Oto rozwiązanie VBS:

:: date time using WSH/VBS 
    :: datetime.bat V4.2 
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
    :: 
    :: This uses Windows Scripting Host to set variables to 
    :: the current date/time/day/day_number/week_of_year etc 
    :: for Win9x/ME/NT/W2K/XP/Vista/Win7/Win8 etc 
    :: Thanks go to Todd Vargo for his scripting 
    :: 
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
    @echo off 
    set TmpFile="%temp%.\tmp.vbs" 
    echo> %TmpFile% n=Now 
    echo>>%TmpFile% With WScript 
    echo>>%TmpFile% .Echo "set m1=" + monthname(month(n), true) 
    echo>>%TmpFile% .Echo "set m2=" + monthname(month(n), false) 
    echo>>%TmpFile% .Echo "set woy=" + CStr(datepart("ww", n)) 
    echo>>%TmpFile% .Echo "set year=" + CStr(Year(n)) 
    echo>>%TmpFile% .Echo "set yr=" + Right(Year(n),2) 
    echo>>%TmpFile% .Echo "set month="+ Right(100+Month(n),2) 
    echo>>%TmpFile% .Echo "set day=" + Right(100+Day(n),2) 
    echo>>%TmpFile% .Echo "set hour=" + Right(100+Hour(n),2) 
    echo>>%TmpFile% .Echo "set min=" + Right(100+Minute(n),2) 
    echo>>%TmpFile% .Echo "set sec=" + Right(100+Second(n),2) 
    echo>>%TmpFile% .Echo "set dow=" + WeekDayName(Weekday(n),1) 
    echo>>%TmpFile% .Echo "set dow2=" + WeekDayName(Weekday(n)) 
    echo>>%TmpFile% .Echo "set iso=" + CStr(1 + Int(n-2) mod 7) 
    echo>>%TmpFile% .Echo "set iso2=" + CStr(Weekday(n,2)) 
    echo>>%TmpFile% End With 
    cscript //nologo "%temp%.\tmp.vbs" > "%temp%.\tmp.bat" 
    call "%temp%.\tmp.bat" 
    del "%temp%.\tmp.bat" 
    del %TmpFile% 
    set TmpFile= 
    set stamp=%year%-%month%-%day%.%hour%_%min%_%sec% 

    if not "%~1"=="" goto :EOF 

    echo The year is "%year%" or "%yr%" 
    echo The month is "%month%" "%m1%" "%m2%" 
    echo The day is "%day%" "%dow%" "%dow2%" 
    echo. 
    echo ISO8601 Day-Of-Week number is "%iso%" and week of year is: "%woy%" 

    echo. 
    echo The time in hh:mm:ss is "%hour%:%min%:%sec%" 
    echo The hour is "%hour%" 
    echo The minute is "%min%" 
    echo The second is "%sec%" 
    echo. 

    echo The date and time stamp is "%stamp%" 
    echo. 
    echo date A yyyymmdd "%year%%month%%day%" 
    echo date B mmddyyyy "%month%%day%%year%" 
    echo date C ddmmyyyy "%day%%month%%year%" 
    echo date D yymmdd "%yr%%month%%day%" 
    echo date E mmddyy "%month%%day%%yr%" 
    echo date F ddmmyy "%day%%month%%yr%" 
    pause 
    :: datetime.bat 
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
Powiązane problemy