Как сохранить текущую дату в формате ГГГГ-ММ-ДД в какую-либо переменную в файле Windows .bat?
Аналог оболочки Unix:
today=`date +%F`
echo $today
windows
batch-file
Максим Польща
источник
источник
Ответы:
Вы можете получить текущую дату независимо от локали, используя
Затем вы можете извлечь отдельные части, используя подстроки:
Другой способ, когда вы получаете переменные, содержащие отдельные части, будет:
Намного приятнее, чем возиться с подстроками, за счет загрязнения пространства имен переменных.
Если вам нужно UTC вместо местного времени, команда более-менее такая же:
источник
for /f
возвращает две строки, последняя из которых является пустой. Вы можете решить эту проблему, используяset MyDate=
промежуточные. Думаю, вот на что споткнулся user2023861.Year
,Month
,Day
,Hour
,Minute
,Second
,Quarter
,WeekInMonth
,DayOfWeek
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x set today=%Year%-%Month%-%Day%
неверный ответ: возвращает однозначный месяц и день. Как получить 2-значное левое дополнение с нулевой строкой месяца и дня до даты?Если вы хотите добиться этого с помощью стандартных команд MS-DOS в пакетном файле, вы можете использовать:
Я уверен, что это можно улучшить в дальнейшем, но это дает дату в 3 переменных: день (дд), месяц (мм) и год (гггг). Затем вы можете использовать их позже в своем пакетном сценарии по мере необходимости.
Хотя я понимаю, что на этот вопрос был принят ответ, этот альтернативный метод может быть оценен многими, стремящимися достичь этого без использования консоли WMI, поэтому я надеюсь, что он добавит некоторую ценность этому вопросу.
источник
Используйте
date /T
для поиска формата в командной строке.Если формат даты
Thu 17/03/2016
используется следующим образом:источник
SELECT CONVERT(VARCHAR(16), GETDATE(), 112)
».%date:~10,4%%date:~7,2%%date:~4,2%T%time:~0,2%%time:~3,2%%time:~6,2%
Еще два способа, которые не зависят от настроек времени (оба взяты из Как получить данные / время независимо от локализации ). И оба также получают день недели, и ни один из них не требует прав администратора !:
MAKECAB - будет работать на ВСЕХ системах Windows (быстро, но создает небольшой временный файл) (скрипт foxidrive):
ROBOCOPY - это не встроенная команда для Windows XP и Windows Server 2003 , но ее можно загрузить с сайта Microsoft . Но он встроен во все, начиная с Windows Vista и выше:
И еще три способа использования других языков сценариев Windows. Они дадут вам больше гибкости, например, вы можете получить неделю в году, время в миллисекундах и так далее.
Гибрид JScript / BATCH (необходимо сохранить как
.bat
). JScript доступен во всех системах от Windows NT и выше как часть Windows Script Host ( хотя его можно отключить через реестр, что бывает редко ):Гибрид VBScript / BATCH ( можно ли встроить и выполнить VBScript в пакетном файле без использования временного файла? ) Тот же случай, что и jscript, но гибридизация не так идеальна:
PowerShell - может быть установлен на любой машине с .NET - загружается с сайта Microsoft ( v1 , v2 и v3 (только для Windows 7 и выше)). Устанавливается по умолчанию на все, начиная с Windows 7 / Win2008 и выше:
Самостоятельно скомпилированный jscript.net/batch (я никогда не видел машину с Windows без .NET, поэтому думаю, что это довольно переносимый вариант ):
Logman Не может получить год и день недели. Он сравнительно медленный, также создает временный файл и основан на отметках времени, которые logman помещает в свои файлы журнала. Работает все, начиная с Windows XP и выше. Вероятно, он никогда не будет использоваться кем-либо, включая меня, но это еще один способ ...
Подробнее о функции Get-Date .
источник
Мне очень понравился метод Джои, но я подумал, что смогу его немного расширить.
При таком подходе вы можете запускать код несколько раз и не беспокоиться о том, что старое значение даты «застрянет», потому что оно уже определено.
Каждый раз, когда вы запускаете этот командный файл, он выводит комбинированное представление даты и времени, совместимое с ISO 8601.
В этой версии вам нужно быть осторожным, чтобы не копировать / вставлять один и тот же код в несколько мест в файле, потому что это приведет к дублированию меток. Вы можете создать отдельную метку для каждой копии или просто поместить этот код в отдельный пакетный файл и вызывать его из исходного файла, где это необходимо.
источник
Просто используйте
%date%
переменную:источник
В соответствии с ответом @ProVi просто измените в соответствии с требуемым форматированием
вернется
EDIT Согласно @Jeb комментарий, которого правильно выше формат времени будет работать только , если ваша дата / возвращает T команды
Его легко отредактировать в соответствии с вашим языковым стандартом, однако, используя индексирование каждого символа в строке, возвращаемой соответствующей переменной среды% DATE%, вы можете извлечь нужные части строки.
например. Использование% DATE ~ 10,4% расширит переменную среды DATE, а затем будет использовать только 4 символа, которые начинаются с 11-го (смещение 10) символа расширенного результата.
Например, при использовании дат в стиле США применяется следующее:
источник
Я установил для переменной среды значение в желаемом числовом формате, выполнив следующие действия:
источник
Отметьте это ..
источник
Если у вас установлен Python, вы можете сделать
Вы можете легко адаптировать строку формата к своим потребностям.
источник
python -c "import datetime;print(datetime.date.today())"
, потому что__str__
методdate
класса просто вызываетisoformat()
.Можно использовать PowerShell и перенаправить его вывод в переменную среды с помощью цикла.
Из командной строки (
cmd
):В пакетном файле вы можете экранировать
%a
как%%a
:источник
FOR /F "tokens=*" %%a IN ('powershell get-date -format "{yyyy\-MM\-dd\THH\:mm\:ss}"') DO SET date=%%a
такой, используйте верхний MM для месяца и обратную косую черту, чтобы избежать буквальных символов.Из-за того, что формат даты и времени - это информация о местоположении, получение их из переменных% date% и% time% потребует дополнительных усилий для анализа строки с учетом преобразования формата. Хорошая идея - использовать какой-нибудь API для получения структуры данных и синтаксического анализа по вашему желанию. WMIC - хороший выбор. В приведенном ниже примере используйте Win32_LocalTime . Вы также можете использовать Win32_CurrentTime или Win32_UTCTime .
Результат:
2018-04-25_10: 03: 11
источник
Это расширение ответа Джои, чтобы включить время и заполнить части нулями.
Например, результат будет 2019-06-01_17-25-36. Также обратите внимание, что это время UTC.
источник
источник
Я использую следующее:
Или в сочетании с именем файла журнала MyLogFileName:
источник
Если PowerShell доступен, вы можете использовать следующие коды:
Вот результат:
источник
Если вы не возражаете против одноразового вложения от 10 до 30 минут, чтобы получить надежное решение (которое не зависит от региональных настроек Windows), продолжайте читать.
Освободим свой разум. Вы хотите упростить сценарии, чтобы они выглядели так? (Предположим, вы хотите установить переменную LOG_DATETIME)
Ты можешь. Просто создайте FormatNow.exe с C # .NET и добавьте его в свой PATH.
Ноты:
Преимущества:
Исходный код FormatNow.exe, который я создал с помощью Visual Studio 2010 (я предпочитаю создавать его сам, чтобы избежать риска загрузки неизвестной, возможно, вредоносной программы). Просто скопируйте и вставьте приведенные ниже коды, скомпилируйте программу один раз, и тогда у вас будет надежное средство форматирования даты для всех будущих применений.
В общем, имея дело со сложной логикой, мы можем упростить задачу, создав очень маленькую программу и вместо этого вызывая программу для захвата вывода обратно в переменную пакетного сценария. Мы не студенты и не сдаем экзамены, требующие от нас соблюдения правила «только пакетный скрипт» для решения проблем. В реальной рабочей среде разрешен любой (легальный) метод. Почему мы должны по-прежнему придерживаться слабых возможностей пакетного сценария Windows, который требует обходных решений для многих простых задач? Почему мы должны использовать неправильный инструмент для работы?
источник