Comment puis-je obtenir le mois et l'année de la journée en cours à l'intérieur d'un script cmd Windows? Je dois obtenir chaque valeur dans une variable distincte.
Une variante de script qui fonctionne indépendamment de la localisation. Mettez-le dans un fichier texte avec l'extension .cmd et lancez.
::: Begin set date
for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (call :set_date %%i %%j %%k %%l)
goto :end_set_date
:set_date
if "%1:~0,1%" gtr "9" shift
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo,^|date') do (set %%m=%1&set %%n=%2&set %%o=%3)
goto :eof
:end_set_date
::: End set date
echo day in 'DD' format is %dd%; month in 'MM' format is %mm%; year in 'YYYY' format is %yy%
Les variables% jj%,% mm% et% yy% conservent respectivement le jour (format 'JJ'), le mois (format 'MM') et l'année (format 'YYYY').
Pour obtenir l'année, le mois et le jour, vous pouvez utiliser la variable d'environnement %date%
et l'opérateur :~
. %date%
devient quelque chose comme Thu 08/12/2010 et :~
vous permet de choisir des caractères spécifiques dans une variable:
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set filename=%year%_%month%_%day%
Utilisez %time%
de manière similaire pour obtenir ce dont vous avez besoin à partir de l’heure actuelle.
set /?
vous donnera plus d'informations sur l'utilisation d'opérateurs spéciaux avec des variables.
Le code de lot suivant renvoie les composants de la date actuelle de manière indépendante des paramètres régionaux et stocke les jours, mois et années dans les variables CurrDay
, CurrMonth
et CurrYear
, respectivement:
for /F "skip=1 delims=" %%F in ('
wmic PATH Win32_LocalTime GET Day^,Month^,Year /FORMAT:TABLE
') do (
for /F "tokens=1-3" %%L in ("%%F") do (
set CurrDay=0%%L
set CurrMonth=0%%M
set CurrYear=%%N
)
)
set CurrDay=%CurrDay:~-2%
set CurrMonth=%CurrMonth:~-2%
echo Current day : %CurrDay%
echo Current month: %CurrMonth%
echo Current year :%CurrYear%
Deux boucles for /F
imbriquées permettent de contourner un problème lié à la commande wmic
, dont la sortie est au format unicode; L'utilisation d'une boucle unique génère des caractères de retour chariot supplémentaires, ce qui a un impact sur le développement correct des variables.
Etant donné que le jour et le mois peuvent également consister en un seul chiffre, j'ai ajouté un 0
en tête dans la construction de la boucle. Ensuite, les valeurs sont ajustées pour toujours être composées de deux chiffres.
echo %Date:~7,2% gets current day
7 est la position de départ 2 nombre de chiffres à afficher
echo %Date:~7,2% gets current day
echo %Date:~4,2% gets current month
echo %Date:~10,4% gets current year
INDEPENDANCE LINGUISTIQUE:
La solution Andrei Coscodan étant dépendante de la langue, une solution consiste à réserver toutes les balises pour chaque champ: année, mois et jour dans les langues cibles. Considérons le portugais et l'anglais. Après l'analyse, effectuez une dernière série comme suit:
set Year=%yy%%aa%
set Month=%mm%
set Day=%dd%
Cherchez le réglage de l'année, j'ai utilisé les deux balises anglais et portugais, cela a fonctionné pour moi au Brésil, où nous avons ces deux langues comme étant les plus courantes dans les instalations Windows. J'espère que cela fonctionnera également pour certaines langues d'origine latine, telles que le français, l'espagnol, etc.
Eh bien, le script complet pourrait être:
@echo off
setlocal enabledelayedexpansion
:: Extract date fields - language dependent
for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (
set v1=%%i& set v2=%%j& set v3=%%k
if "%%i:~0,1%%" gtr "9" (set v1=%%j& set v2=%%k& set v3=%%l)
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo.^|date') do (
set %%m=!v1!& set %%n=!v2!& set %%o=!v3!
)
)
:: Final set for language independency (English and Portuguese - maybe works for Spanish and French)
set year=%yy%%aa%
set month=%mm%
set day=%dd%
:: Testing
echo Year:[%year%] - month:[%month%] - day:[%day%]
endlocal
pause
J'espère que cela aidera quelqu'un qui traite différentes langues.
Le seul moyen fiable que je connaisse est d'utiliser VBScript pour effectuer le travail pénible pour vous. Il n’existe aucun moyen portable d’obtenir la date du jour dans un format utilisable avec un seul fichier de commandes. Le fichier VBScript suivant
Wscript.Echo("set Year=" & DatePart("yyyy", Date))
Wscript.Echo("set Month=" & DatePart("m", Date))
Wscript.Echo("set Day=" & DatePart("d", Date))
et cet extrait de lot
for /f "delims=" %%x in ('cscript /nologo date.vbs') do %%x
echo %Year%-%Month%-%Day%
devrait fonctionner, cependant.
Bien que vous puissiez obtenir la date actuelle dans un fichier de commandes avec date /t
ou la pseudo-variable %date%
, les deux suivent les paramètres régionaux en cours dans ce qu’ils affichent. Cela signifie que vous obtenez la date au format potentiellement any et que vous n’avez aucun moyen de l’analyser.
Cette variante fonctionne pour toutes les localisations:
@echo off
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
if "%%B" NEQ "" (
SET /A FDATE=%%F*10000+%%D*100+%%A
)
)
@echo on
echo date=%FDATE%
echo year=%FDATE:~2,2%
echo month=%FDATE:~4,2%
Je pense que la réponse de Andrei Coscodan est la meilleure quand on ne peut pas faire beaucoup d’hypothèses. Mais parfois, avoir un une ligne est agréable si vous pouvez faire certaines hypothèses. Cette solution suppose que 'date\t' renverra l’un des deux formats. Sous Windows XP, "date/t" renvoie "11/23/2011", mais sous Windows7, il renvoie "mercredi 11/23/2011".
FOR /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set mm=%%a&set dd=%%b&set yyyy=%%c& (if "%%a:~0,1" gtr "9" set mm=%%b&setdd=%%c&set yyyy=%%d))
:: Test results
echo day in 'DD' format is '%dd%'; month in 'MM' format is '%mm%'; year in 'YYYY' format is '%yyyy%'
Merci à Andrei Consodan de m'aider avec cette solution sur une ligne.
Extrait jour, mois et année
La fonction la plus votée et la fonction acceptée NE fonctionnent PAS indépendamment des paramètres régionaux, car la commande DATE est également soumise à la localisation. Par exemple (celui accepté): En anglais vous avez AAAA pour l'année et en Hollande c'est JJJJ. Donc, c'est un non-aller. Le script suivant extrait la localisation des utilisateurs du registre, qui est indépendant de la localisation.
@echo off
::: Begin set date
setlocal EnableExtensions EnableDelayedExpansion
:: Determine short date format (independent from localization) from registry
for /f "skip=1 tokens=3-5 delims=- " %%L in ( '2^>nul reg query "HKCU\Control Panel\International" /v "sShortDate"' ) do (
:: Since we can have multiple (short) date formats we only use the first char from the format in a new variable
set "_L=%%L" && set "_L=!_L:~0,1!" && set "_M=%%M" && set "_M=!_M:~0,1!" && set "_N=%%N" && set "_N=!_N:~0,1!"
:: Now assign the date values to the new vars
for /f "tokens=2-4 delims=/-. " %%D in ( "%date%" ) do ( set "!_L!=%%D" && set "!_M!=%%E" && set "!_N!=%%F" )
)
:: Print the values as is
echo.
echo This is the original date string --^> %date%
echo These are the splitted values --^> Day: %d%, Month:%m%, Year: %y%.
echo.
endlocal
Extrait seulement l'année
Pour un script que j'ai écrit, je voulais seulement extraire l'année (indépendant de la localisation), alors j'ai conçu ce film, je n'ai trouvé aucune solution. Il utilise la variable 'DATE', plusieurs délimiteurs et recherche un nombre supérieur à 31. Ce sera alors l'année en cours. Il y a peu de ressources contrairement à d'autres solutions.
@echo off
setlocal EnableExtensions
for /f " tokens=2-4 delims=-./ " %%D in ( "%date%" ) do ( if %%D gtr 31 ( set "_YEAR=%%D" ) else ( if %%E gtr 31 ( set "_YEAR=%%E" ) else ( if %%F gtr 31 ( set "_YEAR=%%F" ) ) ) )
echo And the year is... %_YEAR%.
echo.
endlocal
powershell Set-Date -Da (Get-Date -Y 1980 -Mon 11 -Day 17)