Jak uzyskać bieżącą datę / godzinę w wierszu poleceń systemu Windows w odpowiednim formacie do użycia w nazwie pliku / folderu?

540

Aktualizacja: teraz, gdy jest 2016, użyłbym do tego PowerShell, chyba że istnieje naprawdę interesujący powód kompatybilności wstecznej, szczególnie z powodu problemów z ustawieniami regionalnymi podczas używania date. Zobacz @ npocmaka na https://stackoverflow.com/a/19799236/8479


Jakich instrukcji wiersza polecenia systemu Windows można użyć, aby uzyskać bieżącą datę i godzinę w formacie, który można umieścić w nazwie pliku?

Chcę mieć plik .bat, który zamyka katalog do archiwum z bieżącą datą i godziną jako częścią nazwy, na przykład Code_2008-10-14_2257.zip. Czy jest jakiś prosty sposób, niezależnie od regionalnych ustawień urządzenia?

Nie mam nic przeciwko formatowi daty, idealnie byłoby to rrrr-mm-dd, ale wszystko, co proste, jest w porządku.

Do tej pory mam to, co na mojej maszynie daje mi Tue_10_14_2008_230050_91:

rem Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%

rem Now use the timestamp by in a new ZIP file name.
"d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.zip Code

Mogę z tym żyć, ale wydaje się to trochę niezgrabne. Idealnie byłoby krótsze i mieć wspomniany wcześniej format.

Używam Windows Server 2003 i Windows XP Professional. Nie chcę instalować dodatkowych narzędzi, aby to osiągnąć (chociaż zdaję sobie sprawę, że są takie, które będą ładnie formatować daty).

Rory
źródło
7
Tworzysz automatyczną kopię zapasową kodu? Dobrze dla ciebie! My też powinniśmy to zrobić :)
Andrei Rînea
24
użyj ludzi PowerShell ...[datetime]::now.tostring("yyyy-MM-dd")
Nacht - Przywróć Monikę
Czy możliwe jest ładowanie plików z utworzoną datą przy użyciu xp_cmdshell w SQL Server? Zadałem pytanie na stackoverflow, proszę proszę zobaczyć link @ stackoverflow.com/q/32293517/3327081
kolunar

Odpowiedzi:

667

Zobacz plik wsadowy systemu Windows (.bat), aby uzyskać bieżącą datę w formacie MMDDRRRR :

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime%

Jeśli wolisz czas w formacie 24-godzinnym / wojskowym, możesz zastąpić drugą linię FOR:

For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)

C:>. \ Date.bat
2008-10-14_0642

Jeśli chcesz, aby data była niezależna od regionalnej kolejności dnia / miesiąca, możesz użyć „WMIC os GET LocalDateTime” jako źródła, ponieważ jest w kolejności ISO:

@echo off
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
echo Local date is [%ldt%]

C:> test.cmd
Data lokalna to [2012-06-19 10: 23: 47.048]

Sójka
źródło
44
Dla mieszkańców Wielkiej Brytanii będziesz potrzebować For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)drugiej linii.
Rory,
17
To rozwiązanie jest zależne od regionu, Rory podała przykład dla Wielkiej Brytanii dla innych lokalizacji, w których data jest 22-02-2012, musisz zastąpić delims = / delims = -
Nuno Furtado
25
W moim systemie% TIME% zwraca wartości takie jak „0:01:15” i „3:15:12”, a kod %% a %% b w odpowiedzi daje wiodące miejsce, takie jak „001” i „315”. Aby uzyskać czterocyfrowy hhmm, użyj tego: For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b))Zwraca wartości takie jak „0001” i „0315”, które wolę w moich nazwach plików.
Twamley
10
Ładna wersja wmicpolecenia! Do tej pory widziałem tylko WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table. Podobnie, aby dostać się 20120623-1619do mojej lokalnej strefy czasowej w Amsterdamie, w jednej linii:for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%
Arjan
5
Dla mnie to mówi%%a was unexpected at this time.
Scott zuz22 Blacklock
109

Niezależnie od regionu parsowanie daty i godziny

Format wyjściowy %DATE%i dirpolecenia jest zależny regionalnie, a tym samym nie wytrzymała ani mądry. date.exe (część UnxUtils ) dostarcza dowolne informacje o dacie i godzinie w dowolnym możliwym do zaakceptowania formacie. Możesz także wyodrębnić informacje o dacie / godzinie z dowolnego pliku za pomocą date.exe.

Przykłady: (w skrypcie cmd użyj %% zamiast%)

date.exe +"%Y-%m-%d"
22.12.2009

date.exe +"%T"
18:55:03

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503: Dowolny tekst

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Tekst: 09/12/22-dowolny tekst-18.55

Command: date.exe +"%m-%d """%H %M %S """"
07-22 „18:55:03”

Informacje o dacie / godzinie z pliku referencyjnego:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Używanie go w skrypcie CMD w celu uzyskania informacji o roku, miesiącu, dniu i czasie:

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Używanie go w skrypcie CMD w celu uzyskania znacznika czasu w dowolnym wymaganym formacie:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i

Wydobywanie informacji o dacie / godzinie z dowolnego pliku referencyjnego.

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Dodanie do pliku informacji o dacie / godzinie:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt

date.exe jest częścią bezpłatnych narzędzi GNU, które nie wymagają instalacji.

UWAGA: Kopiowanie date.exedo dowolnego katalogu znajdującego się na ścieżce wyszukiwania może spowodować awarię innych skryptów korzystających z wbudowanego datepolecenia systemu Windows .

Uri Liebeskind
źródło
4
Znacznie lepsze niż dziwnie bardziej popularne rozwiązanie powyżej, ale musiałem dodać / t, aby uniknąć monitu w systemie Windows 8.1
rainabba
6
Wbudowany system Windows 8.1 date.exewydaje się być zależny od ustawień regionalnych. Zwraca datę w formacie dd / MM / rrrr w moim systemie, jeśli byłby niezależny od ustawień regionalnych, oczekiwałbym MM / dd / rrrr lub rrrr-MM-dd. Nie sądzę, że ta odpowiedź mówi o wbudowanym programie date.exe, ale o jego wersji innej firmy.
SSS
1
jest niezależny od ustawień regionalnych, jeśli podasz mu żądany format w wierszu poleceń
terrinecold
3
Zauważ, że date.exe (część UnxUtils) nie jest tym samym, co wbudowana komenda date. Więc jeśli musisz dodać / t, polecenie daty systemu Windows jest wykonywane. Jeśli działa coś takiego jak date.exe + „% Y-% m-% d”, oznacza to, że poprawnie zainstalowałeś UnxUtils. :-)
just.do.it
Czy możliwe jest ładowanie plików z utworzoną datą przy użyciu xp_cmdshell w SQL Server? Próbowałem polecenia „forfiles”, ale bezskutecznie. Zadałem pytanie dotyczące stackoverflow, proszę proszę zobaczyć link @ stackoverflow.com/q/32293517/3327081
kolunar
103

Dwa kolejne sposoby, które nie zależą od ustawień czasu (oba pochodzą z : Jak uniezależnić dane / czas od lokalizacji:) . I oba mają także dzień tygodnia i żadne z nich nie wymaga uprawnień administratora !:

  1. MAKECAB - działa na KAŻDYM systemie Windows (szybko, ale tworzy mały plik tymczasowy) (skrypt foxidrive):

    @echo off
    pushd "%temp%"
    makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
    for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
       set "current-date=%%e-%%b-%%c"
       set "current-time=%%d"
       set "weekday=%%a"
    )
    del ~.*
    popd
    echo %weekday% %current-date% %current-time%
    pause
    

    Więcej informacji o funkcji get-date .

  2. ROBOCOPY - to nie jest natywne polecenie dla Windows XP i Windows Server 2003, ale można je pobrać ze strony Microsoft . Ale jest wbudowany we wszystko z Windows Vista i nowszych:

    @echo off
    setlocal
    for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
     set "dow=%%D"
     set "month=%%E"
     set "day=%%F"
     set "HH=%%G"
     set "MM=%%H"
     set "SS=%%I"
     set "year=%%J"
    )
    
    echo Day of the week: %dow%
    echo Day of the month : %day%
    echo Month : %month%
    echo hour : %HH%
    echo minutes : %MM%
    echo seconds : %SS%
    echo year : %year%
    endlocal
    

    I jeszcze trzy sposoby korzystania z innych języków skryptowych Windows. Dadzą ci większą elastyczność, np. Możesz uzyskać tydzień w roku, czas w milisekundach i tak dalej.

  3. JScript / pakiet hybrydowy (należy zapisać jako .bat). JScript jest dostępny w każdym systemie od wersji NT i wyższej, jako część hosta skryptów systemu Windows ( choć może być wyłączony przez rejestr, jest to rzadki przypadek ):

    @if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
    
    @echo off
    cscript //E:JScript //nologo "%~f0"
    exit /b 0
    *------------------------------------------------------------------------------*/
    
    function GetCurrentDate() {
            // Today date time which will used to set as default date.
            var todayDate = new Date();
            todayDate = todayDate.getFullYear() + "-" +
                           ("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
                           ("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
                           ("0" + todayDate.getMinutes()).slice(-2);
    
            return todayDate;
        }
    
    WScript.Echo(GetCurrentDate());
    
  4. VSCRIPT / BATCH hybrid ( Czy można osadzić i uruchomić VBScript w pliku wsadowym bez użycia pliku tymczasowego? ) Ta sama sprawa co JScript, ale hybrydyzacja nie jest tak doskonała:

    :sub echo(str) :end sub
    echo off
    '>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
    '& echo current date:
    '& cscript /nologo /E:vbscript "%~f0"
    '& exit /b
    
    '0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
    '1 = vbLongDate - Returns date: weekday, monthname, year
    '2 = vbShortDate - Returns date: mm/dd/yy
    '3 = vbLongTime - Returns time: hh:mm:ss PM/AM
    '4 = vbShortTime - Return time: hh:mm
    
    WScript.echo  Replace(FormatDateTime(Date,1),", ","-")
    
  5. PowerShell - można zainstalować na każdym komputerze z platformą .NET - pobierz z Microsoft ( v1 , v2 , v3 (tylko dla Windows 7 i nowszych)). Jest instalowany domyślnie we wszystkich systemach Windows 7 / Windows Server 2008 i nowszych:

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    

    Aby użyć go z pliku wsadowego:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Własnie skompilowany plik jscript.net/batch (nigdy nie widziałem komputera z systemem Windows bez platformy .NET, więc myślę, że jest to dość przenośny):

    @if (@X)==(@Y) @end /****** silent line that start JScript comment ******
    
    @echo off
    ::::::::::::::::::::::::::::::::::::
    :::       Compile the script    ::::
    ::::::::::::::::::::::::::::::::::::
    setlocal
    if exist "%~n0.exe" goto :skip_compilation
    
    set "frm=%SystemRoot%\Microsoft.NET\Framework\"
    
    :: Searching the latest installed .NET framework
    for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
        if exist "%%v\jsc.exe" (
            rem :: the javascript.net compiler
            set "jsc=%%~dpsnfxv\jsc.exe"
            goto :break_loop
        )
    )
    echo jsc.exe not found && exit /b 0
    :break_loop
    
    
    call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
    ::::::::::::::::::::::::::::::::::::
    :::       End of compilation    ::::
    ::::::::::::::::::::::::::::::::::::
    :skip_compilation
    
    "%~n0.exe"
    
    exit /b 0
    
    
    ****** End of JScript comment ******/
    import System;
    import System.IO;
    
    var dt=DateTime.Now;
    Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
    
  7. Logman Nie można uzyskać roku i dnia tygodnia. Jest stosunkowo powolny, a także tworzy plik tymczasowy i jest oparty na znacznikach czasu, które logman umieszcza na swoich plikach dziennika. Będzie działać na wszystkich elementach systemu Windows XP i nowszych. Prawdopodobnie nikt go nie użyje - w tym ja - ale jest jeszcze jeden sposób ...

    @echo off
    setlocal
    del /q /f %temp%\timestampfile_*
    
    Logman.exe stop ts-CPU 1>nul 2>&1
    Logman.exe delete ts-CPU 1>nul 2>&1
    
    Logman.exe create counter ts-CPU  -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
    Logman.exe start ts-CPU 1>nul 2>&1
    
    Logman.exe stop ts-CPU >nul 2>&1
    Logman.exe delete ts-CPU >nul 2>&1
    for /f "tokens=2 delims=_." %%t in  ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
    
    echo %timestamp%
    echo MM: %timestamp:~0,2%
    echo dd: %timestamp:~2,2%
    echo hh: %timestamp:~4,2%
    echo mm: %timestamp:~6,2%
    
    endlocal
    exit /b 0
    
  8. Jeszcze jeden sposób z WMIC, który podaje również tydzień roku i dzień tygodnia, ale nie milisekundy (dla milisekund sprawdź odpowiedź foxidrive):

    for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in ("%%#") do @set %%@
    echo %day%
    echo %DayOfWeek%
    echo %hour%
    echo %minute%
    echo %month%
    echo %quarter%
    echo %second%
    echo %weekinmonth%
    echo %year%
    
  9. Używanie TYPEPERF z pewnymi wysiłkami, aby być szybkim i kompatybilnym z różnymi ustawieniami języka i tak szybko, jak to możliwe:

    @echo off
    setlocal
    
    :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance
    ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v=")
    
    for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=")
    set "mon="
    for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do (
       if not defined mon (
          for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do (
            set mon=%%a
            set date=%%b
            set year=%%c
            set hour=%%d
            set minute=%%e
            set sec=%%f
            set ms=%%g
          )
       )
    )
    echo %year%.%mon%.%date%
    echo %hour%:%minute%:%sec%.%ms%
    endlocal
    
  10. MSHTA umożliwia wywoływanie metod JavaScript podobnych do metody JScript przedstawionej w punkcie 3 powyżej. Pamiętaj, że właściwości obiektu Date w JavaScript zawierające wartości miesiąca są ponumerowane od 0 do 11, a nie od 1 do 12. Zatem wartość 9 oznacza październik.

    <!-- : Batch portion
    
    @echo off
    setlocal
    
    for /f "delims=" %%I in ('mshta "%~f0"') do set "now.%%~I"
    
    rem Display all variables beginning with "now."
    set now.
    
    goto :EOF
    
    end batch / begin HTA -->
    
    <script>
        resizeTo(0,0)
        var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1),
            now = new Date(),
            props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes',
                'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay',
                'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth',
                'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString',
                'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'],
            output = [];
    
        for (var i in props) {output.push(props[i] + '()=' + now[props[i]]())}
        close(fso.Write(output.join('\n')));
    </script>
    
npocmaka
źródło
2
dla powershell C: \> for / f %% i in ('powershell get-date -format "{yyyyMMdd_HHmmss}"' ') ustaw datetime = %% i C: \> echo% datetime%
Samuel
1
makecab: działa to poprzez utworzenie pliku o nazwie ~.rpti przeszukanie stringgo, zaczynając od makecab, który jest podobny do linii MakeCAB Report: Tue Sep 02 22:15:57 2014. dla mnie to polecenie nie jest zlokalizowane, jest niezależne od ustawień regionalnych. Ta sztuczka polega na tym. Miejmy nadzieję, że już nigdy nie będzie, albo strzeż się!
n611x007,
10
Podoba mi się tekst początkowy „Dwa kolejne ...”, a następnie 8 rozwiązań.
Adam Smith
1
Co, bez mshtahybrydy? :) Czy mogę edytować swoją odpowiedź i dodać jedną? To wydaje się być najlepszą kolekcją ezoterycznych rozwiązań i wygląda na to, że mshtanależy tutaj.
rojo
1
Przyjęte rozwiązanie nie zadziałałoby dla mnie bez względu na to, czego próbowałem. Wiele z tych rozwiązań działało dla mnie. (Pakiet i PowerShell).
Brett Poczekaj
44

Oto wariant z alt.msdos.batch.nt, który działa lokalnie niezależnie.

Umieść to w pliku tekstowym, np. GetDate.cmd

-----------8<------8<------------ snip -- snip ----------8<-------------
    :: Works on any NT/2k machine independent of regional date settings
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
    for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
      for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
        set '%%a'=%%i
        set '%%b'=%%j
        set '%%c'=%%k))
    if %'yy'% LSS 100 set 'yy'=20%'yy'%
    set Today=%'yy'%-%'mm'%-%'dd'% 
    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]

    :EOF
-----------8<------8<------------ snip -- snip ----------8<-------------

Aby kod działał bez błędów msg do stderr, musiałem dodać pojedyncze cudzysłowy do przypisań zmiennych dla %% a, %% b i %% c. Moje ustawienia narodowe (PT) powodowały błędy na jednym etapie zapętlania / parsowania, gdzie wykonywano takie rzeczy jak „set = 20”. Cytaty dają token (choć pusty) dla lewej strony instrukcji przypisania.

Minusem są niechlujne nazwy zmiennych regionalnych: „yy”, „mm” i „dd”. Ale hej, kogo to obchodzi!

vMax
źródło
3
Jest to idealne i najprostsze i najbardziej eleganckie podejście, jakie do tej pory widziałem.
Doug
2
Zobacz także ulepszenia Jeroen jest potrzebne, ponieważ nie wszystkie lokalizacje używać strun dd, mma yyna wyjściu echo:^|date.
Arjan
nie działa we wszystkich lokalizacjach. (W języku niemieckim datepodaje Geben Sie das neue Datum ein: (TT-MM-JJ), gdzie JJłamie się twój skrypt (oczekuje YY))
Stephan
35

Korzystam z tego (ponownie nie jest niezależny od regionu (Wielka Brytania))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
niebieskawy
źródło
Zobacz zmienne środowiskowe Cmd.exe z dwukropkiem i tyldą na tej mało znanej, ale bardzo wydajnej technice. (Doceniony zostanie wskaźnik do
oficjalnej
Oto dokumentacja pliku wsadowego Microsoft dla Windows XP . Odwołanie to obejmuje użycie parametrów partii . Niestety brak dyskusji na temat techniki „krojenia”.
DavidRR
To nie do końca działa. Może ma to coś wspólnego z ustawieniami regionalnymi? Dostaję wynik „/ 15 / - 1-We_1009”, gdy uruchamiam go w środę, 15 października 2014 r.
Joel B
26

Pierwsze cztery wiersze tego kodu podadzą wiarygodne zmienne YY DD MM RRRR HH Min Sec w systemie Windows XP Professional i nowszych.

@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
foxidrive
źródło
Idealnie, to najlepsze rozwiązanie dla mnie, ponieważ wywołanie PS spowoduje pojawienie się tekstu cmd, który będzie wyglądał śmiesznie.
Ste
25

Niestety nie jest to odporne na ustawienia regionalne, ale robi to, co chcesz.

set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set _my_datetime=%date:~10,4%-%date:~4,2%-%date:~7,2%_%hour%%time:~3,2%

Niesamowite rzeczy, które można znaleźć na Wikipedii .

Mark Ransom
źródło
1
Mark - znaleziono zmienne środowiskowe Cmd.exe z dwukropkiem i tyldą, które opisują zmienną technikę „krojenia” przedstawioną w odpowiedzi. Nie znajduję już tych informacji w artykule w Wikipedii. Chciałbym znaleźć wiarygodne odniesienie od Microsoft.
DavidRR,
1
Oto dokumentacja pliku wsadowego Microsoft dla Windows XP . Odwołanie to obejmuje użycie parametrów partii . Niestety brak dyskusji na temat techniki „krojenia”.
DavidRR
18

Użyj następującego skryptu, aby uzyskać bieżący dzień w wierszu polecenia:

echo %Date:~0,3%day
sudipto roy
źródło
8
Grałem trochę z tym, jest to najkrótszy czas, jaki udało mi się uzyskać Data i godzina: echo% data
%%
15

Inny sposób ( kredyt ):

@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
    Set Month=%%A
    Set Day=%%B
    Set Year=%%C
)

@echo DAY = %Day%
@echo Month = %Month%
@echo Year = %Year%

Zauważ, że obie moje odpowiedzi są nadal zależne od kolejności dnia i miesiąca, zgodnie z ustawieniami regionalnymi - nie jestem pewien, jak to obejść.

J c
źródło
14
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip
DigiP
źródło
http://www.dotnetperls.com/7-zip-examplesma kilka dobrych punktów, które mogą być przydatne dla kogoś w przyszłości.
Saravanan
13

To nie jest tak naprawdę krótsze, ale może być bardziej elastyczny sposób ( kredyt ):

FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET date=%mm%%dd%%yyyy%
J c
źródło
10

Oto sposób, aby uzyskać datę i godzinę w jednym wierszu:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %a in ('%date% %time%') do echo %c-%a-%b %d%e

W USA wyświetli to „rrrr-mm-dd ggmm”. Różne ustawienia regionalne spowodują różne wyniki% data%, ale możesz zmodyfikować kolejność tokenów.

Jeśli chcesz mieć inny format, zmodyfikuj instrukcję echa, przestawiając tokeny lub używając różnych (lub nie) separatorów.

Matthew Johnson
źródło
Czy istnieje sposób, aby uzyskać czas w formacie 12-godzinnym, a także wyświetlać informacje o AM lub PM?
Sangli
9

Po prostu użyj tej linii:

PowerShell -Command "get-date"
gdelfino
źródło
9

Krótka odpowiedź :

 :: Start - Run , type:
 cmd /c "powershell get-date -format ^"{yyyy-MM-dd HH:mm:ss}^"|clip"

 :: click into target media, Ctrl + V to paste the result 

Długa odpowiedź

    @echo off
    :: START USAGE  ==================================================================
    ::SET THE NICETIME 
    :: SET NICETIME=BOO
    :: CALL GetNiceTime.cmd 

    :: ECHO NICETIME IS %NICETIME%

    :: echo nice time is %NICETIME%
    :: END USAGE  ==================================================================

    echo set hhmmsss
    :: this is Regional settings dependant so tweak this according your current settings
    for /f "tokens=1-3 delims=:" %%a in ('echo %time%') do set hhmmsss=%%a%%b%%c 
    ::DEBUG ECHO hhmmsss IS %hhmmsss%
    ::DEBUG PAUSE
    echo %yyyymmdd%
        :: this is Regional settings dependant so tweak this according your current settings
    for /f "tokens=1-3 delims=." %%D in ('echo %DATE%') do set  yyyymmdd=%%F%%E%%D
    ::DEBUG ECHO yyyymmdd IS %yyyymmdd%
    ::DEBUG PAUSE


    set NICETIME=%yyyymmdd%_%hhmmsss%
    ::DEBUG echo THE NICETIME IS %NICETIME%

    ::DEBUG PAUSE
Yordan Georgiev
źródło
:: w cmd dla / f% i w ('PowerShell -Command "get-date" -format "rrrrMMdd"') ustaw rrrrMMdd =% i :: w skrypcie cmd dla / f %% i w ('PowerShell-Komenda „get-date” -format „rrrrMMdd” ') ustaw rrrrMMdd = %% i
Yordan Georgiev
8

Jednoliniowe rozwiązanie Matthew Johnsona, aby uzyskać datę i godzinę jednej linijki, jest wymowne i przydatne.

Jednak wymaga prostej modyfikacji, aby działać z poziomu pliku wsadowego:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
John Langstaff
źródło
1
Nie działa w CMD (%% a było nieoczekiwane w tym czasie) ani w PowerShell (brak otwarcia '(' po słowie kluczowym dla) w Windows 8.1
rainabba
3
Rainabba, to jest dokładnie błąd, który pojawia się, gdy polecenie to jest wydawane z linii CMD . Jednak „ z pliku wsadowego ” polecenie zwraca „2014-01-30 1324”.
John Langstaff
1
lub znacznie prościej byłoby bez pętli forecho %date:/=-%%time::=-%
Gerhard Barnard
7

A tutaj jest podobny plik wsadowy dla części czasu.

:: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional time settings
::
:: Gets the time in ISO 8601 24-hour format
::
:: Note that %time% gets you fractions of seconds, and time /t doesn't, but gets you AM/PM if your locale supports that.
:: Since ISO 8601 does not care about AM/PM, we use %time%
::
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    for /f "tokens=1-4 delims=:,.-/ " %%i in ('echo %time%') do (
      set 'hh'=%%i
      set 'mm'=%%j
      set 'ss'=%%k
      set 'ff'=%%l)
    ENDLOCAL & SET v_Hour=%'hh'%& SET v_Minute=%'mm'%& SET v_Second=%'ss'%& SET v_Fraction=%'ff'%

    ECHO Now is Hour: [%V_Hour%] Minute: [%V_Minute%] Second: [%v_Second%] Fraction: [%v_Fraction%]
    set timestring=%V_Hour%%V_Minute%%v_Second%.%v_Fraction%
    echo %timestring%

    :EOF

--jeroen

Jeroen Wiert Pluimers
źródło
Cześć, udało mi się załadować pliki według daty modyfikacji za pomocą poniższego polecenia, z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path” ale chcę wiedzieć, jak ładować pliki zgodnie z datą utworzenia . Każda forma pomocy jest mile widziana. Pytanie zostało zadane przy przepełnieniu stosu, ale nie ma jeszcze odpowiedzi. Proszę zobaczyć link do szczegółów stackoverflow.com/q/32293517/3327081
kolunar
1
Zadaj nowe pytanie na ten temat. Nigdy nie używany forfiles.
Jeroen Wiert Pluimers
7

Zmieniłem odpowiedź za pomocą pliku wsadowego z vMax, więc działa również z językiem holenderskim.
Holendrzy - trwałe jak my - mają kilka zmian w %date%, date/ti datektóre rozkładają oryginalny batch-file.

Byłoby miło, gdyby niektóre osoby mogły to sprawdzić również w przypadku innych lokalizacji systemu Windows i zgłosić wyniki.
Jeśli plik wsadowy nie powiedzie się w Twojej lokalizacji, dołącz wyniki tych dwóch instrukcji w wierszu polecenia:
echo:^|date
date/t

Oto próbka danych wyjściowych, które powinieneś uzyskać z pliku wsadowego:

C:\temp>set-date-cmd.bat
Today is Year: [2011] Month: [01] Day: [03]
20110103

Oto poprawiony kod z komentarzami na temat tego, dlaczego:

:: /programming/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional date settings
::
:: 20110103 - adapted by [email protected] for Dutch locale
:: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy'
:: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date
::            set '%%c'=%%k
::            set 'yy'=%%k
::
:: In addition, date will display the current date before the input prompt using dashes
:: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch
:: and one occurence in English.
:: This skips the first iteration:
::        if "%%a" GEQ "A"
::
:: echo:^|date
:: Huidige datum: ma 03-01-2011
:: Voer de nieuwe datum in: (dd-mm-jj)
:: The current date is: Mon 01/03/2011
:: Enter the new date: (mm-dd-yy)
::
:: date/t
:: ma 03-01-2011
:: Mon 01/03/2011
::
:: The assumption in this batch-file is that echo:^|date will return the date format
:: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token.
::
:: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens.
:: That will resolve the order of the tokens.
::
@ECHO off
    set v_day=
    set v_month=
    set v_year=

    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
::DEBUG echo toks=%toks%
      for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
::DEBUG echo first token=%%a
        if "%%a" GEQ "A" (
          for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
            set '%%a'=%%i
            set '%%b'=%%j
            set 'yy'=%%k
          )
        )
      )
      if %'yy'% LSS 100 set 'yy'=20%'yy'%
      set Today=%'yy'%-%'mm'%-%'dd'%

    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
    set datestring=%V_Year%%V_Month%%V_Day%
    echo %datestring%

    :EOF

--jeroen

Jeroen Wiert Pluimers
źródło
2
Niektórzy używają najpierw lat lub brak zer wiodących; zobacz format daty Wikipedii według kraju . Francuzi mogliby użyć jj-mm-aaaado Jour, Mois, Anne? Włosi może gg/mm/aaaadla Giorno, Mese, Anno? Niemcy tt.mm.jjjjdla Tag, Monat, Jahr? Ale potem: Myślę, że w większości krajów używa się tylko kilku języków. Podobnie jak w Holandii, Windows często będzie językiem angielskim lub holenderskim, niewiele więcej. Wystarczająco dobrze dla mnie.
Arjan
2
Nawiasem mówiąc: inna wersja ukrytych funkcji plików wsadowych systemu Windows jest mniej doskonała (wymaga poprawki dla holenderskiego jji nie wymusza 4-cyfrowego roku), ale używa shiftdo odrzucenia dnia takiego jak Monlub ma. Po prostu inny.
Arjan
4
Łamie się na systemie niemieckim. Rok i miesiąc działają, ale dzień kończy się niepowodzeniem, ponieważ „dzień” zaczyna się od „T” w języku niemieckim („Tag”), a nie „d”. Łańcuch formatu w pytaniu brzmi (TT-MM-JJ): dane date/twyjściowe to 23.06.2012. / cc @Arjan
balpha
2
Kolejne na bok: można również uzyskać zamówienie z rejestru , używając reg query "HKCU\Control Panel\International" /vShortDate. Uważaj podczas testowania: w przypadku otwartego wiersza polecenia zmiana tego ustawienia Panelu sterowania zmienia również format używany do wyświetlania daty (zarówno datei, jak date /ti echo %date%), ale w systemie Windows 7 NIE zmienia formatu nowej daty! Jak zmienia mój krótki format daty na YY/MM/dd, dostaje mnie: The current date is: 12/06/23 Enter the new date: (mm-dd-yy). Otwarcie nowego wiersza polecenia to rozwiązuje.
Arjan
2
@Arjan to powinno być reg query "HKCU\Control Panel\International" /v sShortDate.
tricasse
6

Właśnie tego użyłem:

::Date Variables - replace characters that are not legal as part of filesystem file names (to produce name like "backup_04.15.08.7z")
SET DT=%date%
SET DT=%DT:/=.%
SET DT=%DT:-=.%

Jeśli potrzebujesz dalszych pomysłów na automatyzację tworzenia kopii zapasowych w archiwach 7-Zip, mam darmowy / otwarty projekt, z którego możesz skorzystać lub przejrzeć pomysły: http://wittman.org/ziparcy/

micahwittman
źródło
W moim systemie% date% zawiera „wt. 14.10.2008”. Tak więc nadal będziesz musiał odciąć (lub inaczej poradzić sobie) z „Wt” i spacją.
BoltBait
Cześć @micahwittman. Czy możliwe jest ładowanie plików z utworzoną datą przy użyciu xp_cmdshell w SQL Server? Próbowałem polecenia „forfiles”, ale bezskutecznie. Zadałem pytanie dotyczące stackoverflow, proszę proszę zobaczyć link @ stackoverflow.com/q/32293517/3327081
kolunar
5

Miałem podobny problem. Mam automatyczne codzienne pobieranie z serwera FTP zaszyfrowanego pliku. Chciałem odszyfrować plik za pomocą gpg, zmienić nazwę pliku na bieżącą datę (format RRRRMMDD) i upuścić odszyfrowany plik w folderze dla odpowiedniego działu.

Przejrzałem kilka sugestii dotyczących zmiany nazwy pliku według daty i nie miałem szczęścia, dopóki nie natknąłem się na to proste rozwiązanie.

for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt

Działa idealnie (tzn. Nazwa pliku pojawia się jako „2011-06-14.txt”).

(Źródło)

KChiki
źródło
5

Funkcja oparta na wmic:

:Now  -- Gets the current date and time into separate variables
::    %~1: [out] Year
::    %~2: [out] Month
::    %~3: [out] Day
::    %~4: [out] Hour
::    %~5: [out] Minute
::    %~6: [out] Second
  setlocal
  for /f %%t in ('wmic os get LocalDateTime ^| findstr /b [0-9]') do set T=%%t
  endlocal & (
    if "%~1" neq "" set %~1=%T:~0,4%
    if "%~2" neq "" set %~2=%T:~4,2%
    if "%~3" neq "" set %~3=%T:~6,2%
    if "%~4" neq "" set %~4=%T:~8,2%
    if "%~5" neq "" set %~5=%T:~10,2%
    if "%~6" neq "" set %~6=%T:~12,2%
  )
goto:eof

Zaleta: niezależna od regionu. Wada: tylko administratorzy systemu mogą uruchomić wmic.exe.

Stosowanie:

call:Now Y M D H N S
echo %Y%-%M%-%D% %H%:%N%:%S%

To echo takiego ciągu:

2014-01-22 12:51:53

Zauważ, że parametry funkcji są poza parametrami - to znaczy musisz podać nazwy zmiennych zamiast wartości.

Wszystkie parametry są opcjonalne, więc call:Now Y Mjest to prawidłowe połączenie, jeśli chcesz uzyskać tylko rok i miesiąc.

Tomalak
źródło
4

http://sourceforge.net/projects/unxutils/files/

Zajrzyj do pliku ZIP, aby znaleźć coś o nazwie „Date.exe” i zmień jego nazwę na „DateFormat.exe” (aby uniknąć konfliktów).

Umieść go w folderze systemu Windows32.

Ma wiele opcji „data output”.

Aby uzyskać pomoc, użyj DateFormat.exe --h

Nie jestem pewien, jak umieścić dane wyjściowe w zmiennej środowiskowej ... za pomocą SET.

Wypad
źródło
1
Dzięki, chociaż to pytanie jest przeznaczone do zrobienia tego bez pobierania dodatkowych narzędzi.
Rory
3

Regionalne niezależne rozwiązanie generujące format daty ISO:

rem save the existing format definition
for /f "skip=2 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set FORMAT=%%a
rem set ISO specific format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d yyyy-MM-dd 1>nul:
rem query the date in the ISO specific format 
set ISODATE=%DATE%
rem restore previous format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d %FORMAT% 1>nul:

Co można jeszcze zoptymalizować: inne procesy mogą się mylić, jeśli użyjesz formatu daty w krótkim okresie czasu, gdy jest on modyfikowany. Zatem parsowanie danych wyjściowych zgodnie z istniejącym ciągiem formatu może być „bezpieczniejsze” - ale będzie bardziej skomplikowane

V15I0N
źródło
możesz zarejestrować zapytanie iDate ( technet.microsoft.com/en-us/library/cc978637.aspx ) i warunkowo kontynuować (3 możliwe wartości według technet) - chociaż jeszcze tego nie próbowałem.
Vincent De Smet
2
:: GetDate.cmd -> Uses WMIC.exe to get current date and time in ISO 8601 format
:: - Sets environment variables %_isotime% and %_now% to current time
:: - On failure, clears these environment variables
:: Inspired on -> https://ss64.com/nt/syntax-getdate.html
:: - (cX) 2017 [email protected]
:: - http://stackoverflow.com/questions/203090
@echo off

set _isotime=
set _now=

:: Check that WMIC.exe is available
WMIC.exe Alias /? >NUL 2>&1 || goto _WMIC_MISSING_

if not (%1)==() goto _help
SetLocal EnableDelayedExpansion

:: Use WMIC.exe to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC.exe Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    IF "%%~L"=="" goto  _WMIC_done_
        set _yyyy=%%L
        set _mm=00%%J
        set _dd=00%%G
        set _hour=00%%H
        set _minute=00%%I
        set _second=00%%K
)
:_WMIC_done_

::   1    2     3       4      5      6
:: %%G  %%H    %%I     %%J    %%K    %%L
:: Day  Hour  Minute  Month  Second  Year
:: 27   9     35      4      38      2017

:: Remove excess leading zeroes
        set _mm=%_mm:~-2%
        set _dd=%_dd:~-2%
        set _hour=%_hour:~-2%
        set _minute=%_minute:~-2%
        set _second=%_second:~-2%
:: Syntax -> %variable:~num_chars_to_skip,num_chars_to_keep%

:: Set date/time in ISO 8601 format:
        Set _isotime=%_yyyy%-%_mm%-%_dd%T%_hour%:%_minute%:%_second%
:: -> http://google.com/search?num=100&q=ISO+8601+format

if 1%_hour% LSS 112 set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%am
if 1%_hour% LSS 112 goto _skip_12_
    set /a _hour=1%_hour%-12
    set _hour=%_hour:~-2%
    set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%pm
    :: -> https://ss64.com/nt/if.html
    :: -> http://google.com/search?num=100&q=SetLocal+EndLocal+Windows
    :: 'if () else ()' will NOT set %_now% correctly !?
:_skip_12_

EndLocal & set _isotime=%_isotime% & set _now=%_now%
goto _out

:_WMIC_MISSING_
echo.
echo WMIC.exe command not available
echo - WMIC.exe needs Administrator privileges to run in Windows
echo - Usually the path to WMIC.exe is "%windir%\System32\wbem\WMIC.exe"

:_help
echo.
echo GetDate.cmd: Uses WMIC.exe to get current date and time in ISO 8601 format
echo.
echo    %%_now%%     environment variable set to current date and time
echo    %%_isotime%% environment variable to current time in ISO format
echo    set _today=%%_isotime:~0,10%%
echo.

:_out
:: EOF: GetDate.cmd
Adolfo
źródło
0

Biorąc pod uwagę znaną lokalizację, do odniesienia w formie funkcjonalnej. Te ECHOTIMESTAMPpokazy połączeń jak dostać się znacznik czasu do zmiennej ( DTSw tym przykładzie).

@ECHO off

CALL :ECHOTIMESTAMP
GOTO END

:TIMESTAMP
SETLOCAL  EnableDelayedExpansion
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    SET DTS=!DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL & SET "%~1=%DTS%"
GOTO :EOF

:ECHOTIMESTAMP
SETLOCAL
    CALL :TIMESTAMP DTS
    ECHO %DTS%
ENDLOCAL
GOTO :EOF

:END

EXIT /b 0

I zapisany do pliku timestamp.bat, oto wynik:

wprowadź opis zdjęcia tutaj

Bvj
źródło
Wydaje się, że wiąże się to z problemem regionalnym - nie działa na wszystkich angielskich komputerach.
Nic dziwnego, @SteveFest. Jeśli można tymczasowo ustawić ustawienia regionalne, może to pomóc w zapewnieniu globalnego rozwiązania, ale wydaje się, że konieczna jest wcześniejsza znajomość regionu. Czy Twoje ustawienia regionalne są w USA czy w SomewhereElse?
bvj
@ SteveFest Podejrzewam, że byłoby możliwe zbudowanie listy ustawień regionalnych, z których każda zawiera wyrażenia daty / godziny z próbką do sprawdzenia. Jestem bardzo zajęty, ale spróbuję zaktualizować swoją odpowiedź, aby to zilustrować. Czy możesz mi pokazać próbki wyników czasu / daty HK? Mogę głupio założyć, że zh-HK drukuje cyfry z ustalonymi przesunięciami.
bvj
zh-HK: (yy)yy年m月d日 hh:mm- brak zer wiodących. (yy) można zignorować, ponieważ mamy 2-cyfrowy rok lub 4-cyfrowy rok. Pamiętaj jednak o jednej rzeczy: format daty i godziny można zmienić dla każdego komputera.
Dzięki @SteveFest, skontaktuję się z Tobą w ciągu kilku tygodni. Uruchom systeminfow CLI i daj mi znać, co widzisz System Locale. Uruchomienie programu zajmuje dużo czasu, ale być może wynik ustawień regionalnych może być buforowany, a następnie użyty do indeksowania formatu znacznika czasu.
bvj
0

W systemie Windows 7 ten kod działa dla mnie:

SET DATE=%date%
SET YEAR=%DATE:~0,4%
SET MONTH=%DATE:~5,2%
SET DAY=%DATE:~8,2%
ECHO %YEAR%
ECHO %MONTH%
ECHO %DAY%

SET DATE_FRM=%YEAR%-%MONTH%-%DAY% 
ECHO %DATE_FRM%
Frizz1977
źródło
I ponownie. Fajnie, że działa na twoim komputerze, ale nie trafiłeś w sednoindependent of the regional settings of the machine
jeb
-1

Zauważam, że operatorzy nie poprosili o rozwiązanie niezależne od regionu. Moje rozwiązanie jest jednak dla Wielkiej Brytanii.

Jest to najprostsze możliwe rozwiązanie, rozwiązanie 1-liniowe, do zastosowania w pliku wsadowym:

FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%
Ed999
źródło
2
Wspomniał o rozwiązaniu niezależnym od regionu ...particularly because of the regional settings issue with using date. Btw. Twoje rozwiązanie jest takie samo jak dwadzieścia innych odpowiedzi.
jeb
Tak, ale mój faktycznie może (opcjonalnie) być użyty w linii poleceń. Jaka jest korzyść z opublikowania 35 wierszy kodu, jeśli jeden wiersz kodu zapewni to samo rozwiązanie?
Ed999,
Nie widzę żadnej istotnej różnicy w stosunku do starych odpowiedzi @Matthew Johnson, 2010 lub @KChiki, 2011
jeb
nawet jeśli ta odpowiedź jest niepoprawna, aby skomentować rzeczywistą odpowiedź, pętla for nie jest tu potrzebna, gdy można po prostu to zrobićecho %date:/=-%
Gerhard Barnard
Nie. Jeśli pominiesz pętlę FOR, nie będzie można utworzyć żadnych zmiennych, a data, którą podjęłeś, aby wyodrębnić, jest nadal bezużyteczna. W pętli FOR zmienne utworzone przez pętlę są dostępne do użycia w innych częściach skryptu. Zdecydowanie wycofuję się, używając dziesiątek wierszy kodu do utworzenia pętli FOR, gdy wymagana jest tylko 1 linia. I zdecydowanie przestaję publikować rozwiązania inne niż wiersze poleceń, w których operatorzy konkretnie prosili o rozwiązanie jednoliniowe do użycia w wierszu poleceń.
Ed999,
-3

Wiem, że wspomniano już na wiele sposobów. Ale oto mój sposób na rozbicie tego, aby zrozumieć, jak to się robi. Mam nadzieję, że jest to pomocne dla kogoś, kto lubi metodę krok po kroku.

:: Check your local date format
echo %date%

    :: Output is Mon 08/15/2016

:: get day (start index, number of characters)
::         (index starts with zero)
set myday=%DATE:~0,4%
echo %myday%
    :: output is Mon 

:: get month
set mymonth=%DATE:~4,2%
echo %mymonth%
    :: output is 08

:: get date 
set mydate=%DATE:~7,2% 
echo %mydate%
    :: output is 15

:: get year
set myyear=%DATE:~10,4%
echo %myyear%
    :: output is 2016
Gifcrazy
źródło
3
Nie trafiłeś w sednoindependent of the regional settings of the machine
jeb