Windows batch: sformatowana Data do zmiennej

Jak zapisać aktualną datę w formacie RRRR-MM-DD do jakiejś zmiennej w systemie Windows .akta nietoperzy?

Odpowiednik powłoki Unixowej:

today=`date +%F`
echo $today
Author: Peter Mortensen, 2012-06-08

14 answers

Można uzyskać bieżącą datę w sposób locale-agnostyczny za pomocą

for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x

Następnie można wyodrębnić poszczególne części używając podciągów:

set today=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%

Innym sposobem, w którym otrzymujesz zmienne zawierające poszczególne części, jest:

for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%

O wiele ładniejsze niż manipulowanie podłańcuchami, kosztem zanieczyszczania przestrzeni nazw zmiennych.

Jeśli potrzebujesz czasu UTC zamiast czasu lokalnego, komenda jest mniej więcej taka sama:

for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
 130
Author: Joey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-29 13:31:35

Jeśli chcesz to osiągnąć używając standardowych poleceń MS-DOS w pliku wsadowym, możesz użyć:

FOR /F "TOKENS=1 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET dd=%%A
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2,3 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET yyyy=%%C

Jestem pewien, że można to poprawić, ale daje to datę na 3 zmienne Dla dnia( dd), miesiąca (mm) i roku (RRRR). Następnie możesz użyć ich później w skrypcie wsadowym, zgodnie z wymaganiami.

SET todaysdate=%yyyy%%mm%%dd%
echo %dd%
echo %mm%
echo %yyyy%
echo %todaysdate%

Chociaż rozumiem, że odpowiedź została zaakceptowana na to pytanie, ta alternatywna metoda może być doceniona przez wielu, którzy chcą to osiągnąć bez użycia konsoli WMI, mam więc nadzieję, że doda to trochę wartości temu pytaniu.

 31
Author: richhallstoke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-20 08:59:29

Użyj date / T, aby znaleźć format w wierszu polecenia.

Jeśli format daty To "Thu 03/03/2016" użyj w ten sposób:

set datestr=%date:~10,4%-%date:~7,2%-%date:~4,2%
echo %datestr%
 21
Author: Anup Rav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-03 21:14:04

Jeszcze dwa sposoby, które nie zależą od ustawień czasu (oba wzięte z Jak uzyskać dane/Czas niezależny od lokalizacji). I oba dostają również Dzień tygodnia i żaden z nich nie wymaga uprawnień administratora!:

  1. MAKECAB - będzie 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
    
  2. ROBOCOPY - nie jest to natywne polecenie dla Windows XP i Windows Server 2003, ale można go pobrać ze strony Microsoftu. Ale jest wbudowany we wszystko od Windows Vista i wyżej:

    @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, które używają innych języków skryptowych Windows. Dadzą ci większą elastyczność, np. możesz uzyskać tydzień roku, Czas w milisekundach i tak dalej.

  3. JScript / BATCH hybrid (należy zapisać jako .bat). JScript jest dostępny na każdym systemie z Windows NT i powyżej, jako część Windows Script Host (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. VBScript / BATCH hybrid (czy możliwe jest osadzenie i wykonanie VBScript w pliku wsadowym bez użycia pliku tymczasowego?) ten sam przypadek 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że być zainstalowany na każdym komputerze, który ma. Net-Pobierz z Microsoft (v1, v2 i v3 (Tylko Dla Windows 7 i nowszych)). Zainstalowane domyślnie na wszystkich systemach Windows 7 / Win2008 i nowszych:

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    
  6. SELF-compiled jscript.net/batch (nigdy nie widziałem komputera z systemem Windows bez. 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 to nie może uzyskać roku i dnia tygodnia. Jest stosunkowo wolny, tworzy również plik tymczasowy i opiera się na znacznikach czasu ten logman umieszcza w swoich plikach dziennika.Będzie działać wszystko z Windows XP i wyżej. Prawdopodobnie nigdy nie będzie używany przez nikogo-w tym mnie-ale jest to 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
    

Więcej informacji o funkcji Get-Date .


 13
Author: npocmaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-23 19:05:33

Wystarczy użyć zmiennej %date%:

echo %date%
 7
Author: ProVi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-15 13:45:00

Bardzo podobała mi się metoda Joeya, ale pomyślałem, że trochę ją poszerzę.

W tym podejściu można uruchomić kod wiele razy i nie martwić się o starą wartość daty "trzymającą się", ponieważ jest już zdefiniowana.

Za każdym razem, gdy uruchomisz ten plik wsadowy, wyświetli on połączoną reprezentację daty i czasu zgodną z ISO 8601.

FOR /F "skip=1" %%D IN ('WMIC OS GET LocalDateTime') DO (SET LIDATE=%%D & GOTO :GOT_LIDATE)
:GOT_LIDATE
SET DATETIME=%LIDATE:~0,4%-%LIDATE:~4,2%-%LIDATE:~6,2%T%LIDATE:~8,2%:%LIDATE:~10,2%:%LIDATE:~12,2%
ECHO %DATETIME%

W tej wersji, musisz uważać, aby nie skopiować/wkleić tego samego kodu do wielu miejsc w pliku, ponieważ to powoduje zduplikowanie etykiet. Możesz albo mieć osobną etykietę dla każdej kopii, albo po prostu umieścić ten kod w swoim własnym pliku wsadowym i wywołać go z pliku źródłowego, gdzie to konieczne.

 6
Author: aardvarkk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-20 15:45:27

Ustawiłem zmienną środowiskową na wartość w pożądanym formacie liczbowym, wykonując to:

FOR /F "tokens=1,2,3,4 delims=/ " %a IN ('echo %date%') DO set DateRun=%d-%b-%c
 4
Author: Will,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-23 19:09:47

Zgodnie z odpowiedzią @ProVi po prostu zmień, aby dopasować formatowanie, które potrzebujesz

echo %DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%

Powróci

yyyy-MM-dd hh:mm:ss
2015-09-15 18:36:11

Edytuj Zgodnie z komentarzem @Jeb, który jest poprawny powyższy format czasu będzie działał tylko wtedy, gdy twoje polecenie DATE /T zwróci

ddd dd/mm/yyyy
Thu 17/09/2015

Jest łatwy do edycji w zależności od ustawień regionalnych, jednak używając indeksowania każdego znaku w łańcuchu zwracanego przez odpowiednią zmienną środowiskową %DATE%, możesz wyodrębnić potrzebne części łańcucha.

Np. Za pomocą %DATE~10,4% rozszerzy zmienną środowiskową DATE, a następnie użyje tylko 4 znaków rozpoczynających się od 11. (offset 10) znaku rozwiniętego wyniku

Na przykład, jeśli używasz daty w stylu US, to stosuje się następujące zasady

ddd mm/dd/yyyy
Thu 09/17/2015

echo %DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
2015-09-17 18:36:11
 3
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 23:31:11

Sprawdź to..

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 "MS=%dt:~15,3%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%-%MS%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
 1
Author: Bhaskara Arani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-24 10:02:39

Ze względu na format daty i czasu jest informacją specyficzną dla lokalizacji, pobranie ich ze zmiennych %date % I % time% będzie wymagało dodatkowego wysiłku, aby przetworzyć łańcuch z przekształceniem formatu. Dobrym pomysłem jest użycie jakiegoś API do pobierania struktury danych i analizowania, jak chcesz. WMIC to dobry wybór. Poniżej przykład użycia Win32_LocalTime. Możesz również użyć Win32_CurrentTime lub Win32_UTCTime.

@echo off  
SETLOCAL ENABLEDELAYEDEXPANSION  
for /f %%x in ('wmic path Win32_LocalTime get /format:list ^| findstr "="') do set %%x  
set yyyy=0000%Year%  
set mmmm=0000%Month%  
set dd=00%Day%  
set hh=00%Hour%  
set mm=00%Minute%  
set ss=00%Second%  
set ts=!yyyy:~-4!-!mmmm:~-2!-!dd:~-2!_!hh:~-2!:!mm:~-2!:!ss:~-2!  
echo %ts%  
ENDLOCAL  

Wynik:
2018-04-25_10:03:11

 1
Author: Ivellios,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-25 12:36:28

Możliwe jest użycie PowerShell i przekierowanie jego wyjścia do zmiennej środowiskowej za pomocą pętli.

Z linii poleceń (cmd):

for /f "tokens=*" %a in ('powershell get-date -format "{yyyy-mm-dd+HH:mm}"') do set td=%a

echo %td%
2016-25-02+17:25

W pliku wsadowym możesz uciec %a jako %%a:

for /f "tokens=*" %%a in ('powershell get-date -format "{yyyy-mm-dd+HH:mm}"') do set td=%%a
 1
Author: user103004,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-23 19:11:05

Jeśli masz zainstalowany Python, możesz zrobić

python -c "import datetime;print(datetime.date.today().strftime('%Y-%m-%d'))"

Możesz łatwo dostosować ciąg formatowania do swoich potrzeb.

 1
Author: CodeKid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-23 19:11:22
echo %DATE:~10,4%%DATE:~7,2%%DATE:~4,2% 
 0
Author: Hillmee Bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 03:52:36

Jeśli nie masz nic przeciwko jednorazowej inwestycji 10 do 30 minut, aby uzyskać niezawodne rozwiązanie (które nie zależy od ustawień regionu systemu Windows), przeczytaj dalej.

Uwolnijmy nasze umysły. Czy chcesz uprościć skrypty, aby tak wyglądały? (Załóżmy, że chcesz ustawić zmienną LOG_DATETIME)
FOR /F "tokens=* USEBACKQ" %%F IN (`FormatNow "yyyy-MM-dd"`) DO (
  Set LOG_DATETIME=%%F
)

echo I am going to write log to Testing_%LOG_DATETIME%.log
Możesz. Po prostu zbuduj FormatNow.exe z C#. Net i dodaj go do swojej ścieżki.

Uwagi:

  1. możesz użyć dowolnej edycji Visual Studio, takiej jak Visual Studio Express, aby zbudować FormatNow.exe.
  2. W Visual Studio wybierz Projekt C# "Console Application", a nie" Windows Forms Application".
  3. zdrowy rozsądek: wbudowany Format.exe będzie potrzebował.NET Framework do uruchomienia.
  4. zdrowy rozsądek: po dodaniu FormatNow.exe do zmiennej PATH, musisz ponownie uruchomić CMD, aby uzyskać efekt. Dotyczy to również każdej zmiany zmiennych środowiskowych.

Korzyści:

  1. nie jest powolny (kończy się w ciągu 0,2 sekundy).
  2. wiele formatów jest obsługiwanych https://msdn.microsoft.com/en-us/library/8kb3ddd4 (v=vs.110). aspx na przykład FormatNow "ddd", aby uzyskać tylko dzień tygodnia, FormatNow "yyyy", aby uzyskać tylko rok
  3. nie zależy od ustawień regionu systemu Windows, więc jego wyjście jest znacznie bardziej niezawodne. Z drugiej strony, %date% nie daje spójnego formatu na różnych komputerach i nie jest wiarygodne.
  4. nie musisz tworzyć tak wielu zmiennych CMD i zanieczyszczać zmienną przestrzeń nazw.
  5. wymagałoby to 3 linii w skrypcie wsadowym, aby wywołać program i uzyskać wyniki. Powinien być wystarczająco krótki.

Kod źródłowy FormatNow.exe, który zbudowałem za pomocą Visual Studio 2010 (wolę zbudować go sam, aby uniknąć ryzyka pobrania nieznanego, prawdopodobnie złośliwego programu). Wystarczy skopiować i wkleić poniższe kody, zbudować program raz, a następnie masz niezawodny program do formatowania daty dla wszystkich przyszłych zastosowań.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace FormatNow
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                if (args.Length < 1)
                {
                    throw new ArgumentException("Missing format");
                }
                string format = args[0];
                Console.Write(DateTime.Now.ToString(format, CultureInfo.InvariantCulture.DateTimeFormat));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

    }
}

Ogólnie, gdy radzenie sobie ze skomplikowaną logiką, możemy to uprościć, budując bardzo mały program i wywołując program, aby przechwycić wyjście z powrotem do zmiennej skryptu wsadowego. Nie jesteśmy studentami i nie przystępujemy do egzaminów wymagających od nas przestrzegania zasady batch-script-only, aby rozwiązać problemy. W rzeczywistym środowisku pracy dozwolona jest dowolna (legalna) metoda. Dlaczego nadal powinniśmy trzymać się słabych możliwości Windows batch script, który wymaga obejścia wielu prostych zadań? Dlaczego warto korzystać z złe narzędzie do pracy?

 -2
Author: sken130,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-09 10:17:10