Как получить текущую дату и время в командной строке Windows в подходящем формате для использования в имени файла? - PullRequest
500 голосов
/ 15 октября 2008

Обновление: теперь, когда наступил 2016 год, я бы использовал PowerShell для этого, если только для этого нет действительно убедительной обратной совместимости, особенно из-за проблемы региональных настроек при использовании date. Смотрите @ npocmaka's https://stackoverflow.com/a/19799236/8479


Какие операторы командной строки Windows я могу использовать для получения текущей даты и времени в формате, который я могу поместить в имя файла?

Я хочу получить файл .bat, который заархивирует каталог в архив с текущей датой и временем в качестве части имени, например, Code_2008-10-14_2257.zip. Есть ли простой способ сделать это независимо от региональных настроек машины?

Я действительно не против формата даты, в идеале это будет гггг-мм-дд, но все, что угодно, просто отлично.

Пока у меня есть это, которое на моей машине дает мне 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. Я не хочу устанавливать дополнительные утилиты для этого (хотя я понимаю, что есть некоторые, которые будут делать хорошее форматирование даты).

Ответы [ 28 ]

4 голосов
/ 14 июня 2011

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

Я рассмотрел несколько предложений по переименованию файла в соответствии с датой, и мне не повезло, пока я не наткнулся на это простое решение.

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

Отлично сработало (то есть имя файла выглядит как "2011-06-14.txt").

(Источник)

3 голосов
/ 06 сентября 2011

Региональное независимое решение, генерирующее формат даты 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:

Что еще можно оптимизировать: Другие процессы могут запутаться, если использовать формат даты за короткий период, пока он изменяется. Таким образом, анализ выходных данных в соответствии с существующей строкой формата может быть «безопаснее», но будет более сложным

2 голосов
/ 11 мая 2017
:: 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 голосов
/ 13 апреля 2019

Я предпочитаю делать это как можно короче, поэтому без месяца и года достаточно для ежедневного обновления

SET date=%DATE:~0,2%
SET hour=%TIME:~0,2%
SET minute=%TIME:~3,2%
IF "%date:~0,1%"==" " SET date=0%DATE:~1,1%
IF "%hour:~0,1%"==" " SET hour=0%TIME:~1,1%
IF "%minute:~0,1%"==" " SET minute=0%TIME:~1,1%
SET VERSION=%date%%hour%%minute%
ECHO VERSION=%date%%hour%%minute%
VERSION=140105

Когда дело доходит до версии приложения, разверните ее в свежих ежедневных обновлениях со сборщиком

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["app", "deploy", '--version=v1-140105-fresh']
timeout: "300s"

Таким образом вам будет проще автоматически обновить все приложение целиком

sed -e "s/-[0-9]\{1,\}-fresh/-%VERSION%-local/g" cloudbuild.yaml > tmp.txt 
mv -f tmp.txt cloudbuild.yaml

Выходной файл будет готов для локального обновления, не касаясь его имен файлов

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["app", "deploy", '--version=v1-140117-local']
timeout: "300s"
0 голосов
/ 06 декабря 2018

Я отмечаю, что o / p не запросил независимое от региона решение. Мое решение для Великобритании, хотя.

Это простейшее возможное решение, решение в 1 строку, для использования в командном файле:

FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%
0 голосов
/ 16 августа 2016

В 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%
0 голосов
/ 15 августа 2016

Я знаю, что уже упоминалось множество способов. Но вот мой способ разбить его, чтобы понять, как это делается. Надеюсь, это полезно для тех, кто любит пошаговый метод.

:: 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
0 голосов
/ 11 августа 2016

Учитывая известную местность, для справки в функциональном виде. Вызов 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, вот вывод:

enter image description here

...