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

Je compresse des fichiers en utilisant WinZip sur la ligne de commande. Comme nous archivons quotidiennement, j’essaie d’append la date et l’heure à ces fichiers afin d’en créer un nouveau à chaque fois.

J’utilise les éléments suivants pour générer un nom de fichier. Copiez le coller sur 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 AM vs PM . L’horodatage AM me donne le temps 9 (avec un espace vide en tête) contre 10 prenant naturellement les deux espaces.

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

Comment est-ce que je corrige ceci pour que les zéros principaux soient inclus au lieu des espaces vides alors j’obtiens Archive_20111011_093609.zip ?

    Une autre solution:

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

    Cela vous donnera (indépendamment des parameters régionaux!):

      20130802203023.304000+120 ( YYYYMMDDhhmmss.+/- ) 

    De là, c’est facile:

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

    Pour la demande de Logan pour 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% 

    C’est un peu plus compliqué, car cela ne fonctionne qu’avec des chemins complets, wmic s’attend à ce que les barres obliques inverses soient doublées et que le = soit échappé (le premier. Le second est protégé par des guillemets environnants).

    Extraire l’heure, recherchez un espace avant, si 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 

    Vous devriez chercher; vous pouvez simplement remplacer tous les espaces par zéro set hr=%hr: =0%jeb Oct 11 ’11 at 14:16

    Donc j’ai fait:

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

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

    (Le commentaire de Jeb sous la réponse la plus populaire a été le meilleur pour moi et est le plus simple. Je le redis ici pour le rendre plus évident pour les futurs utilisateurs.)

    Comme Vicky l’a déjà souligné, %DATE% et %TIME% renvoient la date et l’heure actuelles en utilisant les formats de date et d’heure courts, entièrement personnalisables.

    Un utilisateur peut configurer son système pour retourner Fri040811 20h03 alors qu’un autre utilisateur peut choisir 08/04/2011 20:30.

    C’est un cauchemar complet pour un programmeur BAT.

    Changer le format dans un format ferme peut résoudre le problème, à condition de restaurer le format précédent avant de quitter le fichier BAT. Mais il peut être sujet à des conditions de course désagréables et à une récupération compliquée dans les fichiers BAT annulés.

    Heureusement, il y a 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 parsingr directement avec une commande FOR /F

    Donc, en assemblant les morceaux, essayez ceci comme sharepoint 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 ) 

    J’ai trouvé la meilleure solution pour moi, après avoir lu toutes vos réponses:

     set t=%date%_%time% set d=%t:~10,4%%t:~7,2%%t:~4,2%_%t:~15,2%%t:~18,2%%t:~21,2% echo hello>"Archive_%d%" 

    Si je reçois 20160915_ 150101 (avec un espace et une heure de 20160915_ 150101 ).

    Si PM je reçois 20160915_2150101 .

    Vous pouvez append des zéros à une variable (valeur jusqu’à 99) comme ceci dans le lot: IF 1%Var% LSS 100 SET Var=0%Var%

    Donc, vous devez parsingr vos composants de date et d’heure en différentes variables, les traiter tous comme cela, puis les concaténer pour créer le nom du fichier.

    Toutefois, votre méthode sous-jacente d’parsing de la date et de l’heure dépend des parameters régionaux du système. Si vous êtes heureux que votre code ne soit pas portable sur d’autres machines, c’est probablement bien, mais si vous vous attendez à ce qu’il fonctionne dans différents contextes internationaux, vous aurez besoin d’une approche différente, par exemple en lisant les parameters 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 ya un zéro non significatif sur les temps, mais pas les dates pour autant que je sache).

     @For /F "tokens=1,2,3,4 delims=/ " %%A in ('Date /t') do @( Set DayW=%%A Set Day=%%B Set Month=%%C Set Year=%%D Set All=%%D%%B%%C ) "C:\Windows\CWBZIP.EXE" "c:\transfer\ziptest%All%.zip" "C:\transfer\MB5L.txt" 

    Cela prend MB5L.txt et le compresse en ziptest20120204.zip s’il est exécuté le 4 février 2012

    Votre question semble être résolue, mais …

    Je ne sais pas si vous prenez la bonne solution pour votre problème.
    Je suppose que vous essayez de compresser chaque jour le code du projet.

    C’est possible avec ZIP et 1980, c’était une bonne solution, mais aujourd’hui vous devriez utiliser un système de repository, comme Subversion ou Git ou …, mais pas de fichier zip.

    Ok, peut-être que ça pourrait être que je me trompe.

    De la réponse ci-dessus, j’ai créé une fonction prête à l’emploi.

    Validé avec les parameters locaux français.

     :::::::: PROGRAM :::::::::: call:genname "my file 1.txt" echo "%newname%" call:genname "my file 2.doc" echo "%newname%" echo.&pause&goto:eof :::::::: FUNCTIONS ::::::::: :genname set d1=%date:~-4,4% set d2=%date:~-10,2% set d3=%date:~-7,2% set t1=%time:~0,2% ::if "%t1:~0,1%" equ " " set t1=0%t1:~1,1% set t1=%t1: =0% set t2=%time:~3,2% set t3=%time:~6,2% set filename=%~1 set newname=%d1%%d2%%d3%_%t1%%t2%%t3%-%filename% goto:eof 

    Je me rends compte que c’est une question théorique pour l’OP, mais je me suis contenté de préparer ceci, et je suis un peu fier de moi d’avoir pensé en dehors de la boîte.

    Téléchargez gawk pour Windows à l’ adresse http://gnuwin32.sourceforge.net/packages/gawk.htm …. Alors, il n’y a qu’une seule ligne, sans toute la syntaxe de lot DOS, où il faut six boucles FOR pour séparer les chaînes (WTF “C’est vraiment vraiment MAUVAIS MAD AND SAD! … IMHO bien sûr)

    Si vous connaissez déjà C, C ++, Perl ou Ruby, alors choisir AWK (qui hérite des deux précédentes et consortingbue de manière significative aux deux dernières) fait partie du jeu proverbial CAKE !!!

    La commande DOS Batch:

     echo %DATE% %TIME% && echo %DATE% %TIME% | gawk -F"[ /:.]" "{printf(""""%s%02d%02d-%02d%02d%02d\n"""", $4, $3, $2, $5, $6, $7);}" 

    Impressions:

     Tue 04/09/2012 10:40:38.25 20120904-104038 

    Maintenant, ce n’est pas tout à fait l’histoire complète … Je vais juste être paresseux et coder en dur le rest de mon nom de fichier log dans l’instruction printf, parce que c’est simple … Mais si quelqu’un sait comment définir un % NOW% variable à la sortie d’AWK (en remplissant les entrailles d’une fonction “générique” maintenant), je suis tout ouïe.


    MODIFIER:

    Une recherche rapide sur le débordement de stack a rempli cette dernière pièce du puzzle, Équivalent de traitement par lots des backticks de Bash .

    Donc, ces trois lignes de lot DOS:

     echo %DATE% %TIME% | awk -F"[ /:.]" "{printf(""""%s%02d%02d-%02d%02d%02d\n"""", $4, $3, $2, $5, $6, $7);}" >%temp%\now.txt set /p now=<%temp%\now.txt echo %now% 

    Produire:

     20120904-114434 

    Je peux donc maintenant inclure une date / heure dans le nom du fichier journal généré par mon script d’installation SQL Server (2005+):

     sqlcmd -S .\SQLEXPRESS -d MyDb -e -i MyTSqlCommands.sql >MyTSqlCommands.sql.%now%.log 

    Et je suis à nouveau un campeur heureux (sauf que la vie était encore beaucoup plus facile sur Unix).

    Un espace est légal dans les noms de fichiers. Si vous placez votre chemin et nom de fichier entre guillemets, il se peut qu’il vole simplement. Voici ce que j’utilise dans un fichier de commandes:

     svnadmin hotcopy "C:\SourcePath\Folder" "f:\DestPath\Folder%filename%" 

    Peu importe qu’il y ait des espaces dans% filename%.