Cómo agregar una fecha en archivos por lotes

Tengo la siguiente línea en un archivo por lotes (que se ejecuta en un antiguo cuadro de Windows 2000 ):

7z a QuickBackup.zip *.backup 

¿Cómo QuickBackup.zip la fecha al archivo QuickBackup.zip ? Entonces, si ejecutara el archivo por lotes hoy, idealmente, el archivo sería QuickBackup20090514.zip .

¿Hay alguna forma de hacer esto?

La respuesta de Bernhard necesitó algunos ajustes para mí porque la variable de entorno% DATE% está en un formato diferente (como se comentó en otra parte). Además, faltaba una tilde (~).

En lugar de:

set backupFilename=%DATE:~6,4%%DATE:~3,2%%DATE:0,2%

Tuve que usar:

set backupFilename=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%

para el formato de fecha:

c: \ Scripts> echo% DATE%

Jue 14/05/2009

Si sabe que su configuración regional no cambiará, puede hacerlo de la siguiente manera:

  • si su formato de fecha corta es dd / MM / aaaa:

    SET MYDATE =% FECHA: ~ 3,2 %% FECHA: ~ 0,2 %% FECHA: ~ 8,4%

  • si su formato de fecha corta es MM / dd / aaaa:

    SET MYDATE =% FECHA: ~ 0,2 %% FECHA: ~ 3,2 %% FECHA: ~ 8,4%

Pero no hay una forma general de hacerlo que sea independiente de su configuración regional.

No recomendaría confiar en la configuración regional para cualquier cosa que vaya a usarse en un entorno de producción. En su lugar, debería considerar usar otro lenguaje de scripting: PowerShell, VBScript, …

Por ejemplo, si crea un archivo VBS aaaammdd.vbs en el mismo directorio que su archivo por lotes con los siguientes contenidos:

 ' yyyymmdd.vbs - outputs the current date in the format yyyymmdd Function Pad(Value, PadCharacter, Length) Pad = Right(String(Length,PadCharacter) & Value, Length) End Function Dim Today Today = Date WScript.Echo Pad(Year(Today), "0", 4) & Pad(Month(Today), "0", 2) & Pad(Day(Today), "0", 2) 

entonces podrá llamarlo desde su archivo por lotes así:

 FOR /F %%i IN ('cscript "%~dp0yyyymmdd.vbs" //Nologo') do SET MYDATE=%%i echo %MYDATE% 

Por supuesto, llegará un punto en el que reescribir su archivo por lotes en un lenguaje de scripting más poderoso tendrá más sentido que mezclarlo con VBScript de esta manera.

Esto funcionará para el formato de fecha no estadounidense ( dd/MM/yyyy ):

 set backupFilename=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2% 7z a QuickBackup%backupFilename%.zip *.backup 
 @SETLOCAL ENABLEDELAYEDEXPANSION @REM Use WMIC to retrieve date and time @echo off FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO ( IF NOT "%%~F"=="" ( SET /A SortDate = 10000 * %%F + 100 * %%D + %%A set YEAR=!SortDate:~0,4! set MON=!SortDate:~4,2! set DAY=!SortDate:~6,2! @REM Add 1000000 so as to force a prepended 0 if hours less than 10 SET /A SortTime = 1000000 + 10000 * %%B + 100 * %%C + %%E set HOUR=!SortTime:~1,2! set MIN=!SortTime:~3,2! set SEC=!SortTime:~5,2! ) ) @echo on @echo DATE=%DATE%, TIME=%TIME% @echo HOUR=!HOUR! MIN=!MIN! SEC=!SEC! @echo YR=!YEAR! MON=!MON! DAY=!DAY! @echo DATECODE= '!YEAR!!MON!!DAY!!HOUR!!MIN!' 

Salida:

 DATE=2015-05-20, TIME= 1:30:38.59 HOUR=01 MIN=30 SEC=38 YR=2015 MON=05 DAY=20 DATECODE= '201505200130' 

Todo esto es incómodo y no ajustes locales independientes. Hazlo asi:

 %CYGWIN_DIR%\bin\date +%%Y%%m%%d_%%H%%M% > date.txt for /f "delims=" %%a in ('type "date.txt" 2^>NUL') do set datetime=%%a echo %datetime% del date.txt 

Sí, utiliza la fecha de Cygwin y todos tus problemas desaparecen.

También puede acceder a la fecha a través de la variable %DATE%

Al probar mi sistema %DATE% produce dd / mm / aaaa

puede usar operadores de subcadenas para producir el formato que desee

es decir

 %DATE:~3,2%%DATE:~0,2%%DATE:~6,4% 

la subcadena argumenst son
%*variable*:~*startpos*,*numberofchars*%

Por supuesto.

 FOR %%A IN (%Date:/=%) DO SET Today=%%A 7z a QuickBackup%TODAY%.zip *.backup 

Ese es el formato DDMMYYYY.

Aquí está YYYYDDMM:

 FOR %%A IN (%Date%) DO ( FOR /F "tokens=1-3 delims=/-" %%B in ("%%~A") DO ( SET Today=%%D%%B%%C ) ) 7z a QuickBackup%TODAY%.zip *.backup 

Hay una receta de tecnología disponible aquí que muestra cómo formatearla en MMDDYYYY, debería ser capaz de adaptarla a sus necesidades.

 echo on @REM Seamonkey's quick date batch (MMDDYYYY format) @REM Setups %date variable @REM First parses month, day, and year into mm , dd, yyyy formats and then combines to be MMDDYYYY 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% echo %date% 

EDITAR: La razón por la que no funcionó antes fue debido a ‘smartquotes’ en el texto original. Los arreglé y el archivo por lotes funcionará si se corta y pega de esta página.

Utilicé la técnica de variables de entorno tratada aquí: http://cwashington.netreach.net/depo/view.asp?Index=19

http://cwashington.netreach.net/depo/default.asp?topic=repository&move=last&ScriptType=command&SubType=Misc

Aquí está el código de ese sitio:

 ::~~Author~~. Brett Middleton ::~~Email_Address~~. brettm@arches.uga.edu ::~~Script_Type~~. nt command line batch ::~~Sub_Type~~. Misc ::~~Keywords~~. environment variables ::~~Comment~~. ::Sets or clears a group of environment variables containing components of the current date extracted from the string returned by the DATE /T command. These variables can be used to name files, control the flow of execution, etc. ::~~Script~~. @echo off ::----------------------------------------------------------------------------- :: SetEnvDate1.CMD 6/30/98 ::----------------------------------------------------------------------------- :: Description : Sets or clears a group of environment variables containing :: : components of the current date extracted from the string :: : returned by the DATE /T command. These variables can be :: : used to name files, control the flow of execution, etc. :: : :: Requires : Windows NT with command extensions enabled :: : :: Tested : Yes, as demonstration :: : :: Contact : Brett Middleton  :: : Animal and Dairy Science Department :: : University of Georgia, Athens ::----------------------------------------------------------------------------- :: USAGE :: :: SetEnvDate1 can be used as a model for coding date/time routines in :: other scripts, or can be used by itself as a utility that is called :: from other scripts. :: :: Run or call SetEnvDate1 without arguments to set the date variables. :: Variables are set for the day abbreviation (DT_DAY), month number (DT_MM), :: day number (DT_DD) and four-digit year (DT_YYYY). :: :: When the variables are no longer needed, clean up the environment by :: calling the script again with the CLEAR argument. Eg, :: :: call SetEnvDate1 clear ::----------------------------------------------------------------------------- :: NOTES :: :: A time variable could be added by parsing the string returned by the :: built-in TIME /T command. This is left as an exercise for the reader. B-) :: :: This script illustrates the following NT command extensions: :: :: 1. Use of the extended IF command to do case-insensitive comparisons. :: :: 2. Use of the extended DATE command. :: :: 3. Use of the extended FOR command to parse a string returned by a :: command or program. :: :: 4. Use of the "()" conditional processing symbols to group commands :: for conditional execution. All commands between the parens will :: be executed if the preceeding IF or FOR statement is TRUE. ::----------------------------------------------------------------------------- if not "%1" == "?" goto chkarg echo. echo Sets or clears date/time variables in the command environment. echo. echo SetEnvDate1 [clear] echo. echo When called without arguments, the variables are created or updated. echo When called with the CLEAR argument, the variables are deleted. echo. goto endit ::----------------------------------------------------------------------------- :: Check arguments and select SET or CLEAR routine. Unrecognized arguments :: are ignored and SET is assumed. ::----------------------------------------------------------------------------- :chkarg if /I "%1" == "CLEAR" goto clrvar goto setvar ::----------------------------------------------------------------------------- :: Set variables for the day abbreviation (DAY), month number (MM), :: day number (DD) and 4-digit year (YYYY). ::----------------------------------------------------------------------------- :setvar for /F "tokens=1-4 delims=/ " %%i IN ('date /t') DO ( set DT_DAY=%%i set DT_MM=%%j set DT_DD=%%k set DT_YYYY=%%l) goto endit ::----------------------------------------------------------------------------- :: Clear all variables from the environment. ::----------------------------------------------------------------------------- :clrvar for %%v in (DT_DAY DT_MM DT_DD DT_YYYY) do set %%v= goto endit :endit 

Como se ha señalado, el análisis de la fecha y la hora solo es útil si conoce el formato que está utilizando el usuario actual (por ejemplo, MM / dd / aa o dd-MM-aaaa solo para nombrar 2). Esto podría determinarse, pero para el momento en que haga todo el análisis y el análisis, todavía terminará con una situación en la que se utiliza un formato inesperado, y se necesitarán más ajustes.

También puede usar algún progtwig externo que devolverá una fecha en su formato preferido, pero tiene la desventaja de tener que distribuir el progtwig de utilidad con su secuencia de comandos / lote.

también hay trucos por lotes utilizando el reloj CMOS de una manera bastante cruda, pero eso es demasiado parecido a los cables pelados para la mayoría de las personas, y tampoco es siempre el lugar preferido para recuperar la fecha / hora.

A continuación hay una solución que evita los problemas anteriores. Sí, presenta algunos otros problemas, pero para mis propósitos, encontré que esta es la solución más fácil, clara y portátil para crear una marca de fecha en archivos .bat para sistemas Windows modernos. Esto es solo un ejemplo, pero creo que verá cómo modificar otros formatos de fecha y / o hora, etc.

 reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f @REM the following may be needed to be sure cache is clear before using the new setting reg query "HKCU\Control Panel\International" /v sShortDate set LogDate=%date% reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 

Si tiene habilitado WSL (solo Windows 10), puede hacerlo con bash de forma neutral.

 set dateFile=%TEMP%\currentDate.txt bash -c "date +%Y%m%d" > %dateFile% set /p today=<%dateFile% 

Siéntase libre de reemplazar la redirección de archivos con una abominación de bucle "for" sugerida en otras respuestas aquí y más en la salida de Windows batch assign de un progtwig a una variable

He encontrado dos formas que funcionan independientemente de la configuración de la fecha.

En mi pc, date / t regresa 2009-05-27

Puede acceder al registro y leer la configuración regional (HKEY_CURRENT_USER \ Control Panel \ International)

O use un vbscript. Este es el feo archivo por lotes / híbrido vbscript que creé hace un tiempo …

 @Echo Off set rnd=%Random% set randfilename=x%rnd%.vbs ::create temp vbscript file Echo Dim DayofWeek(7) > %temp%\%randfilename% Echo DayofWeek(1)="Sun" >> %temp%\%randfilename% Echo DayofWeek(2)="Mon" >> %temp%\%randfilename% Echo DayofWeek(3)="Tue" >> %temp%\%randfilename% Echo DayofWeek(4)="Wed" >> %temp%\%randfilename% Echo DayofWeek(5)="Thu" >> %temp%\%randfilename% Echo DayofWeek(6)="Fri" >> %temp%\%randfilename% Echo DayofWeek(7)="Sat" >> %temp%\%randfilename% Echo DayofWeek(0)=DayofWeek(Weekday(now)) >> %temp%\%randfilename% Echo Mon=Left(MonthName(Month(now),1),3) >> %temp%\%randfilename% Echo MonNumeric=right ( "00" ^& Month(now) , 2) >> %temp%\%randfilename% Echo wscript.echo ( Year(Now) ^& " " ^& MonNumeric ^& " " ^& Mon ^& " " _ >> %temp%\%randfilename% Echo ^& right("00" ^& Day(now),2) ^& " "^& dayofweek(0) ^& " "^& _ >> %temp%\%randfilename% Echo right("00" ^& Hour(now),2)) _ >> %temp%\%randfilename% Echo ^&":"^& Right("00" ^& Minute(now),2) ^&":"^& Right("00" ^& Second(Now),2) >> %temp%\%randfilename% ::set the output into vars if "%1" == "" FOR /f "usebackq tokens=1,2,3,4,5,6" %%A in (`start /wait /b cscript //nologo %temp%\%randfilename%`) do Set Y2KYear=%%A& Set MonthNumeric=%%B& Set Month=%%C& Set Day=%%D& Set DayofWeek=%%E& Set Time=%%F set year=%y2kyear:~2,2% ::cleanup del %temp%\%randfilename% 

No es bonito, pero funciona.

Sobre la base de la idea de Joe, aquí hay una versión que construirá su propio ( .js ) ayudante y tiempo de soporte también:

 @echo off set _TMP=%TEMP%\_datetime.tmp echo var date = new Date(), string, tmp;> "%_TMP%" echo tmp = ^"000^" + date.getFullYear(); string = tmp.substr(tmp.length - 4);>> "%_TMP%" echo tmp = ^"0^" + (date.getMonth() + 1); string += tmp.substr(tmp.length - 2);>> "%_TMP%" echo tmp = ^"0^" + date.getDate(); string += tmp.substr(tmp.length - 2);>> "%_TMP%" echo tmp = ^"0^" + date.getHours(); string += tmp.substr(tmp.length - 2);>> "%_TMP%" echo tmp = ^"0^" + date.getMinutes(); string += tmp.substr(tmp.length - 2);>> "%_TMP%" echo tmp = ^"0^" + date.getSeconds(); string += tmp.substr(tmp.length - 2);>> "%_TMP%" echo WScript.Echo(string);>> "%_TMP%" for /f %%i in ('cscript //nologo /e:jscript "%_TMP%"') do set _DATETIME=%%i del "%_TMP%" echo YYYYMMDDhhmmss: %_DATETIME% echo YYYY: %_DATETIME:~0,4% echo YYYYMM: %_DATETIME:~0,6% echo YYYYMMDD: %_DATETIME:~0,8% echo hhmm: %_DATETIME:~8,4% echo hhmmss: %_DATETIME:~8,6% 

Sairam Con las muestras dadas anteriormente, probé y saqué el guión que quería. Los parámetros de posición mencionados en otro ejemplo dieron resultados diferentes. Quería crear un archivo por lotes para realizar la copia de seguridad de los datos de Oracle (datos de exportación) a diario, preservando distintos archivos DMP con fecha y hora como parte del nombre del archivo. Aquí está el script que funcionó bien:

 cls set dt=%date:~0,2%%date:~3,2%%date:~6,4%-%time:~0,2%%time:~3,2% set fn=backup-%dt%.DMP echo %fn% pause A exp user/password file=D:\DATA_DMP\%fn%