Як отримати дату у пакетному файлі у передбачуваному форматі?


17

У пакетному файлі мені потрібно витягнути місяць, день, рік з команди date. Тому я використав наступне, що по суті аналізує команду Date, щоб витягти її підрядки у змінну:

set Day=%Date:~3,2%
set Mth=%Date:~0,2%
set Yr=%Date:~6,4%

Це все чудово, але якщо я розгортаю цей пакетний файл на машину з іншими регіональними / країнами, він не вдається, оскільки місяць, день і рік знаходяться в різних місцях.

Як я можу отримати місяць, день та рік незалежно від формату дати?


1
Ви абсолютно обмежені в Batch? Така річ набагато простіша у VBScript / WSH та / або PowerShell ...
Адрієн

@Adrien, так обмежено пакетною - це частина кроку після збирання VS2008.
AngryHacker

заміна% date% на% дата: ~ 6,4% -% дата: ~ 3,2% -% дата: ~ 0,2% відпрацьовано
MagTun

Відповіді:


14

Джерело: http://ss64.com/nt/syntax-getdate.html

Спосіб 2 (одиночний cmd)

GetDate.cmd

@Echo off
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

:: Use WMIC to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
   IF "%%~L"=="" goto s_done
      Set _yyyy=%%L
      Set _mm=00%%J
      Set _dd=00%%G
      Set _hour=00%%H
      SET _minute=00%%I
)
:s_done

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%

:: Display the date/time in ISO 8601 format:
Set _isodate=%_yyyy%-%_mm%-%_dd% %_hour%:%_minute%
Echo %_isodate%
pause

введіть тут опис зображення


Спосіб 1 (cmd + vb)

GetDate.cmd

@Echo off
For /f %%G in ('cscript /nologo getdate.vbs') do set _dtm=%%G
Set _yyyy=%_dtm:~0,4%
Set _mm=%_dtm:~4,2%
Set _dd=%_dtm:~6,2%
Set _hh=%_dtm:~8,2%
Set _nn=%_dtm:~10,2%
Echo %_yyyy%-%_mm%-%_dd%T%_hh%:%_nn%

getdate.vbs

Dim dt
dt=now
'output format: yyyymmddHHnn
wscript.echo ((year(dt)*100 + month(dt))*100 + day(dt))*10000 + hour(dt)*100 + minute(dt)

1
Ага, дуже акуратний спосіб пошуку порядку впорядкування місцевості. ss64 має чудову спільноту користувачів cmd.exe.
Ніколі

Я включив обидва сценарії з вашого посилання на джерело. Сподіваюсь, що це нормально для вас
nixda

@nixda Немає проблем, що б користувач не допомагав.
Текс Хекс

Якщо вам потрібно зберегти секунди у "Способі 2" вище, додайте Set _second=00%%Kпри витягуванні з нього wmicта прокладці з провідними нулями, як і інші.
Тім Паренті

13

Windows XP та новіших версій

getDate.cmd

@echo off
for /f "tokens=2 delims==" %%G in ('wmic os get localdatetime /value') do set datetime=%%G

set year=%datetime:~0,4%
set month=%datetime:~4,2%
set day=%datetime:~6,2%

echo %year%/%month%/%day%

Вихідні дані

введіть тут опис зображення


+1 за найкоротшу відповідь. Я б також запропонував закінчити, ECHO %year%-%month%-%day%яким є сумісний формат ISO і файлова система (не кажучи вже про автоматичні сортування за роком-місяцем-днем). :-).
Цефан Шредер

3

Я знаю, що це не саме те, про що ви просили, але я використовую порт Windows програми Linux dateвід команди всередині пакетного файлу, а потім присвоюю результат змінній.

Мені ще потрібно знайти спосіб надійно отримати дату, використовуючи лише пакетні команди.


2

Використовуйте цей пакетний файл для формату "РРРР-MM-DD". Він використовує інструмент інструментального оформлення вікон, який повинен бути присутнім у всіх останніх версіях Windows, щоб отримати рядок дати, який не залежить від регіональних налаштувань.

Збережіть у пакетному файлі в шлях (наприклад) c: \ windows \ rdate.bat, тоді відкрийте за допомогою CALL RDATE.BAT, щоб встановити змінну (и). По черзі скопіюйте код у свій пакетний файл.

Цей формат дати підходить для назви файлів і ведення журналів. Він сортує правильно. Змінна logtime додає змінну дати + часу як YYYY-MM-DD-HHMMSS, що підходить для використання в журналі активності пакетного файлу з другою точністю.

Відрегулюйте формати дати (та часу) за вашим бажанням. REM екран відлуння у виробництві. Два числа у кожному виділенні тексту - це нульовий індекс початкового символу та кількість символів для копіювання, наприклад,% datetime: ~ 0,4% займає 4-символьну підрядку, починаючи з позиції 0.

echo off
rem First, get the locality-invariant datetime
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
rem echo %datetime%

rem Build the reverse date string YYYY-MM-DD
set rdate=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2%
echo rdate=%rdate%

rem Built a datetime string YYYY-MM-DD-hhmmss
set logtime=%rdate%-%datetime:~8,6% 
echo logtime=%logtime%

1
Майже те саме, що і відповідь31415 . Обидва сценарії використовуютьwmic os get localdatetime
nixda

1

Хоча ви маєте рацію, що VS 2008 видає пакетний файл, ви можете запускати будь-яку програму, яку хочете, включаючи сценарії Powershell та інші програми.

Редагувати:

Ось кілька подібних питань:

/programming/1051845/visual-studio-2008-professional-build-process /programming/3049369/embed-application-compilation-time-stamp

Спочатку я мав би це перенести на SO. . .


0

Ви намагалися використовувати NET TIME \\%ComputerName%замість DATE? Я думаю, що NET TIMEце повинно надавати дані у послідовному форматі незалежно від місцевості.


Ні, це не так.
AngryHacker

Цікаво, що я просто спробував це, перемикаючись між форматами AU та US, і net timeзавжди виводить у форматі m / d / yyyy. @AngryHacker, з якими налаштуваннями це не працювало для вас?
Hydaral

1
Я перейшов на французьку (бельгійську), і це дало мені 2011-07-27. США дають 27.07.2011
AngryHacker

0

Завдяки посту Шехара це працює за потребою та нульовим прокладкою часу.

@Echo Off

for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%%date:~4,2%%date:~7,2%-%%d%%e

set datetimestr=%var: =0%

set logfile=LogFile-%datetimestr%.txt

echo %logfile%

Вихід: LogFile-20151113-0901.txt


-1

Це може бути дещо поза темою, але ось файл .bat, який я написав для власних запланованих резервних копій, а також дзвінок з дій після побудови у візуальній студії. Я сподіваюся, що деякі знайдуть це корисним.

Збережіть наступне у файлі .bat

--------------------------------------------------
**:: The following is Copyright © 2012 ShopNetNuke Corp.  All rights reserved.
::  and released under the GNU General Public License (GPLv3)**

:: The following section retrieves the current date and time and formats it into the '%var%' variable
:: This format always ensures that the Date and Time are fixed length to avoid the situation of
:: having a value of '12/ 1/2012 rather than '12/01/2012'
echo off
for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
set var=%var: =0%
echo Beginning my valuable Backup Set:  Backup--%var%

:: If you wanted to request the user input a filename prefix, 
:: then we would use something similar to this
:: set /p nameprefix= Enter the file name prefix?
:: Get the Current Date and Time
::for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
:: set var=%var: =0%
:: echo Beginning my valuable Backup Set:  Backup--%var%_%nameprefix%

Pause

echo Starting SQL Server Database Backup Job...
:: The following line initiates the Backup job within SqlServer Agent.
:: Change 'MyBackupNameInSqlAgent' to the name of the job you want executed
:: Change the directory paths to those relevant to your current system installation directories
:: SqlAgent will not return a value if the backup action succeed, 
:: however, in the event an error is encountered, it will be echoed onto the screen
"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe" -S SQLSERVERNAME\INSTANCENAME -Q "execute msdb.dbo.sp_start_job @job_name = 'MyBackupNameInSqlAgent'"
:: An error will be returned if the Backup job is not found or has already been triggered by another process

echo Starting My Valuable Source Code Directory Backup...

echo ...backing up files and folders in "C:\Source\MyPreciousProjectDirectory\"...
:: The following line will execute the 7zip command to create a .7z file of the directory named in 'MyPreciousProjectDirectory'
:: and tells it to put the archive in the 'MyPreciousBackupDirectory'.  The compression level will be defined by the 7zip default settings
:: The -p flag tells 7zip to password protect the archive, in this case, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectory\%var%\MyPreciousProject--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 

echo Source Code Directory Backups complete.

echo Archiving Database Backups now...
:: The following line will execute the 7zip command to archive the Database backup.
:: The '*' could be replaced by the actual backup name.
:: The '*' indicates all files of type '.bak'
:: The -p flag tells 7zip to password protect the archive, in this case, again, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z  C:\MyPreciousBackupDirectory\%var%\MyPreciousProject-Database-%var%.7z -p%var% -mhe "C:\Program Files\Microsoft SQL Server\MSSQL10.SQLDEV08\MSSQL\Backup\*.bak"

echo Database Backup Archival process complete.

:: If you wanted to place both the previous backups into one single combination archive,
:: you could do something like the following
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var%\MyPreciousProjectBackupSourceAndDatabase--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 


echo Now attempting to copy archives to Network Server...
:: The following line will use xcopy to copy the arechives to the server backup directory and place them in a directory named by the DateTime variable %var%
xcopy /S /I /J /Y C:\MyPreciousBackupDirectory\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%
:: Or if the combination above was used then copy that...
xcopy /S /I /J /Y C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%


echo 7z Archive files transferred to MyPreciousBackupServerName successfully
echo  ||
echo \||/
echo  \/
echo ---------------------------------------------------
echo ----- BACKUP SET "%var%" COMPLETE ------
echo ---------------------------------------------------
pause

1
tl; dr, ви можете додати пояснення того, що робить сценарій. тому що воно не виходить відразу як рішення. Це також може бути корисніше, якщо ви зможете видалити невідповідні біти коду
Shekhar

1
Вся партія сценарій спирається на %date%і %time%змінних, які локалі знають, і не може дійсно бути розібраний передбачуваним чином , як просили ОП.
and31415
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.