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?

Réponses:


27

Vous pouvez remplacer des symboles dans des variables en utilisant:

set _date=%DATE:/=-%

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


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


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

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


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.


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%


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>

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

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


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.


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.


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

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

L'OP veut un fichier avec la date actuelle dans le nom du fichier , pas dans le contenu
Jan Doggen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.