web-dev-qa-db-fra.com

Comment ajouter une date dans des fichiers batch

J'ai la ligne suivante dans un fichier batch (qui s'exécute sur un ancien Windows 2000 box):

7z a QuickBackup.Zip *.backup

Comment puis-je ajouter la date au fichier QuickBackup.Zip. Donc, si j’exécutais le fichier de commandes aujourd’hui, idéalement, ce serait QuickBackup20090514.Zip.

Y a-t-il un moyen de faire cela?

41
AngryHacker

La réponse de Bernhard avait besoin de quelques retouches, car la variable d'environnement% DATE% est dans un format différent (comme indiqué ailleurs). De plus, il manquait un tilde (~).

Au lieu de:

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

Je devais utiliser:

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

pour le format de date:

c:\Scripts> echo% DATE%

Jeu 14/05/2009 

55
Chris

Si vous savez que vos paramètres régionaux ne changeront pas, vous pouvez le faire comme suit:

  • si votre format de date court est jj/mm/aaaa:

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

  • si votre format de date court est MM/jj/aaaa:

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

Mais il n'y a pas de moyen général de le faire qui soit indépendant de vos paramètres régionaux.

Je ne recommanderais pas de s'appuyer sur les paramètres régionaux pour tout ce qui va être utilisé dans un environnement de production. Au lieu de cela, vous devriez envisager d’utiliser un autre langage de script - PowerShell, VBScript, ...

Par exemple, si vous créez un fichier VBS aaaaammjj.vbs dans le même répertoire que votre fichier batch, avec le contenu suivant:

' 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)

vous pourrez alors l'appeler à partir de votre fichier batch comme suit:

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

Bien sûr, il arrivera éventuellement un moment où la réécriture de votre fichier de commandes dans un langage de script plus puissant aura plus de sens que de le mélanger avec VBScript de cette manière.

12
Joe

Cela fonctionnera pour le format de date non américain (dd/MM/yyyy):

set backupFilename=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
7z a QuickBackup%backupFilename%.Zip *.backup
11
Bernhard Hofmann
@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!' 

Sortie:

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

Vous pouvez également accéder à la date via la variable %DATE%

Lors du test de mon système, %DATE% génère jj/jj/mm/aaaa

vous pouvez utiliser des opérateurs de sous-chaîne pour produire le format souhaité

c'est à dire. en cours d'exécution le lundi 11/12/2018 avec les paramètres régionaux des États-Unis

%DATE:~3,3% %DATE:~0,3% %DATE:~7,2%

Produira une sortie:

11 Mon 12

les arguments de sous-chaîne sont
%*variable*:~*startpos*,*numberofchars*%

5
ShoeLace

Ceci est tout maladroit et pas des paramètres locaux indépendants. Fais-le comme ça:

%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

Oui, utilisez Cygwin date et tous vos problèmes ont disparu!

3

Sûr.

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

C'est le format DDMMYYYY.

Voici 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
2
Dmitri Farkov

Si vous avez activé WSL (Windows 10 uniquement), vous pouvez le faire avec bash de manière neutre.

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

N'hésitez pas à remplacer la redirection de fichier par une abomination de boucle "pour" suggérée dans d'autres réponses ci-dessus et à - Le lot Windows attribue la sortie d'un programme à une variable

1
Raven

Sairam Avec les exemples donnés ci-dessus, j'ai essayé et sorti le script que je voulais. Les paramètres de position mentionnés dans un autre exemple ont donné des résultats différents. Je voulais créer un fichier de commandes pour effectuer quotidiennement la sauvegarde de données Oracle (données d'exportation), en préservant des fichiers DMP distincts avec la date et l'heure dans le nom de fichier. Voici le script qui a bien fonctionné:

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%
1
Udayshankar K P

Comme il a été noté, l'analyse de la date et de l'heure n'est utile que si vous connaissez le format utilisé par l'utilisateur actuel (par exemple, MM/jj/aa ou jj-MM-aaaa, pour ne nommer que 2). Cela pourrait être déterminé, mais au moment où vous ferez le stress et l'analyse, vous vous retrouverez toujours dans une situation dans laquelle un format inattendu est utilisé, et des ajustements supplémentaires seront nécessaires.

Vous pouvez également utiliser un programme externe qui renverra un slug de date dans le format de votre choix, mais le fait de devoir distribuer le programme utilitaire avec votre script/batch présente des inconvénients.

il existe également des astuces discontinues utilisant l'horloge CMOS de façon assez crue, mais c'est trop proche des fils nus pour la plupart des gens, et ce n'est pas toujours l'endroit idéal pour récupérer la date/heure.

Vous trouverez ci-dessous une solution qui évite les problèmes ci-dessus. Oui, cela introduit d'autres problèmes, mais pour les besoins de mon travail, j'ai trouvé que c'était la solution la plus facile, la plus claire et la plus portable pour créer un horodatage dans les fichiers .bat pour les systèmes Windows modernes. Ceci est juste un exemple, mais je pense que vous verrez comment modifier pour d’autres formats de date et/ou d’heure, 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
1
jph

J'ai utilisé la technique des variables d'environnement abordée ici: http://cwashington.netreach.net/depo/view.asp?Index=19

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

Voici le code de ce site:

::~~Author~~.          Brett Middleton
::~~Email_Address~~. [email protected]
::~~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 <[email protected]>
::               :  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.  E.g.,
::
::       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
1
Cade Roux

Il existe une recette technique disponible ici qui montre comment la formater au format MMJJAAAA, vous devriez pouvoir l’adapter à vos besoins.

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%

EDIT: La raison pour laquelle ne fonctionnait pas avant était à cause de «citations intelligentes» dans le texte original. Je les ai corrigés et le fichier batch fonctionnera s’il est coupé et collé à partir de cette page.

1
Andre Miller

Sur la base de l’idée de Joe, voici une version qui construira son propre assistant (.js) et son propre temps:

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

J'ai trouvé deux méthodes qui fonctionnent indépendamment des paramètres de date.

Sur mon pc, date/t retourne 2009-05-27

Vous pouvez soit accéder au registre et lire les paramètres régionaux (HKEY_CURRENT_USER\Control Panel\International)

Ou utilisez un fichier vbscript . Il s’agit du fichier hybride vilain/fichier batch que j'ai créé il ya quelque temps.

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

Ce n'est pas joli, mais ça marche.

0
Raymond Joyal