Як отримати поточну дату / час у командному рядку Windows у відповідному форматі для використання у назві файлу / папки?


540

Оновлення: Тепер, коли це 2016 рік, я б для цього використовував PowerShell, якщо для цього немає дійсно переконливої ​​причини, сумісної з зворотним ходом, особливо через проблему використання регіональних налаштувань date. Дивіться @ npocmaka's https://stackoverflow.com/a/19799236/8479


Що таке оперативні дані командного рядка Windows, за допомогою яких я можу отримати поточний час у форматі, який я можу вписати у ім’я файлу?

Я хочу мати файл .bat , який застібає каталог в архів з поточною датою і часом , як частина імені, наприклад, Code_2008-10-14_2257.zip. Чи є якийсь простий спосіб зробити це незалежно від регіональних налаштувань машини?

Я не дуже проти формату дати, в ідеалі це буде yyyy-mm-dd, але все просто.

Поки що я отримав це, що на моїй машині дає мені 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

Я можу з цим жити, але це здається трохи незграбним. В ідеалі було б коротше і мати раніше згаданий формат.

Я використовую Windows Server 2003 та Windows XP Professional. Я не хочу встановлювати додаткові утиліти, щоб досягти цього (хоча я усвідомлюю, що є деякі, які будуть непогано форматувати дату).


7
Створення автоматизованої резервної копії коду? Добре вам! Ми повинні зробити це теж :)
Андрій Ронеа

24
використовуйте повноваження людей ...[datetime]::now.tostring("yyyy-MM-dd")
Нахт - Відновіть Моніку

Чи можна завантажувати файли зі створеною датою за допомогою xp_cmdshell в SQL Server? Я задав питання про StackOverflow, будь ласка , будь ласка , см посилання @ stackoverflow.com/q/32293517/3327081
kolunar

Відповіді:


667

Дивіться пакетний файл Windows (.bat), щоб отримати поточну дату у форматі MMDDYYYY :

@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%

Якщо ви віддаєте перевагу часу в 24-годинному / військовому форматі, ви можете замінити другий рядок FOR таким:

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

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

Якщо ви хочете, щоб дату не залежало від замовлення на день / місяць у регіоні, ви можете використовувати "WMIC os GET LocalDateTime" як джерело, оскільки це в порядку 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
Місцева дата - [2012-06-19 10: 23: 47.048]


44
Для британських людей вам потрібно For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)буде другий рядок.
Рорі

17
Це рішення залежить від локальності, Рорі подав приклад для Великобританії для інших місцевостей, де дата настає як 22-02-2012, вам потрібно замінити delims = / на delims = -
Nuno Furtado

25
У моїй системі% TIME% повертає значення типу "0:01:15" та "3:15:12", а код %% a %% b у відповіді дає провідні пробіли, такі як "001" та "315". Щоб отримати чотиризначний hhmm, використовуйте це: For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b))Це повертає такі значення, як "0001" та "0315", які я віддаю перевагу у своїх іменах.
twamley

10
Гарна версія wmicкоманди! Поки що я лише бачив WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table. Так само, щоб потрапити 20120623-1619в мій місцевий часовий пояс Амстердама, одним рядком:for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%
Арджан

5
Для мене це говорить%%a was unexpected at this time.
Scott zuz22 Blacklock

109

Незалежний синтаксичний розбір часу від дати

Формат виводу %DATE%і dirкоманди залежать від регіону і, таким чином, не є надійним і розумним. date.exe (частина UnxUtils ) доставляє будь-яку інформацію про дату та час у будь-якому форматі, що вигадується. Ви також можете витягнути інформацію про дату / час із будь-якого файлу date.exe.

Приклади: (у cmd-скрипті використовуйте %% замість%)

date.exe +"%Y-%m-%d"
2009-12-22

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

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503: Будь-який текст

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Текст: 09/12/22-будь-який текст-18.55

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

Інформація про дату / час із довідкового файлу:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Використовуючи його в сценарії CMD, щоб отримати інформацію про рік, місяць, день, час:

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

Використовуючи його в сценарії CMD, щоб отримати позначку часу в будь-якому необхідному форматі:

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

Витяг даних про дату / час з будь-якого довідкового файлу.

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

Додавання до файлу інформації про дату / час:

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 є частиною безкоштовних інструментів GNU, які не потребують встановлення.

ПРИМІТКА. Копіювання date.exeу будь-який каталог, який знаходиться на шляху пошуку, може призвести до відмови інших сценаріїв, які використовують вбудовану dateкоманду Windows .


4
Набагато краще, ніж дивно популярніше рішення вище, але мені довелося додати / t, щоб уникнути підказки на Windows 8.1
rainabba

6
Вбудована Windows 8.1, date.exeсхоже, залежить від локальної локальності. Він повертає дату в dd / MM / yyyy в моїй системі, якби вона не залежала від місцевості, я очікую або MM / dd / yyyy, або yyyy-MM-dd. Я не думаю, що ця відповідь не говорить про вбудований date.exe, але про якусь сторонній версії.
SSS

1
це локально незалежно, якщо ви надасте йому потрібний формат у командному рядку
terrinecold

3
Зауважте, що date.exe (частина UnxUtils) не збігається з командою вбудованої дати. Тож якщо вам доведеться додати / т, виконується команда windows date. Якщо працює щось на зразок date.exe + "% Y-% m-% d", ви правильно встановили UnxUtils. :-)
just.do.it

Чи можна завантажувати файли зі створеною датою за допомогою xp_cmdshell в SQL Server? Я спробував команду "forfiles", але безрезультатно. Я задав питання про StackOverflow, будь ласка , будь ласка , см посилання @ stackoverflow.com/q/32293517/3327081
kolunar

103

Ще два способи, які не залежать від параметрів часу (обидва взяті з : Як отримати дані / час незалежними від локалізації:) . І обидва також отримують день тижня, і жоден з них не вимагає дозволу адміністратора !:

  1. MAKECAB - буде працювати в КОЖНІЙ системі Windows (швидко, але створює невеликий темп-файл) (сценарій 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 - це не рідна команда для Windows XP та Windows Server 2003, але її можна завантажити з сайту Microsoft . Але він вбудований у все від Windows Vista і вище:

    @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
    

    І ще три способи, що використовують інші мови скриптів Windows. Вони дадуть вам більшу гнучкість, наприклад, ти можеш отримати тиждень року, час у мілісекундах тощо.

  3. JScript / пакетний гібрид (потрібно зберегти як .bat). JScript доступний у будь-якій системі NT і вище, як частина Windows Script Host ( хоча його можна відключити через реєстр, це рідкісний випадок ):

    @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 ( Чи можна вставляти та виконувати VBScript у пакетному файлі без використання тимчасового файлу? ) Той самий випадок, що і JScript, але гібридизація не настільки досконала:

    :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 - може бути встановлений на кожній машині, що має .NET - завантаження з Microsoft ( v1 , v2 , v3 (лише для Windows 7 і вище)). Він встановлений за замовчуванням на всіх версіях Windows 7 / Windows Server 2008 і вище:

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

    Щоб використовувати його з пакетного файлу:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Самостійно складений jscript.net/batch (ніколи не бачив машину Windows без .NET, тому я думаю, що це досить портативний):

    @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 Це не може отримати рік і день тижня. Він порівняно повільний, а також створює тимчасовий файл і заснований на часових марках, які логман ставить на свої файли журналів. Він буде працювати над усім, від Windows XP і вище. Це, ймовірно, ніколи не буде використовуватися кимсь, включаючи мене, - але це ще один спосіб ...

    @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. Ще один спосіб із WMIC, який також дає тиждень року та день тижня, але не мілісекунди (на мілісекунди перевірте відповідь фоксідриву):

    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. Використовуючи TYPEPERF з деякими зусиллями, щоб бути швидким та сумісним з різними мовними налаштуваннями та якомога швидше:

    @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 дозволяє викликати методи JavaScript, схожі на метод JScript, продемонстрований у №3 вище. Майте на увазі, що властивості об’єкта JavaScript Дата, що містять місячні значення, нумеруються від 0 до 11, а не від 1 до 12. Отже, значення 9 означає жовтень.

    <!-- : 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>
    

2
для powershell C: \> for / f %% i in ('powershell get-date -format "{yyyyMMdd_HHmmss}" ") встановіть datetime = %% i C: \> echo% datetime%
Samuel

1
makecab: це працює, створюючи файл, який називається ~.rpt, і шукати stringвсередині нього, починаючи з цього makecab, як на зразок рядка MakeCAB Report: Tue Sep 02 22:15:57 2014. для мене ця команда не локалізована, вона не залежить від мови. Ця хитрість спирається на це. Будемо сподіватися, що це ніколи не буде, інакше будьте обережні!
n611x007

10
Мені подобається вступний текст "Ще два ..." з подальшими 8 рішеннями.
Адам Сміт

1
Що, ні mshtaгібрид? :) Майте на увазі, якщо я відредагую вашу відповідь і додаю її? Здається, це найкраща колекція езотеричних розчинів, і, схоже, mshtaтут належить.
rojo

1
Прийняте рішення не спрацювало б для мене незалежно від того, що я намагався. Кілька цих рішень працювали на мене. (Пакет і Пауершелл).
Бретт Почекай

44

Ось варіант з alt.msdos.batch.nt, який працює локально незалежно.

Помістіть це у текстовий файл, наприклад, 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<-------------

Щоб змусити код працювати без помилок msg's до stderr, мені довелося додати єдині лапки навколо змінних призначень для %% a, %% b та %% c. Моя мова (PT) викликала помилки на одному етапі в циклі / синтаксичному аналізі, де виконувались такі елементи, як "set = 20". Цитати дають маркер (хоч і порожній) для лівої частини оператора призначення.

Недоліком є ​​брудні назви змінних локалей: 'yy', 'mm' та 'dd'. Але ей, кому все одно!


3
Це ідеально і це найпростіший та найелегантніший підхід, який я бачив на сьогоднішній день.
Даг

2
Дивіться також удосконалення Йерун в , які необхідні не всі локалі використовувати рядки dd, mmі yyна виході echo:^|date.
Ар'ян

працює не у всіх локалях. (Німецькою мовою dateдає Geben Sie das neue Datum ein: (TT-MM-JJ), де JJламається ваш сценарій (очікує YY))
Стефан

35

Я використовую це (знову не незалежно від регіону (Великобританія))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%

Дивіться про змінні середовища Cmd.exe з Колон та Тільде про цю маловідому, але дуже ефективну методику. (
Вказівка ​​на

Ось посилання на пакетні файли Microsoft для Windows XP . Це посилання включає використання параметрів партії . На жаль, жодної дискусії про техніку «нарізки».
DavidRR

Це для мене не зовсім працює. Можливо, це щось стосується регіональних налаштувань? Я отримую вихід "/ 15 / - 1-We_1009", коли запускаю його в середу, 15 жовтня 2014 р.
Joel B

26

Перші чотири рядки цього коду дадуть вам надійні змінні YY DD MM YYYY HH Min Sec у Windows XP Professional та новіших версіях.

@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

Ідеально, це найкраще рішення для мене, оскільки виклик PS призведе до появи тексту cmd, який буде дивно виглядати.
Ste

25

На жаль, це не захищено від регіональних налаштувань, але воно робить те, що ви хочете.

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%

Дивовижні речі, які ви можете знайти у Вікіпедії .


1
Позначка - знайдено змінні середовища Cmd.exe із двокрапкою та тильдою, що описує техніку змінної «нарізки», яку ви знайдете у вашій відповіді. Більше не знаходимо цієї інформації у статті Вікіпедії. Хочеться знайти авторитетну довідку від Microsoft.
DavidRR

1
Ось посилання на пакетні файли Microsoft для Windows XP . Це посилання включає використання параметрів партії . На жаль, жодної дискусії про техніку «нарізки».
DavidRR

18

Будь ласка, використовуйте наступний сценарій, щоб отримати поточний день у командному рядку:

echo %Date:~0,3%day

8
Зігравшись із цим, це найкоротший час, який я знайшов Дата і час: відлуння% дата%% час%
loomi

15

Інший спосіб ( кредит ):

@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%

Зауважте, що обидві мої відповіді тут все ще залежать від порядку дня та місяця, що визначається регіональними налаштуваннями - не впевнені, як обійти це.


14
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip

http://www.dotnetperls.com/7-zip-examplesмає кілька хороших моментів, які можуть бути корисні для когось у майбутньому.
Сараванан

13

Це насправді не коротше, але це може бути більш гнучким способом ( кредит ):

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%

10

Ось спосіб отримати час побачення в одному рядку:

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

У США це виведе "yyyy-mm-dd hhmm". Різні регіональні налаштування призведуть до виходу% date date%, але ви можете змінити порядок маркерів.

Якщо вам потрібен інший формат, змініть оператор echo, переставляючи маркери або використовуючи різні (або ні) роздільники.


Чи є спосіб отримати час у 12-годинному форматі, а також відобразити інформацію про AM або PM?
Санглі


9

Коротка відповідь :

 :: 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 

Довга відповідь

    @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

:: у cmd для / f% i in ('PowerShell -Command "get-date" -формат "yyyyMMdd"') встановіть yyyyMMdd =% i :: у cmd-скрипті для / f %% i in ('PowerShell -Command "get-date" -формат "yyyyMMdd" ') do set yyyyMMdd = %% i
Йордан Георгієв

8

Меттью Джонсон однолінійне рішення, щоб отримати дату та час з одним лайнером, є красномовними та корисними.

Однак для роботи в пакетному файлі потрібна проста модифікація:

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

1
Не працює в CMD (%% a в цей час було несподівано) або в PowerShell (Відсутнє відкриття '(' після ключового слова для) у Windows 8.1
rainabba

3
Rainabba, саме така помилка ви отримуєте, коли ця команда видається з рядка CMD . Однак " зсередини пакетного файлу " команда повертає "2014-01-30 1324".
Джон Ленгстафф

1
або набагато простіше було б без циклу forecho %date:/=-%%time::=-%
Герхард Барнард

7

І ось аналогічний batch-файл для часової частини.

:: 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


Привіт, мені вдалося завантажувати файли відповідно до модифікованої дати за допомогою команди нижче, z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path” але я хочу знати, як завантажувати файли відповідно до створеної дати. Будь-яка допомога буде дуже вдячна. Запитання було задано про stackoverflow, але відповіді ще немає. Будь ласка , зверніть увагу на посилання на деталі stackoverflow.com/q/32293517/3327081
kolunar

1
Задайте нове запитання з цього приводу. Я ніколи не використовував forfiles.
Jeroen Wiert Pluimers

7

Я змінив відповідь на пакетний файл від vMax, щоб він працював і з голландською мовою.
Голландці - стійкі , як ми - є кілька змін в %date%, date/tіdate що перерва оригінал пакетного файлу.

Було б добре, якщо деякі люди можуть перевірити це і на інших локальних системах Windows і повідомити про результати.
Якщо пакетний файл не працює у вашому місці, то, будь ласка, включіть у командний рядок вихід цих двох операцій:
echo:^|date
date/t

Це зразок виводу, який ви повинні отримати з batch-файлу:

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

Ось переглянений код із коментарями, чому:

:: /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 jeroen@pluimers.com 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


2
Деякі користуються роками спочатку або не мають провідних нулів; див. формат дати Вікіпедії за країною . Французи можуть використовувати jj-mm-aaaaдля jour, mois, annee? Італійці, можливо, gg/mm/aaaaдля giorno, mese, anno? Німці tt.mm.jjjjза Тег, Монат, Яхр? Але потім: я думаю, у більшості країн використовується лише кілька мов. Як і в Нідерландах, справді Windows часто буде англійською чи голландською, не багато іншого. Досить добре для мене.
Ар’ян

2
Як осторонь: інша версія прихованих функцій пакетних файлів Windows менш досконала (потребує виправлення для голландців jjі не застосовує чотиризначний рік), але використовує shiftдля відміни дня, як Monабо ma. Просто різні.
Ар'ян

4
Він ламається на німецькій системі. Робота і місяць працюють, але день провалюється, оскільки "день" починається з "Т" німецькою мовою ("Тег"), а не з "d". Рядок формату в підказці є (TT-MM-JJ), date/tвихід - 23.06.2012. / cc @Arjan
balpha

2
Ще одна сторона: можна також отримати замовлення з реєстру , використовуючи reg query "HKCU\Control Panel\International" /vShortDate. Остерігайтесь під час тестування: для відкритого командного рядка зміна цього параметра панелі керування також змінює формат, який використовується для відображення дати (і для, dateі date /tта echo %date%), але в Windows 7 НЕ змінює формат нової дати! Як міняю короткий формат дати в YY/MM/dd, отримує мене: The current date is: 12/06/23 Enter the new date: (mm-dd-yy). Відкриття нового командного рядка виправляє це.
Ар’ян

2
@Arjan це має бути reg query "HKCU\Control Panel\International" /v sShortDate.
tricasse

6

Це те, що я використав:

::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:-=.%

Якщо ви хочете отримати додаткові ідеї щодо автоматичного резервного копіювання архівів 7-Zip, у мене є безкоштовний / відкритий проект, який ви можете використовувати або переглянути для ідей: http://wittman.org/ziparcy/


У моїй системі% date% містить "вт 10.10.2008". Отже, вам все одно потрібно буде відрізати (або іншим чином мати справу) з "Вт" та символом пробілу.
BoltBait

Привіт @micahwittman. Чи можна завантажувати файли зі створеною датою за допомогою xp_cmdshell в SQL Server? Я спробував команду "forfiles", але безрезультатно. Я задав питання про StackOverflow, будь ласка , будь ласка , см посилання @ stackoverflow.com/q/32293517/3327081
kolunar

5

У мене була схожа проблема. У мене є автоматичне щоденне завантаження зашифрованого файлу з FTP-сервера. Я хотів розшифрувати файл за допомогою gpg, перейменувати файл на поточну дату (формат YYYYMMDD) і занести розшифрований файл у папку для правильного відділу.

Я переглянув кілька пропозицій щодо перейменування файлу за датою і не мав удачі, поки не натрапив на це просте рішення.

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

Він працював ідеально (тобто ім'я файлу виходить як "2011-06-14.txt").

(Джерело)


5

Функція, заснована на 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

Вгору: Регіон незалежний. Знизу: лише системні адміністратори можуть запускати wmic.exe.

Використання:

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

Це повторює такий рядок:

2014-01-22 12:51:53

Зауважте, що параметри функцій не є параметрами - тобто вам слід надати імена змінних замість значень.

Усі параметри необов’язкові, тому call:Now Y Mце дійсний дзвінок, якщо ви хочете отримати лише рік та місяць.


4

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

Погляньте всередині ZIP-файлу на те, що називається "Date.exe" і перейменуйте його "DateFormat.exe" (щоб уникнути конфліктів).

Помістіть його у вашу папку system32.

У ньому багато варіантів "виведення дати".

Для допомоги використовуйте DateFormat.exe --h

Я не впевнений, як би ви поставили його вихід у змінну середовища ... за допомогою SET.


1
Дякую, хоча це питання спеціально для цього, не завантажуючи додаткові інструменти.
Рорі

3

Регіональне незалежне рішення, що генерує формат дати 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:

Що ще можна оптимізувати: інші процеси можуть заплутатися, якщо використовувати формат дати за короткий період, поки він буде змінений. Тож аналіз результатів відповідно до існуючого рядка формату може бути "безпечнішим", але буде складнішим


ви могли б рег запит Ідате ( technet.microsoft.com/en-us/library/cc978637.aspx ) і умовно продовжити (3 можливих значень в відповідно до TechNet) - хоча я не пробував ще.
Вінсент Де Смет

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 adolfo.dimare@gmail.com
:: - 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

0

З огляду на відому місцевість, для довідки у функціональній формі. На ECHOTIMESTAMPшоу виклику , як отримати тимчасову мітку в змінну ( DTSв даному прикладі) .

@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

І збережено у файл, timestamp.bat, ось вихід:

введіть тут опис зображення


Здається, що це стосується регіонального питання - це працює не на всіх англійських машинах.

Не здивований, @SteveFest. Якби можна було тимчасово встановити локаль, це може допомогти забезпечити глобальне рішення, але, здається, потрібно заздалегідь знати регіон. Ваша мова en-US чи en-SomewhereElse?
bvj

@SteveFest Я припускаю, що можна було б скласти список локалів, де кожен включає вирази дати / часу із зразком для перевірки. Я дуже зайнятий, але спробую оновити свою відповідь, щоб проілюструвати. Чи можете ви показати мені зразки результатів часу / дати HK? Я, можливо, нерозумно припускаю, що zh-HK друкує цифри за фіксованим зміщенням.
bvj

zh-HK: (yy)yy年m月d日 hh:mm- немає провідних нулів. (yy) можна ігнорувати, оскільки у нас двозначний рік чи 4-значний рік. Але зверніть увагу на одне: формат часу дати можна змінити на кожній машині.

Дякую @SteveFest, я зв’яжуся протягом декількох тижнів. Бігайте systeminfoв CLI і дайте мені знати, що ви бачите System Locale. Програмі потрібен час для запуску, але, можливо, результат локалізації може бути кешований і згодом використаний для індексації формату часових позначок.
bvj

0

У Windows 7 цей код працює для мене:

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%

І знову. Приємно, що це працює на вашій машині, але ви пропустили точкуindependent of the regional settings of the machine
травня

-1

Зауважу, що о / р не просив рішення, незалежне від регіону. Моє рішення для Великобританії, хоча.

Це найпростіше можливе рішення, однорядкове рішення для використання у файлі Batch:

FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%

2
Він згадав про незалежне рішення регіону ...particularly because of the regional settings issue with using date. Btw. Ваше рішення те саме, що і двадцять інших відповідей.
jeb

Так, але мій насправді міг би бути (необов'язково) використаний у командному рядку. Яка заслуга в опублікуванні 35 рядків коду, якщо один рядок коду забезпечить те саме рішення?
Ed999

Я не бачу жодної різниці в старих відповідях @Matthew Johnson, 2010 або @KChiki, 2011
'18

незважаючи на те, що ця відповідь невірна, щоб коментувати фактичну ансвр, а для циклу тут не потрібен, коли ви могли просто зробити цеecho %date:/=-%
Герхард Барнард

Ні. Якщо ви опустите цикл FOR, змінних не може бути створено, а дата, яку ви зіткнулися з проблемою для вилучення, залишається марною. З циклом FOR змінні, створені циклом, доступні для використання в інших частинах сценарію. Я настійно зневажую, використовуючи десятки рядків коду для створення циклу FOR, коли потрібно лише 1 рядок. І я рішуче зневажую розміщення рішень без командного рядка, де o / p спеціально попросив однорядне рішення для використання в командному рядку.
Ed999

-3

Я знаю, що існують численні способи, про які вже говорилося. Але ось мій спосіб розбити це, щоб зрозуміти, як це робиться. Сподіваємось, це корисно для тих, хто любить покроковий метод.

:: 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

3
Ви пропустили точкуindependent of the regional settings of the machine
jeb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.