Ligne de commande Windows: créez un fichier avec la date actuelle dans son nom

19

J'essaie de créer un fichier zip à partir d'un script batch. J'ai besoin qu'il soit nommé comme archive_.zip

Malheureusement, cela ne fonctionne pas sur les systèmes dont la date est formatée comme y / m / d en raison des barres obliques:

zip some_options "archive_%DATE%.zip"

La %DATE%variable se développe en quelque chose comme

Mon 09/28/2009

J'ai accès au paquet gnuwin32, donc je pourrais utiliser, disons, sedpour remplacer les espaces et les barres obliques par des tirets. Le problème est, comment utiliser la sortie de sedpour créer le nom de fichier de l'archive zip?

Sous Unix (bash), on peut utiliser des guillemets pour évaluer sur place une commande et utiliser sa sortie dans une autre commande, quelque chose comme:

zip [...] archive_`echo %DATE% | sed -e s/.../.../`.zip

Existe-t-il quelque chose de similaire disponible dans Windows?

Ou peut-être existe-t-il un moyen de définir une variable sur la valeur renvoyée sedet de l'utiliser pour construire le nom du fichier?

Cristi Diaconescu
la source

Réponses:

27

Vous pouvez remplacer des symboles dans des variables en utilisant:

set _date=%DATE:/=-%
Christophe
la source
1
Ceci est une astuce intéressante!
Cristi Diaconescu
PS Existe-t-il un moyen «à une ligne» de se débarrasser des espaces ou d'autres personnages méchants? (par opposition à avoir une 3ème ... nième variable temporaire pour chaque caractère à remplacer)
Cristi Diaconescu
Non désolé. Il ne semble pas exister une telle chose. Vous devez recourir à la syntaxe for pour ce faire. NB: Ceci est une belle référence pour la programmation par lots: robvanderwoude.com/batchfiles.php
Christopher
5
c'est encore plus rapide que %date:~-10,2%-%date:~-7,2%-%date:~-4,4% :!
Jess Stone
Comment personne n'a +1 à votre réponse Jess Stone! +1 de moi !!!
Arvo Bowen
5

J'utilise toujours:

For /f "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDate=%%a%%b%%c%%d

Ensuite, CDate sera Sat02182012. Si vous voulez le rendre plus triable, définissez CDate sur %% d - %% b - %% c pour que ce soit le 2012-02-18

For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g

Pour rendre le dossier / fichier convivial pour la date et l'heure

fainéant
la source
4

J'ai posté une réponse à une question très similaire ici . Le fractionnement de la date dans les champs se fait sur 1 ligne, au lieu de plusieurs lignes dans la réponse de harrymc.

La partie intéressante est:

@echo off
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k%%j%%i
echo Date: %yyyymmdd%

Et l'avertissement est toujours d'actualité:

Attention : le format de la date (aaaammjj = %% k %% j %% i) dépend de vos paramètres régionaux. Comme j'utilise le format de date français (jj / mm / aaaa), je dois utiliser "%% k %% j %% i" comme format (%% i = jour, %% j = mois, %% j = année).

Si vos paramètres régionaux sont définis sur le style américain (mm / jj / aaaa), vous devez utiliser "%% k %% i %% j" (%% i = mois, %% j = jour, %% j = année) .

Snark
la source
3
zip some_options "archive_%date:/=-%.zip"

les /=-remplaçants /avec un signe moins.

Théo
la source
2

Ce morceau de code plutôt horrible devrait faire quelque chose comme ce que vous voulez

move "Filename.txt" "Filename%date:~6,4%%date:~3,2%%date:~0,2%_%Time:~0,2%%Time:~3,2%%Time:~6,2%.txt"

Si vous modifiez le nom de fichier de manière appropriée.

Col
la source
1
Voulez-vous expliquer la monstruosité? :)
Cristi Diaconescu
Il s'agit essentiellement de couper des bits de la date et de les alimenter au milieu du nom de fichier, vous pouvez le tester en faisant écho puis des parties de l'horreur sur la ligne de commande, donc si vous faites écho% date: ~ 6,4%, cela donne le année. Il suffit de sous-chaîne la date et l'heure.
Col
Intéressant. Pas trop portable malheureusement ...
Cristi Diaconescu
Malheureusement, le problème avec l'utilisation de sous-chaînes est qu'il repose sur un certain format de date et explose lorsqu'il est différent. echo %date:~6,4%%date:~3,2%%date:~0,2%revient 9-289-20sur ma machine depuis que j'ai la date fixée pour utiliser aaaa-MM-jj (donc aujourd'hui est le 2009-09-28).
Joshua
Certes, je n'utilise cette solution que sur une seule machine, ce n'est donc pas trop un problème.
Col
2

Puisque votre question est étiquetée comme Windows, j'ai trouvé cette solution qui fonctionne dans les bons vieux fichiers .bat:
"Windows Batch File (.bat) pour obtenir la date actuelle au format MMDDYYYY" ,
et peut probablement être adaptée à votre cas:

écho sur
le lot de dates rapides de @REM Seamonkey (format MMDDYYYY)
@REM Setups% date variable
@REM Premièrement, analyse le mois, le jour et l'année dans les formats mm, dd, yyyy puis combine pour être MMDDYYYY

FOR / F "TOKENS = 1 * DELIMS =" %% A IN ('DATE / T') DO SET 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 = %% Bv vSET date =% mm %% dd %% yyyy%

cela ne fait que configurer la variable% date pour qu'elle soit la date d'aujourd'hui au format MMDDYYYY afin qu'elle puisse être appelée plus tard dans le script.

Modifier
Trouvé une meilleure syntaxe. Étant donné que ma date est aujourd'hui "Lun 28/09/2009":
jour défini =% Date: ~ 0,2%
mois défini =% Date: ~ 7,2%
année définie =% Date: ~ 10,4%

harrymc
la source
2

version pure cmd.exe en combinaison avec gnuwin32-'date ':

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>
akira
la source
Il peut donc effectuer des substitutions sur place! Si vous me demandez, la commande 'for' a une syntaxe étrange ...
Cristi Diaconescu
je n'ai pas prétendu qu'il ne pouvait pas :) tout le truc 'cmd' est fou de toute façon, celui qui a conçu cela était profondément dans une sorte de mauvais rêve. la cmd 'for' crée en fait des lignes (alias 'déroule' la 'boucle') dans la première passe puis exécute le script ainsi 'créé'.
akira
1

qu'en est-il de l'utilisation de cscript + vbasic:

WScript.shell.run "zip archive_" & DatePart("yyyy", Now) & "_" & DatePart("m", Now) & "_" & DatePart("d", Now) & ".zip " & WScript.arguments(0)

appeler via

cscript /nologo zip_it.vbs
akira
la source
1

Pour / f "jetons = 1,2,3,4,5 delims = /." %% a dans ('date / T') définissez CDate = %% d - %% b - %% c

@echo data =% CDate%

C'est dans l'année-mois-jour qui est le plus courant aujourd'hui


la source
1

Toute solution qui utilise l'un %DATE%ou l' autre ou la sortie de date /test susceptible de se casser si l'utilisateur a modifié ses paramètres régionaux. Par exemple, j'ai défini mon format "date courte" sur "yyyy-MM-dd", donc j'ai %DATE%égal à "2012-02-18", et date /tproduit la même sortie. (C'est pour Windows 7; je suppose que c'est la même chose pour les versions antérieures de Windows.)

Créez un fichier de commandes, puis exécutez-le.

Puisque vous disposez de la datecommande GNU , vous pouvez faire quelque chose comme ceci:

C:\path\to\gnu\date "+zip some_options archive_%Y-%m-%d.zip" > tmp.bat
call .\tmp.bat

tmp.bat contiendra quelque chose comme:

zip some_options archive_2012-02-18.zip

Notez que cela crée tmp.batdans le répertoire courant, ce qui pourrait être un problème; il serait peut-être préférable de créer %TEMP%\tmp.bat. Je n'ai pas non plus supprimé le fichier par la suite; c'est assez facile à faire.

date +FORMATvous permet de spécifier le format de sortie de la datecommande, semblable à une printfchaîne de format; voir la documentation de date coreutils pour plus de détails. Le format peut inclure du texte arbitraire, dans ce cas, vous n'avez même pas besoin de l'utiliser sed.

Keith Thompson
la source
1

Je suppose que si vous rassemblez les morceaux de tout le monde, vous obtenez quelque chose qui fonctionne pour vous. C'est sur un système Windows 2003 pour me donner un instantané des processus en cours d'exécution en réponse à un déclencheur du moniteur de performances:

@echo off
For /f "tokens=1,2,3,4,5 delims=/. " %%i in ('date /t') do set CDate=%%k%%j%%i
For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g
tasklist /fo table >tasklist%CDate%%CTime%.txt

Le fichier de sortie est nommé dans une chaîne sans délimiteur.

Anton Liebscher
la source
0
zip [...] archive_`echo %DATE% | tr / -`.zip

Devrait marcher.

D'un autre côté - peut-être avez-vous une datecommande disponible (je ne connais pas Windows). Si oui, alors faites simplement:

zip [...] archive_`date +'%Y-%m-%d'`.zip

la source
L'astuce de backtick ne fonctionne pas dans cmd.exe. Et la commande Windows 'date' ne peut pas gérer le formatage :(
Cristi Diaconescu
-1

Je ne sais pas si cela vous convient, mais mon code est

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
Kelly
la source
L'OP veut un fichier avec la date actuelle dans le nom du fichier , pas dans le contenu
Jan Doggen