Jak uzyskać datę w pliku wsadowym w przewidywalnym formacie?

17

W pliku wsadowym muszę wyodrębnić miesiąc, dzień, rok z polecenia date. Użyłem więc następującego, który zasadniczo analizuje polecenie Date, aby wyodrębnić jego podłańcuchy do zmiennej:

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

To wszystko świetnie, ale jeśli wdrożę ten plik wsadowy na maszynie z innymi ustawieniami regionalnymi / krajowymi, nie powiedzie się, ponieważ miesiąc, dzień i rok znajdują się w różnych lokalizacjach.

Jak mogę wyodrębnić miesiąc, dzień i rok niezależnie od formatu daty?

AngryHacker
źródło
1
Czy jesteś absolutnie ograniczony do Batch? Taka rzecz jest o wiele prostsza w VBScript / WSH i / lub PowerShell ...
Adrien
@Adrien, Tak, ograniczone do partii - jest to część kroku po kompilacji VS2008.
AngryHacker
zamieniając% date% na% date: ~ 6,4% -% data: ~ 3,2% -% data: ~ 0,2% przepracowane
MagTun

Odpowiedzi:

14

Źródło: http://ss64.com/nt/syntax-getdate.html

Metoda 2 (pojedynczy 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

wprowadź opis zdjęcia tutaj


Metoda 1 (cmd + czas)

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)
Tex Hex
źródło
1
Ach, bardzo fajny sposób na znalezienie daty w lokalu. ss64 ma fajną społeczność użytkowników cmd.exe.
Nicholi
Dołączyłem oba skrypty z linku źródłowego. Mam nadzieję, że dla ciebie jest ok
nixda,
@nixda Nie ma problemu, cokolwiek użytkownik pomoże.
Tex Hex
Jeśli chcesz zachować sekundy w „Metodzie 2” powyżej, dodaj Set _second=00%%Kpodczas wyodrębniania z wmici zeruj wiodącymi zerami, jak pozostałe.
Tim Parenti,
13

Windows XP i nowszy

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%

Wynik

wprowadź opis zdjęcia tutaj

i31415
źródło
+1 za najbardziej zwięzłą odpowiedź. Sugeruję również zakończenie z ECHO %year%-%month%-%day%formatem zgodnym z ISO i systemem plików (nie wspominając o automatycznym sortowaniu według roku-miesiąca-dnia). :-).
Zephan Schroeder
3

Wiem, że nie jest to dokładnie to, o co prosiłeś, ale używam portu Windows dateaplikacji Linux z polecenia w pliku wsadowym, a następnie przypisuję wynik do zmiennej.

Muszę jeszcze znaleźć sposób na wiarygodne ustalenie daty za pomocą tylko poleceń wsadowych.

Hydaralny
źródło
2

Użyj tego pliku wsadowego dla formatu RRRR-MM-DD. Korzysta z narzędzia instrumentacji okien, które powinno być obecne we wszystkich najnowszych wersjach systemu Windows, aby uzyskać ciąg datetime niezależny od ustawień regionalnych.

Zapisz do pliku wsadowego w ścieżce (np.) C: \ windows \ rdate.bat, a następnie uzyskaj dostęp za pomocą CALL RDATE.BAT, aby ustawić zmienne. Alternatywnie skopiuj kod do pliku wsadowego.

Ten format daty jest odpowiedni dla nazw plików i logowania. Sortuje się poprawnie. Zmienna logtime dodaje zmienną data + czas jako RRRR-MM-DD-HHMMSS odpowiednią do rejestrowania aktywności pliku wsadowego z drugą dokładnością.

Dostosuj formaty daty i godziny, jak chcesz. REM echo ekranu podczas produkcji. Dwie liczby w każdym zaznaczeniu tekstu to zerowy indeks znaków początkowych i liczba znaków do skopiowania, np.% Datetime: ~ 0,4% przyjmuje 4-znakowy ciąg znaków rozpoczynający się od pozycji 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%
jim brzoza
źródło
1
Prawie taka sama jak odpowiedź and31415 . Oba skrypty używająwmic os get localdatetime
nixda
0

Próbowałeś użyć NET TIME \\%ComputerName%zamiast DATE? Myślę, że NET TIMEma to zapewnić dane w spójnym formacie niezależnie od ustawień regionalnych.

Kościół
źródło
Nie, nie ma.
AngryHacker
Co ciekawe, właśnie go wypróbowałem, przełączając się między formatami AU i US i net timezawsze wysyłam dane w formacie m / d / rrrr. @AngryHacker, przy jakich ustawieniach nie działało to dla Ciebie?
Hydaral
1
Zmieniłem francuski (belgijski), co dało mi 2011-07-27. USA dają
27.07.2011
0

Dzięki postowi Shekhara działa to w razie potrzeby i zero wypełnienia czasu.

@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%

Dane wyjściowe: LogFile-20151113-0901.txt

Trifused
źródło
-1

To może być nieco nie na temat, ale tutaj jest plik .bat, który napisałem dla moich własnych zaplanowanych kopii zapasowych, a także wywoływania z działań postbuildowych w Visual Studio. Mam nadzieję, że niektórym się przyda.

Zapisz następujące elementy w pliku .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
JC
źródło
1
tl; dr, możesz dodać wyjaśnienie działania skryptu. ponieważ nie wychodzi to od razu jako rozwiązanie. Może być również bardziej użyteczny, jeśli możesz usunąć niepotrzebne fragmenty kodu
Shekhar,
1
Cały skrypt wsadowy opiera się na zmiennych %date%i %time%, które są zależne od ustawień regionalnych i nie mogą być tak naprawdę analizowane w przewidywalny sposób, jak poprosił OP.
i31415