81 votes

Date et heure de la commande par lot dans le nom du fichier

Je compresse les fichiers en utilisant WinZip sur la ligne de commande. Comme nous archivons quotidiennement, j'essaie d'ajouter la date et l'heure à ces fichiers afin qu'un nouveau fichier soit généré automatiquement à chaque fois.

J'utilise ce qui suit pour générer un nom de fichier. Copiez-collez-le dans votre ligne de commande et vous devriez voir un nom de fichier avec un composant Date et Heure.

echo Archive_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.zip

Sortie

Archive_20111011_ 93609.zip

Cependant, mon problème est le suivant AM vs PM . L'horodatage AM me donne le temps 9 (avec un espace en tête) vs. 10 occupant naturellement les deux espaces.

Je suppose que mon problème s'étendra également aux neuf premiers jours, aux neuf premiers mois, etc.

Comment puis-je corriger cela pour que les zéros de tête soient inclus au lieu des espaces vides de tête, de sorte que j'obtienne Archive_20111011_093609.zip ?

4 votes

J'ai fini par utiliser le vôtre pour une tâche quotidienne, toutes les réponses étaient bien plus désordonnées.

86voto

Stephan Points 6585

Une autre solution :

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I

Il vous donnera (indépendamment des paramètres locaux !):

  20130802203023.304000+120
( YYYYMMDDhhmmss.<milliseconds><always 000>+/-<minutes difference to UTC>  )

A partir de là, c'est facile :

set datetime=%datetime:~0,8%-%datetime:~8,6%
20130802-203023

Pour la demande de Logan, le même format de sortie pour la "date-heure modifiée" d'un fichier :

for %%F in (test.txt) do set file=%%~fF
for /f "tokens=2 delims==" %%I in ('wmic datafile where name^="%file:\=\\%" get lastmodified /format:list') do set datetime=%%I
echo %datetime%

Elle est un peu plus compliquée, car elle ne fonctionne qu'avec des chemins complets, wmic s'attend à ce que les barres obliques inversées soient doublées et à ce que la commande = doit être échappé (le premier, le second étant protégé par des guillemets).

1 votes

Brillant ! (Exemple de sortie de la commande wmic : LocalDateTime=20140619212037.828000+120 )

0 votes

Ne fonctionne pas pour moi %%I was unexpected at this time

3 votes

@AnonymousMohit : %%I est destiné à être utilisé dans les fichiers batch. Si vous utilisez la ligne directement à l'invite de commande, vous devrez utiliser la fonction %I à la place.

61voto

Alex K. Points 67805

Extrayez l'heure, recherchez un espace avant, s'il est trouvé, remplacez-le par un zéro ;

set hr=%time:~0,2%
if "%hr:~0,1%" equ " " set hr=0%hr:~1,1%
echo Archive_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%hr%%time:~3,2%%time:~6,2%.zip

12 votes

Pourquoi chercher, vous pouvez tout simplement remplacer tous les espaces par zéro set hr=%hr: =0%

3 votes

@jeb, pourquoi commenter et ne pas répondre ?

0 votes

J'ai Archive_b-%a%cc-_142053.zip

24voto

WxGuy Points 81

Vous devriez chercher ; vous pouvez simplement remplacer tous les espaces par des zéros. set hr=%hr: =0% - jeb 11 octobre '11 à 14:16

C'est ce que j'ai fait :

set hr=%time:~0,2%
set hr=%hr: =0%

Ensuite, utilisez %hr% à l'intérieur de la chaîne que vous mettez en forme pour obtenir toujours une heure à deux chiffres.

(Le commentaire de Jeb sous la réponse la plus populaire a le mieux fonctionné pour moi et est le plus simple. Je le reposte ici pour que ce soit plus évident pour les futurs utilisateurs).

3 votes

Il est dommage que vous ne puissiez pas enchaîner les transformations. %time:~0,2: =0% ça aurait été bien. :^(

0 votes

Ceci me semble être la meilleure solution... mes félicitations aux personnes qui ont envoyé les informations WMIC... principalement ce format de date indépendant "wmic os get localdatetime" qui m'est très utile... merci encore les gens... restez bien...

0 votes

Wow, une solution vraiment cool et courte. Je ne savais pas qu'on pouvait remplacer les chiffres dans les variables env comme ça :D

17voto

PA. Points 10538

Comme Vicky l'a déjà souligné, %DATE% et %TIME% retourner la date et l'heure actuelles en utilisant les formats courts de date et d'heure qui sont entièrement (infiniment) personnalisables.

Un utilisateur peut configurer son système pour qu'il renvoie Fri040811 08.03PM alors qu'un autre utilisateur peut choisir 08/04/2011 20:30.

C'est un véritable cauchemar pour un programmeur BAT.

Le changement de format vers un format ferme peut résoudre le problème, à condition de restaurer le format précédent avant de laisser le fichier BAT. Mais cela peut être sujet à des conditions de course désagréables et compliquer la récupération dans les fichiers BAT annulés.

Heureusement, il existe une alternative.

Vous pouvez utiliser WMIC, à la place. WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table renvoie la date et l'heure de manière invariable. Très pratique pour l'analyser directement avec un FOR /F commandement.

Donc, en rassemblant les pièces, essayez ceci comme point de départ...

SETLOCAL enabledelayedexpansion
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
  SET /A FD=%%F*1000000+%%D*100+%%A
  SET /A FT=10000+%%B*100+%%C
  SET FT=!FT:~-4!
  ECHO Archive_!FD!_!FT!.zip
 )

4voto

Vicky Points 6749

Vous pouvez ajouter des zéros non significatifs à une variable (valeur jusqu'à 99) comme ceci en batch : IF 1%Var% LSS 100 SET Var=0%Var%

Vous devez donc analyser les composants de la date et de l'heure dans des variables distinctes, les traiter comme ceci, puis les concaténer à nouveau pour créer le nom du fichier.

Cependant, votre méthode sous-jacente pour analyser la date et l'heure dépend des paramètres régionaux du système. Si vous souhaitez que votre code ne soit pas portable sur d'autres machines, c'est probablement parfait, mais si vous souhaitez qu'il fonctionne dans différents contextes internationaux, vous devrez adopter une approche différente, par exemple en lisant les paramètres du registre :

HKEY_CURRENT_USER\Control Panel\International\iDate
HKEY_CURRENT_USER\Control Panel\International\iTime
HKEY_CURRENT_USER\Control Panel\International\iTLZero

(Ce dernier contrôle s'il y a un zéro en tête sur les heures, mais pas sur les dates pour autant que je sache).

0 votes

Je veux vous donner un autre +1 pour les paramètres locaux. Je fais cela sur les serveurs de mon entreprise, le changement de paramètres régionaux est le suivant pas une option sur ces serveurs, donc je suis assez sûr. La date et l'heure sont uniquement une indication de la date d'exécution de la tâche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X