Обновление: теперь, когда в 2016 году я буду использовать PowerShell для этого, если у него нет убедительной обратной совместимости, особенно из-за проблем с региональными настройками с использованием date
. См. @npocmaka https://stackoverflow.com/questions/203090/how-do-i-get-current-datetime-on-the-windows-command-line-in-a-suitable-format
Какие операторы командной строки Windows, которые я могу использовать для получения текущего datetime в формате, который можно поместить в имя файла?
Я хочу иметь файл .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. Я не хочу устанавливать дополнительные утилиты для достижения этого (хотя я понимаю, что есть некоторые, которые будут делать красивое форматирование даты).
Смотрите Пакетный файл 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]
Выходной формат %DATE%
и команды dir
зависит от региона и, следовательно, не является ни надежным, ни умным. date.exe (часть UnxUtils) предоставляет любые дату и время в любом воображаемом формате. Вы также можете извлечь информацию о дате/времени из любого файла с помощью date.exe
.
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 script, чтобы получить информацию о год, месяц, день, время:
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 script, чтобы получить отметку времени в любом требуемом формате:
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.
date.exe
зависит от локали. Она возвращает дату в формате dd / MM / yyyy в моей системе, если бы она не зависела от локали, я ожидала бы либо MM / dd / yyyy, либо yyyy-MM-dd. Я не думаю, что этот ответ говорит о встроенном date.exe, а о какой-то сторонней версии.
Еще два способа, которые не зависят от настроек времени (оба взяты из : как получить данные/время независимо от локализации:). И оба получают день недели, и ни один из них не требует прав администратора!:
MAKECAB - будет работать на КАЖДОЙ системе Windows (быстро, но создает небольшой временный файл) (foxidrive script):
@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
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 script. Они придадут вам большую гибкость, например. вы можете получить неделю года, время в миллисекундах и т.д.
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());
VSCRIPT/BATCH hybrid (Возможно ли внедрить и выполнить 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),", ","-")
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=%%#
Скомпилированный 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"));
Logman Это не может получить год и день недели. Он сравнительно медленный, а также создает временный файл и основан на отметках времени, которые 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
Еще один способ: WMIC, который также дает неделю года и день недели, но не миллисекунды (для миллисекундного ответа на запрос 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%
С помощью 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
MSHTA позволяет вызывать методы JavaScript, похожие на метод JScript, продемонстрированный в № 3 выше. Имейте в виду, что свойства объекта JavaScript Date с месячными значениями нумеруются от 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>
makecab
: это работает путем создания файла с именем ~.rpt
и поиска string
внутри него, начиная с makecab
, которая представляет собой строку, MakeCAB Report: Tue Sep 02 22:15:57 2014
. для меня эта команда не локализована, она не зависит от локали. Этот трюк полагается на это. Будем надеяться, что этого никогда не будет, иначе остерегайтесь!
Здесь вариант из 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<-------------
Чтобы получить код для работы sans error msg в stderr, мне пришлось добавить одинарные кавычки, аранжировать переменные для %% a, %% b и %% c. Моя локаль (PT) вызывала ошибки на одном этапе цикла/синтаксического анализа, когда выполнялось выполнение таких действий, как "set = 20". Кавычки дают токен (хотя и пустой) для левой части оператора присваивания.
Недостатком являются беспорядочные имена переменных локали: 'yy', 'mm' и 'dd'. Но эй, кто заботится!
dd
, mm
и yy
в выводе echo:^|date
.
Я использую это (опять же не независимое от региона (Великобритания))
set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
К сожалению, это не застраховано от региональных настроек, но делает то, что вы хотите.
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%
Удивительно, что вы можете найти на Wikipedia.
Первые четыре строки этого кода предоставят вам надежные переменные 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
Пожалуйста, используйте следующий script, чтобы получить текущий день в командной строке:
echo %Date:~0,3%day
Thuday
.
Другой способ (кредит):
@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%
Обратите внимание, что оба моих ответа здесь все еще зависят от порядка дня и месяца, как это определено региональными настройками, - не уверен, как обойти это.
"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
имеет некоторые хорошие моменты, которые могут быть полезны для кого-то в будущем.
Это не очень краткий, но может быть более гибким (кредит):
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%
Здесь можно получить дату в одной строке:
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%, но вы можете изменить порядок маркеров.
Если вам нужен другой формат, измените инструкцию эха, изменив токены или используя разные (или нет) разделители.
Короткий ответ:
:: 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
Просто используйте эту строку:
PowerShell -Command "get-date"
Одностороннее решение Мэтью Джонсона для получения даты и времени с одним слоем является красноречивым и полезным.
Однако для работы из пакетного файла требуется простая модификация:
for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
И вот такой же пакетный файл для временной части.
:: 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
- Йерун
z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path”
Но Я хочу знать, как загружать файлы в соответствии с датой создания. Любая помощь будет принята с благодарностью. Был задан вопрос по stackoverflow, но пока нет ответа. Пожалуйста, посмотрите на ссылку для деталей stackoverflow.com/q/32293517/3327081
forfiles
.
Я изменил ответ с командным файлом vMax, чтобы он работал с голландским языком тоже.
У голландцев - постоянных, как мы, - есть несколько изменений в %date%
, date/t
и date
, которые разбивают исходный пакетный файл.
Было бы неплохо, если бы некоторые люди могли проверить это и на других локалях Windows, а также сообщить результаты.
Если пакетный файл выходит из строя в вашем местоположении, пожалуйста, включите вывод этих двух операторов в командной строке: echo:^|date
date/t
Это пример вывода, который вы должны получить из пакетного файла:
C:\temp>set-date-cmd.bat
Today is Year: [2011] Month: [01] Day: [03]
20110103
Вот пересмотренный код с комментариями о том, почему:
:: https://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 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
- Йерун
jj-mm-aaaa
для jour, mois, annee? Может быть, итальянцы gg/mm/aaaa
для giorno, mese, anno? Немцы tt.mm.jjjj
для Tag, Monat, Jahr? Но потом: я думаю, что в большинстве стран используется только несколько языков. Как и в Нидерландах, на самом деле Windows часто будет английской или голландской, не намного. Достаточно хорошо для меня.
jj
и не применяется год из 4 цифр), но использует shift
чтобы отбросить день, например, Mon
или ma
. Просто другой.
Функция, основанная на 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%
Это echos строка вроде этого:
2014-01-22 12:51:53
Обратите внимание, что параметры функции out-Parameters - то есть вы должны указывать имена переменных вместо значений.
Все параметры являются необязательными, поэтому call:Now Y M
является действительным вызовом, если вы хотите получать только год и месяц.
Это то, что я использовал:
::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/
У меня была аналогичная проблема. У меня есть автоматическая ежедневная загрузка с FTP-сервера зашифрованного файла. Я хотел расшифровать файл с помощью gpg, переименовать файл в текущую дату (формат YYYYMMDD) и удалить дешифрованный файл в папку для правильного отдела.
Я рассмотрел несколько предложений по переименованию файла в соответствии с датой, и мне не повезло, пока я не наткнулся на это простое решение.
for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt
Он работал отлично (т.е. имя файла появляется как "2011-06-14.txt" ).
http://sourceforge.net/projects/unxutils/files/
Просмотрите ZIP файл для "Date.exe" и переименуйте его "DateFormat.exe" (во избежание конфликтов).
Поместите его в папку Windows system32.
В нем много опций "date output".
Для справки используйте DateFormat.exe --h
Я не уверен, как вы поместите свой вывод в переменную среды... с помощью SET.
Региональное независимое решение, генерирующее формат даты 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:
Что еще можно оптимизировать: Другие процессы могут запутаться при использовании формата даты за короткий период, пока он изменен. Таким образом, синтаксический анализ вывода в соответствии с существующей строкой формата может быть "более безопасным", но будет более сложным.
:: 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
Я отмечаю, что o/p не просил регионарно-независимого решения. Мое решение для Великобритании.
Это самое простое решение - однострочное решение для использования в пакетном файле:
FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%
...particularly because of the regional settings issue with using date
. Btw. Ваше решение совпадает с двадцатью другими ответами.
В 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
Учитывая известную локальность, для справки в функциональной форме. Вызов 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, здесь вывод:
Я знаю, что уже упоминалось множество способов. Но вот мой способ разбить его, чтобы понять, как это делается. Надеюсь, это полезно для тех, кто любит поэтапный метод.
:: 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
independent of the regional settings of the machine
[datetime]::now.tostring("yyyy-MM-dd")