Обновление: теперь, когда наступил 2016 год, я бы использовал для этого PowerShell, если для этого нет действительно веской причины обратной совместимости, особенно из-за проблемы региональных настроек при использовании date. См. https://stackoverflow.com/a/19799236/8479 @ npocmaka
Какие операторы командной строки 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. Я не хочу устанавливать дополнительные утилиты для этого (хотя я понимаю, что есть некоторые, которые хорошо подходят для форматирования даты).
используйте людей PowerShell ... [datetime]::now.tostring("yyyy-MM-dd")
Можно ли загружать файлы с датой создания с помощью xp_cmdshell в SQL Server? Я задал вопрос о stackoverflow, пожалуйста, перейдите по ссылке @ stackoverflow.com/q/32293517/3327081





Вот что я использовал:
::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% содержит «Вт, 14.10.2008». Таким образом, вам все равно нужно отключить (или иным образом обработать) «Вт» и пробел.
Привет, @micahwittman. Можно ли загружать файлы с датой создания с помощью xp_cmdshell в SQL Server? Я пробовал команду "forfiles", но безрезультатно. Я задал вопрос о stackoverflow, пожалуйста, перейдите по ссылке @ stackoverflow.com/q/32293517/3327081
Это не совсем короче, но может быть более гибким способом (кредит):
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 delims=/ " %%A in ('Date /t') do @(
Set Month=%%A
Set Day=%%B
Set Year=%%C
)
@echo DAY = %Day%
@echo Month = %Month%
@echo Year = %Year%
Обратите внимание, что оба моих ответа здесь по-прежнему зависят от порядка дня и месяца, определенного региональными настройками, - не знаю, как это обойти.
См. Пакетный файл 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
Local date is [2012-06-19 10:23:47.048]
Это хорошо! В моей системе «time / t» дает «11:58 PM». Я мог бы добавить еще одну строку с "set mytime =% mytime: = _%" или какие-либо другие настройки, которые вы можете предложить?
Добавлен еще один потенциальный вариант отображения в 24-часовом режиме, устраняющий необходимость в указателе PM / AM.
Для британцев вам понадобится For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a) для второй линии.
Это решение зависит от локали, Рори привел пример для Великобритании для других локалей, где дата - 22-02-2012, вам нужно заменить delims = / на delims = -
В моей системе% TIME% возвращает такие значения, как «0:01:15» и «3:15:12», а код %% a %% b в ответе дает начальный пробел, например «001» и «315». Чтобы получить четырехзначный ххм, используйте это: 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», которые я предпочитаю в своих именах файлов.
Хорошая версия команды 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%
Порядок ISO приветствуется (ура для автоматической сортировки), но обратите внимание, что полные двоеточия не являются допустимыми символами в именах файлов Windows (согласно OP)!
есть проблема с приведенным выше примером военного времени с использованием% TIME%. Если час до 10 часов утра, вы получите цифру «9», которая, когда вы соедините их вместе, даст пробел в вашей переменной строке. Не хорошо, если вы используете его для имени файла. :-(
если вы добавите пробел после списка разделителей для времени ... for / f "tokens = 1-2 delims = /:" %% a in ('time / t') do (set mytime = %% a %% b ) он будет рассматривать AM / PM как отдельный разделитель и не забирать его
Обязательно вызовите set mydate= (отменяет mydate) перед циклом forloop. В противном случае он не будет сброшен при вызове того же командного файла в том же экземпляре консоли.
Для меня это %%a was unexpected at this time.
Можно ли загружать файлы с датой создания с помощью xp_cmdshell в SQL Server? Я пробовал команду "forfiles", но безрезультатно. Я задал вопрос о stackoverflow, пожалуйста, перейдите по ссылке @ stackoverflow.com/q/32293517/3327081
В чем смысл '. и .' по сравнению с %%i и LocalDateTime? Кажется, что он соответствует каждой строке wmic, и в результате ldt не имеет значения.
Это работает хорошо, за исключением того, что с моей стороны упускается «дневная» часть. Выходной файл - pmtctdb_backup.-03-2017_1629.sql. По какой причине?
@ Scottzuz22Blacklock это только если запускать из командной строки. %% a экранирует первый знак процента, который необходим для командного файла. Для командной строки просто удалите второй знак процента. За: stackoverflow.com/a/2340018
Этот For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) не работает в Windows 10.
@Chagbert, это почти наверняка ваш региональный формат даты, оригинал для США. См. Комментарий выше относительно Великобритании и попробуйте адаптировать его для строки, которую вы получаете, когда запускаете date / t в командной строке.
Как такая простая вещь, как определение текущего времени, может быть настолько сложной? : S
Для Германии дата расшифровывается с помощью For /f "tokens=1-3 delims=. " %%a in ('date /t') do (set CURR_DATE=%%c%%b%%a).
К сожалению, это не невосприимчиво к региональным настройкам, но делает то, что вы хотите.
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%
Удивительные вещи, которые вы можете найти на Википедия.
Вот Microsoft Справочник по пакетным файлам для Windows XP. Эта ссылка включает Использование параметров партии. К сожалению, нет обсуждения техники «нарезки».
Я использую это (опять же не независимый от региона (Великобритания))
set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
См. Переменные среды Cmd.exe с двоеточием и тильдой об этой малоизвестной, но очень эффективной технике. (Приветствуется указатель на авторитетную ссылку Microsoft.)
Вот Microsoft Справочник по пакетным файлам для Windows XP. Эта ссылка включает Использование параметров партии. К сожалению, нет обсуждения техники «нарезки».
Для меня это не совсем подходит. Может дело в региональных настройках? Я получаю вывод «/ 15 / - 1-We_1009» при запуске в среду, 15 октября 2014 г.
Это очень точно и аккуратно. Я думаю, что это лучший ответ на вопрос, потому что вам не нужно никаких настроек, чтобы использовать его в качестве имени файла. Спасибо, что поделился!
"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 имеет ряд хороших моментов, которые могут пригодиться кому-то в будущем.
Формат вывода %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 для получения информации о году, месяце, дне и времени:
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 в любой каталог, указанный в пути поиска, может привести к сбою других сценариев, использующих встроенную в Windows команду date.
Намного лучше, чем странно более популярное решение, приведенное выше, но мне пришлось добавить / t, чтобы не выводить запрос в Windows 8.1.
Встроенная Windows 8.1 date.exe, похоже, зависит от локали. Он возвращает дату в моей системе в формате dd / MM / yyyy, если бы он не зависел от локали, я бы ожидал либо MM / dd / yyyy, либо yyyy-MM-dd. Я не думаю, что в этом ответе говорится о встроенном date.exe, а о какой-то его сторонней версии.
он не зависит от локали, если вы предоставите ему желаемый формат в командной строке
Обратите внимание, что date.exe (часть UnxUtils) не совпадает с командой даты сборки. Поэтому, если вам нужно добавить / t, выполняется команда даты Windows. Если работает что-то вроде date.exe + "% Y-% m-% d", значит, вы правильно установили UnxUtils. :-)
Можно ли загружать файлы с датой создания с помощью xp_cmdshell в SQL Server? Я пробовал команду "forfiles", но безрезультатно. Я задал вопрос о stackoverflow, пожалуйста, перейдите по ссылке @ stackoverflow.com/q/32293517/3327081
Я просто использовал date.exe, но переименовал его в date_unxutils.exe и использовал в пакетном скрипте, используя временное (сеансовое) назначение PATH.
На всякий случай, если кому интересно ... stackoverflow.com/a/65943831/10830091
Короткий ответ :
:: 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
:: in cmd для / f% i in ('PowerShell -Command "get-date" -format "yyyyMMdd"') установить yyyyMMdd =% i :: in cmd script для / f %% i in ('PowerShell -Command "get-date" -format "yyyyMMdd" ') установить yyyyMMdd = %% i
Вот вариант из 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<-------------
Чтобы заставить код работать без сообщения об ошибке в stderr, мне пришлось добавить одинарные кавычки вокруг назначений переменных для %% a, %% b и %% c. Моя локаль (PT) вызывала ошибки на одном этапе цикла / анализа, когда выполнялись такие вещи, как «set = 20». Кавычки дают токен (хотя и пустой) для левой части оператора присваивания.
Обратной стороной являются запутанные имена переменных локали: «yy», «mm» и «dd». Но кого это волнует!
Это идеальный и самый простой и элегантный подход, который я когда-либо видел.
См. Также Улучшения Йеруна, необходимо, поскольку не все языковые стандарты используют строки dd, mm и yy в выводе echo:^|date.
не работает на всех языках. (На немецком языке date дает Geben Sie das neue Datum ein: (TT-MM-JJ), где JJ нарушает ваш скрипт (ожидает YY))
Вот способ получить дату и время в одной строке:
for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %a in ('%date% %time%') do echo %c-%a-%b %d%e
В США это будет вывод «гггг-мм-дд ччмм». Различные региональные настройки приведут к разным выводам% date%, но вы можете изменить порядок токенов.
Если вам нужен другой формат, измените оператор echo, переставив токены или используя другие (или не используя) разделители.
Есть ли способ получить время в 12-часовом формате, а также отобразить информацию AM или PM?
http://sourceforge.net/projects/unxutils/files/
Найдите в ZIP-файле что-то под названием «Date.exe» и переименуйте его в «DateFormat.exe» (во избежание конфликтов).
Поместите его в папку system32 вашей Windows.
У него много опций "вывода даты".
Для справки используйте DateFormat.exe --h
Я не уверен, как бы вы поместили его вывод в переменную окружения ... используя SET.
Спасибо, хотя этот вопрос предназначен специально для того, чтобы сделать это без загрузки дополнительных инструментов.
Я изменил ответ пакетным файлом из vMax, чтобы он работал и с голландским языком.
Голландцы, несмотря на нашу настойчивость, внесли несколько изменений в %date%, date/t и date, которые нарушают работу исходного командного файла.
Было бы неплохо, если бы некоторые люди могли проверить это на других языках Windows и сообщить результаты.
Если командный файл не работает в вашем местоположении, включите вывод этих двух операторов в командную строку: echo:^|datedate/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 часто бывает английской или голландской, не более того. Достаточно хорошо для меня.
В стороне: другая версия в Скрытые возможности командных файлов Windows менее совершенна (требует исправления для голландского jj и не требует четырехзначного года), но использует shift, чтобы отбросить день, как Mon или ma. Просто другой.
Это ломается по немецкой системе. Год и месяц работают, но день не работает, потому что «день» начинается с буквы «T» на немецком языке («тег»), а не с буквы «d». Строка формата в приглашении - (TT-MM-JJ), вывод date/t - 23.06.2012. / cc @Arjan
Еще в стороне: можно также получить заказ из реестра, используя 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). Открытие новой командной строки исправляет это.
Арьян, балфа, спасибо за отличные комментарии. Это было действительно то, что я искал.
@Arjan, это должен быть reg query "HKCU\Control Panel\International" /v sShortDate.
Ты прав, @tricasse. Не уверен, сработало ли это так, как я писал в 2012 году, но, безусловно, сегодня мой комментарий неверен. Жаль, что я не могу редактировать свой комментарий ;-)
А вот аналогичный батник для временной части.
:: 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.
У меня была аналогичная проблема. У меня есть автоматическая ежедневная загрузка с FTP-сервера зашифрованного файла. Я хотел расшифровать файл с помощью gpg, переименовать файл в текущую дату (формат ГГГГММДД) и перетащить расшифрованный файл в папку для нужного отдела.
Я рассмотрел несколько предложений по переименованию файла в соответствии с датой, и мне не повезло, пока я не наткнулся на это простое решение.
for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt
Он работал отлично (т.е. имя файла выглядит как «2011-06-14.txt»).
Используйте следующий сценарий, чтобы получить текущий день в командной строке:
echo %Date:~0,3%day
Немного поиграв с этим, я нашел самое короткое время, которое я нашел, чтобы получить дату и время: echo% date%% time%
Региональное независимое решение, генерирующее формат даты 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:
Что еще можно оптимизировать: Другие процессы могут запутаться, если использовать формат даты за короткий период времени, пока он изменяется. Таким образом, синтаксический анализ вывода в соответствии с существующей строкой формата может быть более безопасным, но будет более сложным.
вы можете зарегистрировать запрос iDate (technet.microsoft.com/en-us/library/cc978637.aspx) и условно продолжить (3 возможных значения в соответствии с technet) - хотя я еще не пробовал это.
Мэтью Джонсона однострочное решение для получения однострочной даты и времени - это красноречивый и полезно.
Однако для работы из командного файла требуется простая модификация:
for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
Не работает в CMD (%% a было неожиданным в это время) или в PowerShell (отсутствует открытие '(' после ключевого слова для) в Windows 8.1
Райнабба, это именно та ошибка, которую вы получаете, когда запускаете эту команду из линии CMD. Однако, «из командного файла», команда возвращает «2014-01-30 1324».
или намного проще было бы без цикла for echo %date:/=-%%time::=-%
Еще два способа, не зависящих от настроек времени (оба взяты из : Как получить данные / время независимо от локализации:). И оба также получают день недели, и ни один из них не требует прав администратора !:
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
РОБОКОПИЯ - это не собственная команда для 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 / пакет гибрид (необходимо сохранить как .bat). JScript доступен в любой системной форме NT и выше как часть Хост сценариев Windows (хотя можно отключить через реестр, это редкий случай):
@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 помещает в свои файлы журнала. Он будет работать на всем, начиная с 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 выше. Имейте в виду, что свойства объекта Date в 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>
для powershell C: \> for / f %% i in ('powershell get-date -format "{yyyyMMdd_HHmmss}"') установить datetime = %% i C: \> echo% datetime%
makecab: это работает путем создания файла с именем ~.rpt и поиска в нем string, начиная с makecab, который является строкой типа MakeCAB Report: Tue Sep 02 22:15:57 2014. для меня эта команда не локализована, она не зависит от локали. Этот трюк полагается на это. Будем надеяться, что этого никогда не будет, иначе будьте осторожны!
Привет, мне удалось загрузить файлы в соответствии с датой изменения с помощью приведенной ниже команды, ‘z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path”‘. Но я хочу знать, как загружать файлы в соответствии с датой создания. Любая помощь будет очень признательна. Был задан вопрос о stackoverflow, но ответа пока нет. Подробности смотрите по ссылке @ stackoverflow.com/q/32293517/3327081
Мне нравится вводный текст «Еще два ...», за которым следуют 8 решений.
Что, никакого гибрида mshta? :) Не возражаете, если я отредактирую ваш ответ и добавлю еще один? Кажется, это лучшая коллекция эзотерических решений, и, похоже, mshta здесь.
@rojo - совсем нет - вперед :)
Принятое решение не сработало бы для меня, что бы я ни пробовал. У меня сработало несколько из этих решений. (Пакетная и Powershell).
Функция, основанная на 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 является допустимым вызовом, если вы хотите получить только год и месяц.
Первые четыре строки этого кода предоставят вам надежные переменные 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 станет забавным.
Просто используйте эту строку:
PowerShell -Command "get-date"
Учитывая известную местность, для справки в функциональной форме. Вызов 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?
@SteveFest Я полагаю, можно было бы создать список локалей, каждый из которых включает выражения даты / времени с образцом для проверки. Я очень занят, но постараюсь обновить свой ответ, чтобы проиллюстрировать. Не могли бы вы показать мне образцы выходных данных времени / даты Гонконга? Я могу по глупости предполагать, что zh-HK печатает цифры с фиксированным смещением.
zh-HK: (yy)yy年m月d日 hh:mm - без ведущих нулей. (yy) можно игнорировать, так как у нас есть год из двух или четырех цифр. Но обратите внимание на одну вещь: формат даты и времени может быть изменен на каждой машине.
Спасибо @SteveFest, я свяжусь с вами в течение нескольких недель. Запустите systeminfo в интерфейсе командной строки и сообщите мне, что вы видите для System Locale. Программа требует времени для запуска, но, возможно, результат локали может быть кэширован и впоследствии использован для индексации формата временной метки.
мой компьютер просто умер :(
Мой компьютер вернулся - язык - zh-HK
Я знаю, что уже упоминалось множество способов. Но вот мой способ разобрать это, чтобы понять, как это делается. Надеюсь, это будет полезно для тех, кто любит пошаговый метод.
:: 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
В 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
:: 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. Кстати. Ваше решение такое же, как и двадцать других ответов.
Да, но мой действительно можно (при желании) использовать в командной строке. В чем преимущество публикации 35 строк кода, если одна строка кода предоставит такое же решение?
Я не вижу существенной разницы в старых ответах @ Мэтью Джонсон, 2010 или @KChiki, 2011 г.
хотя этот ответ неверен, чтобы прокомментировать фактический ответ, цикл for здесь не нужен, когда вы могли бы просто выполнить echo %date:/=-%
Нет. Если вы опустите цикл FOR, никакие переменные не могут быть созданы, а дата, которую вы потрудились извлечь, все равно будет бесполезной. В цикле FOR переменные, созданные циклом, доступны для использования в других частях скрипта. Я категорически не рекомендую использовать десятки строк кода для создания цикла FOR, когда требуется только одна строка. И я категорически не рекомендую публиковать решения, не относящиеся к командной строке, когда o / p специально запрашивает однострочное решение для использования в командной строке.
Мое решение настолько короткое, что его можно использовать как первую часть командной строки, где оставшаяся часть команды может использовать созданные переменные.
FOR / F "tokens = 1-3 delims = /"% A IN ("% date%") DO (SET today =% C-% B-% A) && echo% A-% B-% C && echo% сегодня%
Объедините Powershell в пакетный файл и используйте мета-переменные для назначения каждой из них:
@echo off
for /f "tokens=1-6 delims=-" %%a in ('PowerShell -Command "& {Get-Date -format "yyyy-MM-dd-HH-mm-ss"}"') do (
echo year: %%a
echo month: %%b
echo day: %%c
echo hour: %%d
echo minute: %%e
echo second: %%f
)
Вы также можете изменить формат, если предпочитаете название месяца MMM или MMMM и 12- или 24-часовой форматы hh или HH.
Я использовал date.exe и переименовал его в date_unxutils.exe, чтобы избежать конфликтов.
Поместите его в папку bin рядом с пакетным сценарием.
:: Add binaries to temp path
IF EXIST bin SET PATH=%PATH%;bin
:: Create UTC Timestamp string in a custom format
:: Example: 20210128172058
set timestamp_command='date_unxutils.exe -u +"%%Y%%m%%d%%H%%M%%S"'
FOR /F %%i IN (%timestamp_command%) DO set timestamp=%%i
echo %timestamp%
Создаете автоматическую резервную копию вашего кода? Повезло тебе! Мы тоже должны это сделать :)