14 ответов:
вы можете получить текущую дату в локаль-агностический способ с помощью
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%xзатем вы можете извлечь отдельные части, используя строки:
set today=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%другой способ, где вы получаете переменные, которые содержат отдельные части, было бы:
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x set today=%Year%-%Month%-%Day%гораздо приятнее, чем возиться с подстроками, за счет загрязнения вашего пространства имен переменных.
Если вам нужно UTC вместо местного времени, команда более или менее то же самое:
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x set today=%Year%-%Month%-%Day%
Если вы хотите достичь этого с помощью стандартных команд MS-DOS в пакетном файле, то вы можете использовать:
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Я уверен, что это может быть улучшено дальше, но это дает дату в 3 переменных для Дня (dd), месяца (мм) и года (гггг). Затем вы можете использовать их позже в своем пакетном скрипте по мере необходимости.
SET todaysdate=%yyyy%%mm%%dd% echo %dd% echo %mm% echo %yyyy% echo %todaysdate%хотя я понимаю, что ответ был принят для этого вопроса, этот альтернативный метод может быть оценен многими, кто хочет достичь этого без используя консоль WMI, поэтому я надеюсь, что это добавляет некоторую ценность этому вопросу.
используйте date / T, чтобы найти формат в командной строке.
если формат даты "Чт 03/03/2016" использовать следующим образом:
set datestr=%date:~10,4%-%date:~7,2%-%date:~4,2% echo %datestr%
еще два способа, которые не зависят от настроек времени (взято из Как получить данные/время независимо от локализации). И как же сделать день недели, и ни один из них не требует разрешения администратора!:
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% pauseROBOCOPY - это не родная команда для 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. Они дадут вам больше гибкости, например, вы можете получить неделю в году, времени в миллисекундах и так далее.
JScript / BATCH гибрид (нужно сохранить как
.bat). JScript доступен на каждой системе от Windows 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());VBScript / 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), ", ", "-")PowerShell - может быть установлен на каждой машине, которая имеет .NET-скачать с Microsoft ( v1, v2 и v3 (только для Windows 7 и выше)). По умолчанию устанавливается на все формы Windows 7/Win2008 и выше:
C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"составлена самостоятельно jscript.net/batch (я никогда не видел Windows-машины без .Инет так я думаю, что это это довольно портативный):
@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 помещает в свои файлы журналов.Будет работать все, от 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дополнительная информация о Get-Date функция.
Мне очень понравился метод Джоуи, но я решил немного расширить его.
в этом подходе вы можете запускать код несколько раз и не беспокоиться о том, что старое значение даты "прилипает", потому что оно уже определено.
каждый раз, когда вы запускаете этот пакетный файл, он будет выводить совместимое с 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%в этой версии вам нужно будет быть осторожным, чтобы не копировать/вставлять один и тот же код в несколько мест файл, потому что это приведет к дублированию меток. Вы можете либо иметь отдельную метку для каждой копии, либо просто поместить этот код в свой собственный пакетный файл и вызвать его из исходного файла, где это необходимо.
Я устанавливаю переменную окружения в значение в числовом формате, желаемом, делая это:
FOR /F "tokens=1,2,3,4 delims=/ " %a IN ('echo %date%') DO set DateRun=%d-%b-%c
в соответствии с ответом @ProVi просто изменить в соответствии с требуемым форматированием
echo %DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%вернутся
yyyy-MM-dd hh:mm:ss 2015-09-15 18:36:11EDIT Согласно комментарию @Jeb, который является правильным, приведенный выше формат времени будет работать только в том случае, если ваша команда DATE /T возвращает
ddd dd/mm/yyyy Thu 17/09/2015его легко редактировать в соответствии с вашим языком, однако, используя индексацию каждого символа в строке, возвращаемой соответствующей переменной окружения %DATE%, вы можете извлечь части строки тебе нужно.
например. Использование %DATE~10,4% расширит переменную среды DATE, а затем использует только 4 символа, которые начинаются с 11-го (смещение 10) символа расширенного результата
например, если вы используете даты в стиле US, то применяется следующее
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
проверьте это..
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
из-за даты и времени формат-это информация о местоположении, получение их из переменных %date% и %time% потребует дополнительных усилий для анализа строки с преобразованием формата в рассмотрение. Хорошая идея-использовать некоторый API для извлечения структуры данных и анализа, как вы хотите. WMIC-это хороший выбор. Ниже пример использования Win32_LocalTime. Вы также можете использовать Win32_CurrentTime или 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результат:
2018-04-25_10:03:11
можно использовать PowerShell и перенаправить его вывод в переменную среды с помощью цикла.
из командной строки (
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в пакетном файле вы можете избежать
%aкак%%a:for /f "tokens=*" %%a in ('powershell get-date -format "{yyyy-mm-dd+HH:mm}"') do set td=%%a
Если у Вас установлен Python, вы можете сделать
python -c "import datetime;print(datetime.date.today().strftime('%Y-%m-%d'))"вы можете легко адаптировать строку формата к вашим потребностям.
Если вы не возражаете против одноразовых инвестиций от 10 до 30 минут, чтобы получить надежное решение (которое не зависит от настроек региона Windows), пожалуйста, читайте дальше.
давайте освободим наши умы. Вы хотите упростить сценарии, чтобы просто выглядеть так? (Предположим, вы хотите установить переменную 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Вы можете. Просто построить FormatNow.EXE-файл с помощью C# .NET и добавить его в свой путь.
Примечания:
- вы можете использовать любой визуальный Studio edition, например Visual Studio Express, для построения FormatNow.исполняемый.
- в Visual Studio выберите проект " консольное приложение "C#, а не проект" приложение Windows Forms".
- здравый смысл: встроенный Форматнов.exe потребуется .NET Framework для запуска.
- здравый смысл: после добавления FormatNow.exe для переменной PATH, вам нужно перезапустить CMD, чтобы вступить в силу. Это также относится к любым изменениям в окружающей среде переменная.
преимущества:
- это не медленно (заканчивается в течение 0,2 секунды).
- многие форматы поддерживаются https://msdn.microsoft.com/en-us/library/8kb3ddd4 (v=vs.110). aspx например, FormatNow "ddd", чтобы получить только день недели, FormatNow" yyyy", чтобы получить только год
- он не зависит от настроек региона Windows, поэтому его выход намного надежнее. С другой стороны, %date% не дает согласованного формата над разными компьютерами, и не является надежным.
- вам не нужно создавать так много переменных CMD и загрязнять пространство имен переменных.
- для вызова программы и получения результатов потребуется 3 строки в пакетном скрипте. Она должна быть достаточно короткой.
исходный код FormatNow.exe, который я построил с Visual Studio 2010 (я предпочитаю строить его сам, чтобы избежать риска загрузки неизвестной, возможно, вредоносной программы). Просто скопировать и вставьте коды ниже, построить программу один раз, а затем у вас есть надежный форматер даты для всех будущих применений.
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()); } } } }
Comments