Comment obtenir la date dans un fichier batch dans un format prévisible?

17

Dans un fichier batch, j'ai besoin d'extraire un mois, un jour, une année de la commande date. J'ai donc utilisé ce qui suit, qui analyse essentiellement la commande Date pour extraire ses sous-chaînes dans une variable:

set Day=%Date:~3,2%
set Mth=%Date:~0,2%
set Yr=%Date:~6,4%

Tout cela est parfait, mais si je déploie ce fichier de commandes sur une machine avec des paramètres régionaux / nationaux différents, il échoue car le mois, le jour et l'année sont à des emplacements différents.

Comment extraire le mois, le jour et l'année quel que soit le format de date?

AngryHacker
la source
1
Êtes-vous absolument limité à Batch? Une telle chose est beaucoup plus simple dans VBScript / WSH et / ou PowerShell ...
Adrien
@Adrien, Oui limité au lot - cela fait partie de l'étape de post-construction du VS2008.
AngryHacker
remplacement de% date% par% date: ~ 6,4% -% date: ~ 3,2% -% date: ~ 0,2% travaillé
MagTun

Réponses:

14

Source: http://ss64.com/nt/syntax-getdate.html

Méthode 2 (cmd unique)

GetDate.cmd

@Echo off
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

:: Use WMIC to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
   IF "%%~L"=="" goto s_done
      Set _yyyy=%%L
      Set _mm=00%%J
      Set _dd=00%%G
      Set _hour=00%%H
      SET _minute=00%%I
)
:s_done

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%

:: Display the date/time in ISO 8601 format:
Set _isodate=%_yyyy%-%_mm%-%_dd% %_hour%:%_minute%
Echo %_isodate%
pause

entrez la description de l'image ici


Méthode 1 (cmd + vb)

GetDate.cmd

@Echo off
For /f %%G in ('cscript /nologo getdate.vbs') do set _dtm=%%G
Set _yyyy=%_dtm:~0,4%
Set _mm=%_dtm:~4,2%
Set _dd=%_dtm:~6,2%
Set _hh=%_dtm:~8,2%
Set _nn=%_dtm:~10,2%
Echo %_yyyy%-%_mm%-%_dd%T%_hh%:%_nn%

getdate.vbs

Dim dt
dt=now
'output format: yyyymmddHHnn
wscript.echo ((year(dt)*100 + month(dt))*100 + day(dt))*10000 + hour(dt)*100 + minute(dt)
Tex Hex
la source
1
Ah ha, façon très soignée de trouver l'ordre des dates des paramètres régionaux. ss64 a une communauté astucieuse d'utilisateurs cmd.exe.
Nicholi
J'ai inclus les deux scripts de votre lien source. J'espère que ça va pour vous
nixda
@nixda Aucun problème, quoi que l'aide de l'utilisateur.
Tex Hex
Si vous devez conserver les secondes de la "Méthode 2" ci-dessus, ajoutez-les Set _second=00%%Klors de l'extraction wmicet remplissez-les avec des zéros non significatifs comme les autres.
Tim Parenti
12

Windows XP et versions ultérieures

getDate.cmd

@echo off
for /f "tokens=2 delims==" %%G in ('wmic os get localdatetime /value') do set datetime=%%G

set year=%datetime:~0,4%
set month=%datetime:~4,2%
set day=%datetime:~6,2%

echo %year%/%month%/%day%

Production

entrez la description de l'image ici

et31415
la source
+1 pour la réponse la plus concise. Je suggérerais également de terminer par ECHO %year%-%month%-%day%quel format est compatible ISO et système de fichiers (sans parler des tri automatiques par année-mois-jour). :-).
Zephan Schroeder
3

Je sais que ce n'est pas exactement ce que vous avez demandé, mais j'utilise le port Windows de l' dateapplication Linux à partir d'une commande dans le fichier de commandes, puis j'affecte le résultat à une variable.

Je n'ai pas encore trouvé de moyen d'obtenir la date de manière fiable en utilisant uniquement des commandes batch.

Hydaral
la source
2

Utilisez ce fichier de commandes pour le format AAAA-MM-JJ. Il utilise l'outil d'instrumentation de fenêtre qui devrait être présent dans toutes les versions récentes de Windows pour obtenir une chaîne datetime indépendante des paramètres régionaux.

Enregistrez dans un fichier batch dans le chemin (par exemple) c: \ windows \ rdate.bat puis accédez avec un CALL RDATE.BAT pour définir la ou les variables. Alternativement, copiez le code dans votre fichier de commandes.

Ce format de date convient aux noms de fichiers et à la journalisation. Il trie correctement. La variable logtime ajoute une variable date + heure sous la forme AAAA-MM-JJ-HHMMSS pouvant être utilisée pour la journalisation de l'activité des fichiers de commandes avec une seconde précision.

Ajustez les formats de date (et d'heure) comme vous le souhaitez. REM les échos de l'écran en production. Les deux nombres dans chaque sélection de texte sont l'index de caractère de départ à base zéro et le nombre de caractères à copier, par exemple,% datetime: ~ 0,4% prend une sous-chaîne de 4 caractères commençant à la position 0.

echo off
rem First, get the locality-invariant datetime
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
rem echo %datetime%

rem Build the reverse date string YYYY-MM-DD
set rdate=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2%
echo rdate=%rdate%

rem Built a datetime string YYYY-MM-DD-hhmmss
set logtime=%rdate%-%datetime:~8,6% 
echo logtime=%logtime%
Jim Birch
la source
1
Presque la même chose que la réponse de and31415 . Les deux scripts utilisentwmic os get localdatetime
nixda
0

Avez-vous essayé d'utiliser NET TIME \\%ComputerName%au lieu de DATE? Je pense que cela NET TIMEest censé fournir les données dans un format cohérent indépendamment des paramètres régionaux.

Église
la source
Non, ce n'est pas le cas.
AngryHacker
Intéressant, je viens de l'essayer, en basculant entre les formats AU et US, et net timetoujours en sortie au format m / j / aaaa. @AngryHacker, avec quels paramètres cela n'a-t-il pas fonctionné pour vous?
Hydaral
1
J'ai changé de français (belge) et cela m'a donné le 27/07/2011. Les États-Unis donnent 27/07/2011
AngryHacker
0

Grâce au post de Shekhar, cela fonctionne selon les besoins et sans remplissage du temps.

@Echo Off

for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%%date:~4,2%%date:~7,2%-%%d%%e

set datetimestr=%var: =0%

set logfile=LogFile-%datetimestr%.txt

echo %logfile%

Sortie: LogFile-20151113-0901.txt

Trifused
la source
-1

Cela peut être quelque peu hors sujet, mais voici un fichier .bat que j'ai écrit pour mes propres sauvegardes planifiées et que j'appelle également à partir d'actions de post-construction dans Visual Studio. J'espère que certains le trouveront utile.

Enregistrez les éléments suivants dans un fichier .bat

--------------------------------------------------
**:: The following is Copyright © 2012 ShopNetNuke Corp.  All rights reserved.
::  and released under the GNU General Public License (GPLv3)**

:: The following section retrieves the current date and time and formats it into the '%var%' variable
:: This format always ensures that the Date and Time are fixed length to avoid the situation of
:: having a value of '12/ 1/2012 rather than '12/01/2012'
echo off
for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
set var=%var: =0%
echo Beginning my valuable Backup Set:  Backup--%var%

:: If you wanted to request the user input a filename prefix, 
:: then we would use something similar to this
:: set /p nameprefix= Enter the file name prefix?
:: Get the Current Date and Time
::for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
:: set var=%var: =0%
:: echo Beginning my valuable Backup Set:  Backup--%var%_%nameprefix%

Pause

echo Starting SQL Server Database Backup Job...
:: The following line initiates the Backup job within SqlServer Agent.
:: Change 'MyBackupNameInSqlAgent' to the name of the job you want executed
:: Change the directory paths to those relevant to your current system installation directories
:: SqlAgent will not return a value if the backup action succeed, 
:: however, in the event an error is encountered, it will be echoed onto the screen
"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe" -S SQLSERVERNAME\INSTANCENAME -Q "execute msdb.dbo.sp_start_job @job_name = 'MyBackupNameInSqlAgent'"
:: An error will be returned if the Backup job is not found or has already been triggered by another process

echo Starting My Valuable Source Code Directory Backup...

echo ...backing up files and folders in "C:\Source\MyPreciousProjectDirectory\"...
:: The following line will execute the 7zip command to create a .7z file of the directory named in 'MyPreciousProjectDirectory'
:: and tells it to put the archive in the 'MyPreciousBackupDirectory'.  The compression level will be defined by the 7zip default settings
:: The -p flag tells 7zip to password protect the archive, in this case, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectory\%var%\MyPreciousProject--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 

echo Source Code Directory Backups complete.

echo Archiving Database Backups now...
:: The following line will execute the 7zip command to archive the Database backup.
:: The '*' could be replaced by the actual backup name.
:: The '*' indicates all files of type '.bak'
:: The -p flag tells 7zip to password protect the archive, in this case, again, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z  C:\MyPreciousBackupDirectory\%var%\MyPreciousProject-Database-%var%.7z -p%var% -mhe "C:\Program Files\Microsoft SQL Server\MSSQL10.SQLDEV08\MSSQL\Backup\*.bak"

echo Database Backup Archival process complete.

:: If you wanted to place both the previous backups into one single combination archive,
:: you could do something like the following
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var%\MyPreciousProjectBackupSourceAndDatabase--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 


echo Now attempting to copy archives to Network Server...
:: The following line will use xcopy to copy the arechives to the server backup directory and place them in a directory named by the DateTime variable %var%
xcopy /S /I /J /Y C:\MyPreciousBackupDirectory\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%
:: Or if the combination above was used then copy that...
xcopy /S /I /J /Y C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%


echo 7z Archive files transferred to MyPreciousBackupServerName successfully
echo  ||
echo \||/
echo  \/
echo ---------------------------------------------------
echo ----- BACKUP SET "%var%" COMPLETE ------
echo ---------------------------------------------------
pause
JC
la source
1
tl; dr, vous pouvez ajouter une explication de ce que fait le script. car il ne se présente pas tout de suite comme une solution. Il pourrait également être plus utile, si vous pouvez supprimer les bits de code non pertinents
Shekhar
1
L'ensemble du script de commandes s'appuie sur les variables %date%et %time%, qui sont sensibles aux paramètres régionaux et ne peuvent pas vraiment être analysées de manière prévisible comme l'OP l'a demandé.
and31415