Nous avons un travail par lots qui s'exécute tous les jours et copie un fichier dans un dossier de collecte. Je veux aussi prendre une copie de ce fichier et le déposer dans un dossier d’archive portant le nom du fichier
yyyy-MM-dd.log
Quelle est la façon la plus simple de procéder dans un travail par lots Windows?
Je cherche fondamentalement un équivalent de cette commande Unix:
cp source.log `date +%F`.log
CP source.log %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%.log
Mais cela dépend des paramètres régionaux. Je ne sais pas si %DATE%
est localisé ou dépend du format spécifié pour la date courte dans Windows.
Voici un moyen indépendant de la localisation pour extraire la date actuelle de this answer , mais cela dépend de WMIC
et FOR /F
:
FOR /F %%A IN ('WMIC OS GET LocalDateTime ^| FINDSTR \.') DO @SET B=%%A
CP source.log %B:~0,4%-%B:~4,2%-%B:~6,2%.log
Cela a fonctionné pour moi et était une solution sûre pour les noms de fichiers (bien qu'elle génère un format MM-jj-AAAA):
C:\ set SAVESTAMP=%DATE:/=-%@%TIME::=-%
C:\ set SAVESTAMP=%SAVESTAMP: =%
C:\ set SAVESTAMP=%SAVESTAMP:,=.%.jpg
C:\ echo %SAVESTAMP%
[email protected]
La première commande prend une DATE et remplace /
par -
, prend TIME, remplace :
par -
et les combine au format DATE @ TIME. La deuxième instruction set
supprime tous les espaces et la troisième set
remplace ,
par .
et ajoute l'extension .jpg
.
Le code ci-dessus est utilisé dans un petit script qui extrait les images d'une caméra de sécurité IP pour un traitement ultérieur:
:while
set SAVESTAMP=%DATE:/=-%@%TIME::=-%
set SAVESTAMP=%SAVESTAMP: =%
set SAVESTAMP=%SAVESTAMP:,=.%.jpg
wget-1.10.2.exe --tries=0 -O %SAVESTAMP% http://admin:<password>@<ip address>:<port>/snapshot.cgi
timeout 1
GOTO while
Pour Langue française (France) SEULEMENT , soyez prudent, car /
apparaît dans la date:
echo %DATE%
08/09/2013
Pour notre problème de fichier journal, voici ma proposition pour Langue française UNIQUEMENT :
SETLOCAL
set LOGFILE_DATE=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2%
set LOGFILE_TIME=%TIME:~0,2%.%TIME:~3,2%
set LOGFILE=log-%LOGFILE_DATE%-%LOGFILE_TIME%.txt
rem log-2014.05.19-22.18.txt
command > %LOGFILE%
Voici une solution indépendante des paramètres régionaux (copie dans un fichier nommé SetDateTimeComponents.cmd):
@echo off
REM This script taken from the following URL:
REM http://www.winnetmag.com/windowsscripting/article/articleid/9177/windowsscripting_9177.html
REM Create the date and time elements.
for /f "tokens=1-7 delims=:/-, " %%i in ('echo exit^|cmd /q /k"Prompt $d $t"') do (
for /f "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do (
set dow=%%i
set %%a=%%j
set %%b=%%k
set %%c=%%l
set hh=%%m
set min=%%n
set ss=%%o
)
)
REM Let's see the result.
echo %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss%
Je mets tous mes scripts .cmd dans le même dossier (% SCRIPTROOT%); tout script nécessitant des valeurs de date/heure appellera SetDateTimeComponents.cmd comme dans l'exemple suivant:
setlocal
@echo Initializing...
set SCRIPTROOT=%~dp0
set ERRLOG=C:\Oopsies.err
:: Log start time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : Start === >> %ERRLOG%
:: Perform some long running action and log errors to ERRLOG.
:: Log end time
call "%SCRIPTROOT%\SetDateTimeComponents.cmd" >nul
@echo === %dow% %yy%-%mm%-%dd% @ %hh%:%min%:%ss% : End === >> %ERRLOG%
Comme le montre l'exemple, vous pouvez appeler SetDateTimeComponents.cmd chaque fois que vous devez mettre à jour les valeurs de date/heure. Masquer le script d'analyse du temps dans son propre fichier SetDateTimeComponents.cmd est un bon moyen de masquer les détails laids et, plus important encore, d'éviter les fautes de frappe.
Cela garantira que la sortie est une valeur à 2 chiffres ... vous pouvez réorganiser la sortie à votre guise et tester en commentant la section de diagnostic. Prendre plaisir!
(J'ai emprunté beaucoup de cela à d'autres forums ...)
:: ------------------ Date and Time Modifier ------------------------
@echo off
setlocal
:: THIS CODE WILL DISPLAY A 2-DIGIT TIMESTAMP FOR USE IN APPENDING FILENAMES
:: CREATE VARIABLE %TIMESTAMP%
for /f "tokens=1-8 delims=.:/-, " %%i in ('echo exit^|cmd /q /k"Prompt $D $T"') do (
for /f "tokens=2-4 skip=1 delims=/-,()" %%a in ('echo.^|date') do (
set dow=%%i
set %%a=%%j
set %%b=%%k
set %%c=%%l
set hh=%%m
set min=%%n
set sec=%%o
set hsec=%%p
)
)
:: ensure that hour is always 2 digits
if %hh%==0 set hh=00
if %hh%==1 set hh=01
if %hh%==2 set hh=02
if %hh%==3 set hh=03
if %hh%==4 set hh=04
if %hh%==5 set hh=05
if %hh%==6 set hh=06
if %hh%==7 set hh=07
if %hh%==8 set hh=08
if %hh%==9 set hh=09
:: --------- TIME STAMP DIAGNOSTICS -------------------------
:: Un-comment these lines to test output
:: echo dayOfWeek = %dow%
:: echo year = %yy%
:: echo month = %mm%
:: echo day = %dd%
:: echo hour = %hh%
:: echo minute = %min%
:: echo second = %sec%
:: echo hundredthsSecond = %hsec%
:: echo.
:: echo Hello!
:: echo Today is %dow%, %mm%/%dd%.
:: echo.
:: echo.
:: echo.
:: echo.
:: pause
:: --------- END TIME STAMP DIAGNOSTICS ----------------------
:: assign timeStamp:
:: Add the date and time parameters as necessary - " yy-mm-dd-dow-min-sec-hsec "
endlocal & set timeStamp=%yy%%mm%%dd%_%hh%-%min%-%sec%
echo %timeStamp%
Je l'utilise fréquemment et mets tout dans une seule commande de copie. Les copies suivantes exemple.txt comme exemple_AAAAMMJJ_HHMMSS.txt et vous pouvez bien sûr le modifier pour l'adapter à votre format préféré. Les guillemets ne sont nécessaires que s'il y a des espaces dans la spécification de fichier. Si vous souhaitez réutiliser exactement la même date/horodatage, vous devez le stocker dans une variable.
copy "{path}\example.txt" "{path}\_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
Parce que l'idée de séparer %DATE%
et %TIME%
et de les réduire en purée semble fragile au mieux, voici une solution de rechange utilisant un stylet PowerShell:
for /f %i in ('powershell -c "get-date -format yyyy-MM-dd--HH-mm-ss"') do @set DATETIME=%i
set LOGFILE=my-script-%DATETIME%.txt
La référence pour get-date
est ici , avec les options de format pour les styles .NET et UNIX.
Créez un fichier avec la date actuelle comme nom de fichier (ex. 2008-11-08.dat)
echo hello > %date%.dat
Avec la date actuelle mais sans le "-" (ex. 20081108.dat)
echo hello > %date:-=%.dat
Je sais que ceci est un ancien post, mais il existe une réponse plus simple (bien que cela ne fonctionne peut-être que dans les versions les plus récentes de Windows). Utilisez simplement le paramètre/t pour les commandes DATE et TIME dos pour n’afficher que la date ou l’heure et non pour vous demander de le définir, comme ceci:
@echo off
echo Starting test batch file > testlog.txt
date /t >> testlog.txt
time /t >> testlog.txt
Vous pouvez simplement détecter le format local actuel et obtenir la date dans votre format, par exemple:
::for 30.10.2016 dd.MM.yyyy
if %date:~2,1%==. set d=%date:~-4%%date:~3,2%%date:~,2%
::for 10/30/2016 MM/dd/yyyy
if %date:~2,1%==/ set d=%date:~-4%%date:~,2%%date:~3,2%
::for 2016-10-30 yyyy-MM-dd
if %date:~4,1%==- set d=%date:~,4%%date:~5,2%%date:~-2%
::variable %d% have now value: 2016103 (yyyyMMdd)
set t=%time::=%
set t=%t:,=%
::variable %t% have now time without delimiters
cp source.log %d%_%t%.log
J'ai mis en place un petit programme en C pour imprimer l'horodatage actuel (respect de la locale, pas de mauvais caractères ...). Ensuite, j'utilise la commande FOR pour enregistrer le résultat dans une variable d'environnement:
:: Get the timestamp
for /f %%x in ('@timestamp') do set TIMESTAMP=%%x
:: Use it to generate a filename
for /r %%x in (.\processed\*) do move "%%~x" ".\archived\%%~nx-%TIMESTAMP%%%~xx"
Voici un lien:
Peut-être que cela peut aider:
echo off
@Prompt set date=$d$_ set time=$t$h$h$h
echo some log >> %date% %time%.log
exit
ou
echo off
set v=%date%.log
echo some log >> %v%
1) Vous pouvez télécharger GNU coreutils qui est livré avec la date GNU
2) vous pouvez utiliser VBScript , ce qui facilite la manipulation de la date sous Windows:
Set objFS = CreateObject("Scripting.FileSystemObject")
strFolder = "c:\test"
Set objFolder = objFS.GetFolder(strFolder)
current = Now
mth = Month(current)
d = Day(current)
yr = Year(current)
If Len(mth) <2 Then
mth="0"&mth
End If
If Len(d) < 2 Then
d = "0"&d
End If
timestamp=yr & "-" & mth &"-"& d
For Each strFile In objFolder.Files
strFileName = strFile.Name
If InStr(strFileName,"file_name_here") > 0 Then
BaseName = objFS.GetBaseName(strFileName)
Extension = objFS.GetExtensionName(strFileName)
NewName = BaseName & "-" & timestamp & "." & Extension
strFile.Name = NewName
End If
Next
Exécutez le script en tant que:
c:\test> cscript /nologo myscript.vbs
Je sais que ce fil est vieux, mais je veux juste ajouter ceci ici parce que cela m'a beaucoup aidé à essayer de comprendre tout cela et de le nettoyer. La bonne chose à ce sujet est que vous pouvez le mettre en boucle pour un fichier de commandes qui est toujours en cours d'exécution. Journal de disponibilité du serveur ou quelque chose du genre. C'est ce que je l'utilise de toute façon. J'espère que cela aidera quelqu'un un jour.
@setlocal enableextensions enabledelayedexpansion
@echo off
call :timestamp freshtime freshdate
echo %freshdate% - %freshtime% - Some data >> "%freshdate - Somelog.log"
:timestamp
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
set FreshTime=%hour%:%min%:%secs%
set year=%date:~-4%
set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
set day=%date:~7,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
set FreshDate=%month%.%day%.%year%
Pour les gros fichiers Zip à déployer, j'utilise un quart d'heure. Personne d'autre sur cette page ne l'avait mentionné auparavant, alors je vais mettre mon petit script ici:
set /a "quarter_hours=%time:~0,2%*4 + %time:~3,2% / 15"
set "Zip_file=release_%DATE:~-4%.%DATE:~4,2%.%DATE:~7,2%.%quarter_hours%.Zip"
Il n’a pas encore réglé le quart horaire des patins de minuit à 5 heures du matin, mais il permet tout de même d’avoir une sortie estampillée plusieurs fois par jour avec peu de collisions.
J'espère que cela pourra aider.
Cela fonctionne bien avec (mes) paramètres régionaux allemands, il devrait être possible de l'adapter à vos besoins ...
forfiles /p *PATH* /m *filepattern* /c "cmd /c ren @file
%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%_@file"