¿Cómo obtener la fecha en un archivo por lotes en un formato predecible?

17

En un archivo por lotes, necesito extraer un mes, día, año del comando de fecha. Así que usé lo siguiente, que esencialmente analiza el comando Fecha para extraer sus subcadenas en una variable:

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

Todo esto es genial, pero si implemento este archivo por lotes en una máquina con una configuración regional / país diferente, falla porque el mes, el día y el año están en diferentes ubicaciones.

¿Cómo puedo extraer mes, día y año independientemente del formato de fecha?

AngryHacker
fuente
1
¿Estás absolutamente restringido a Batch? Tal cosa es mucho más simple en VBScript / WSH y / o PowerShell ...
Adrien el
@Adrien, sí limitado al lote: es parte del paso posterior a la compilación de VS2008.
AngryHacker
reemplazando% date% por% date: ~ 6,4% -% date: ~ 3,2% -% date: ~ 0,2% trabajado
MagTun

Respuestas:

14

Fuente: http://ss64.com/nt/syntax-getdate.html

Método 2 (cmd simple)

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

ingrese la descripción de la imagen aquí


Método 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)
Tex Hex
fuente
1
Ah, ja, una forma muy ordenada de encontrar el orden de fechas de la localidad. ss64 tiene una comunidad ingeniosa de usuarios de cmd.exe.
Nicholi
Incluí ambos scripts de su enlace de origen. Espero que esté bien para ti
nixda
@nixda No hay problema, lo que sea que el usuario ayude.
Tex Hex
Si necesita retener los segundos en el "Método 2" anterior, agregue Set _second=00%%Kal extraer de wmicy rellene con ceros a la izquierda como los demás.
Tim Parenti
12

Windows XP y posterior

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%

Salida

ingrese la descripción de la imagen aquí

y31415
fuente
+1 para la respuesta más concisa. También sugiero terminar con el ECHO %year%-%month%-%day%formato compatible con ISO y el sistema de archivos (sin mencionar que se clasifica automáticamente por año-mes-día). :-).
Zephan Schroeder
3

Sé que no es exactamente lo que pediste, pero utilizo el puerto de Windows de la dateaplicación Linux desde un comando dentro del archivo por lotes y luego asigno el resultado a una variable.

Todavía tengo que encontrar una manera de obtener la fecha de manera confiable usando solo comandos por lotes.

Hydaral
fuente
2

Utilice este archivo por lotes para el formato AAAA-MM-DD. Utiliza la herramienta de instrumentación de ventanas que debería estar presente en todas las versiones recientes de Windows para obtener una cadena de fecha y hora que sea independiente de la configuración regional.

Guarde en un archivo por lotes en la ruta (p. Ej.) C: \ windows \ rdate.bat y luego acceda con CALL RDATE.BAT para establecer las variables. Alternativamente, copie el código en su archivo por lotes.

Este formato de fecha es adecuado para nombres de archivo y registros. Se ordena correctamente. La variable logtime agrega una variable de fecha + hora como AAAA-MM-DD-HHMMSS adecuada para su uso en el registro de la actividad del archivo por lotes con una segunda precisión.

Ajuste los formatos de fecha (y hora) como desee. REM la pantalla echos en producción. Los dos números en cada selección de texto son el índice de caracteres de inicio basado en cero y el número de caracteres para copiar, por ejemplo,% datetime: ~ 0,4% toma una subcadena de 4 caracteres que comienza en la posición 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 abedul
fuente
1
Casi lo mismo que la respuesta de and31415 . Ambos guiones usanwmic os get localdatetime
nixda
0

¿Has intentado usar en NET TIME \\%ComputerName%lugar de DATE? Creo que NET TIMEse supone que debe proporcionar los datos en un formato coherente independientemente de la configuración regional.

Iglesia
fuente
No, no lo hace.
AngryHacker
Interesante, lo acabo de probar, cambiando entre formatos AU y US, y net timesiempre salgo en formato m / d / aaaa. @AngryHacker, ¿con qué configuración no funcionó para usted?
Hydaral
1
Cambié de francés (belga) y me dio el 27/07/2011. Estados Unidos da 27/07/2011
AngryHacker
0

Gracias a la publicación de Shekhar, esto funciona según sea necesario y cero relleno del tiempo.

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

Salida: LogFile-20151113-0901.txt

Trifused
fuente
-1

Esto puede estar un poco fuera de tema, pero aquí hay un archivo .bat que escribí para mis propias copias de seguridad programadas y que también llamo desde acciones posteriores a la creación en Visual Studio. Espero que algunos lo encuentren útil.

Guarde lo siguiente en un archivo .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
fuente
1
tl; dr, puede agregar una explicación de lo que hace el script. porque no sale como una solución de inmediato. También podría ser más útil, si puede eliminar los bits de código no pertinentes
Shekhar
1
Todo el script por lotes se basa en las variables %date%y %time%, que tienen en cuenta la configuración regional y no se pueden analizar de una manera predecible como lo solicitó el OP.
y31415