Get-Date : manipuler la date et l’heure en PowerShell
Sommaire
I. Présentation
PowerShell dispose d'un cmdlet natif pour récupérer la date et l'heure sur une machine : "Get-Date". Derrière ce nom de commande facile à retenir, se cache un outil indispensable pour nos scripts PowerShell et vous serez à vous en servir dans de nombreuses situations. En effet, vous pouvez l'utiliser pour écrire la date et l'heure dans un fichier journal (log) créé par votre script, mais aussi pour comparer la date actuelle avec la date d'un objet (date du dernier accès sur un fichier, date de création d'un utilisateur, etc.), ou encore effectuer des calculs sur les dates.
II. Formatage de la date et l'heure avec PowerShell
Tout d'abord, nous allons utiliser le cmdlet "Get-Date" pour formater la date et l'heure, selon différents formats. Commençons par exécuter cette commande sans aucun paramètre pour avoir une idée du format par défaut.
Get-Date
Le format de sortie par défaut est le suivant : mercredi 3 avril 2024 17:29:43
Avec le paramètre "-Format", nous allons pouvoir personnaliser le format de la sortie de cette commande grâce à l'utilisation d'un jeu de caractères ("m", "d", "y", "h", "s", "f") en minuscules ou majuscules (la casse est importante et affecte le résultat retourné).
Je vous propose ci-dessous quelques exemples :
- Obtenir la date sous la forme "AnnéeMoisJour" :
Get-Date -Format "yyyyMMdd" 20240403
En fait, "yyyy" permet d'obtenir l'année, tandis que "MM" permet d'obtenir le mois au format numérique et "dd" le jour au format numérique.
- Obtenir la date sous la forme "Jour/Mois/Année" :
Get-Date -Format "dd/MM/yyyy" 03/04/2024
- Obtenir l'heure actuelle, avec les minutes, sans les secondes :
Get-Date -Format "HH:mm" 17:32
Il ne faut pas confondre "mm" et "MM" car le premier sert à récupérer les minutes tandis que le second sert à récupérer le mois au format numérique.
- Obtenir le mois en toutes lettres :
Get-Date -Format "MMMM" avril
- Obtenir la date et l'heure séparées par un underscore sous la forme "AnnéeMoisJour_HeureMinute" :
Get-Date -Format "yyyyMMdd_HHmm" 20240403_1734
- Obtenir seulement l'heure avec les secondes :
Get-Date -DisplayHint Time 17:34:28
- Obtenir seulement la date (ici, dans son format par défaut) :
Get-Date -DisplayHint Date mercredi 3 avril 2024
Sachez que vous pouvez créer un fichier, un dossier, ou tout autre élément qui contiendra la date dans son nom. L'exemple suivant permettra de créer un fichier dans "C:\TEMP\" dont le nom sera constitué de la façon suivante : Log_Date_Heure.txt. Par exemple : Log_20240404_0812.txt. Nous pourrions aussi stocker cette information dans une variable et appeler la variable.
New-Item -Path "C:\TEMP\Log_$(Get-Date -Format 'yyyyMMdd_HHmm').txt" -ItemType File
Avec ces quelques exemples, vous devriez pouvoir trouver un format qui répond à vos besoins.
III. Définir une date statique
Pour récupérer de façon statique une date et la stocker dans une variable pour hériter du bon type ("DateTime"), nous pouvons directement exploiter les paramètres de la commande "Get-Date", comme ceci :
$DateHeureStatique = (Get-Date -Year 2024 -Month 04 -Day 03 -Hour 00 -Minute 00 -Second 00)
L'alternative consiste à utiliser cette syntaxe :
[datetime]$DateStatique = "04/03/2024"
Ceci permet de forcer le type "DateTime", sinon le texte considéré comme une chaine de caractères (string). Dans le cas présent, la valeur "04/03/2024" permet d'obtenir la date du 3 avril 2024 (attention à l'ordre du mois et du jour).
IV. Calculer une date
Dans un script, qui cible l'Active Directory par exemple, nous pouvons chercher à obtenir la liste des comptes utilisateurs non utilisés ces 90 derniers jours. Pour cela, il va falloir obtenir une variable dont la valeur sera la date d'il y a 90 jours, de façon glissante puisque cette date va changer tous les jours.
Pour calculer une date, nous allons utiliser la méthode "AddDays()" qui s'applique directement à "Get-Date" et qui attend un nombre comme valeur. Si le nombre est positif, le nombre de jours sera ajouté à la date du jour, s'il est négatif, il sera soustrait et la date calculée sera retournée.
Pour soustraire 90 jours à la date du jour, cela nous donne :
(Get-Date).AddDays(-90)
Par exemple :
Write-Output "Date du jour : $(Get-Date)" Write-Output "Date il y a 90 jours : $((Get-Date).AddDays(-90))" Write-Output "Date dans 90 jours : $((Get-Date).AddDays(90))"
Ce qui retourne :
Votre date de référence étant calculée, vous allez pouvoir comparer facilement cette date avec une autre ! Une condition dans votre script avec un opérateur de comparaison tel que "-lt" ou "-gt" sera très efficace pour savoir si une date est "plus grande" ou "plus petite" qu'une autre.
Note : Si vous avez besoin d'additionner ou soustraire des heures, des minutes ou des secondes, c'est possible ! Il suffit d'utiliser la méthode adaptée : AddHours(), AddMinutes(), AddSeconds() ou encore AddMonths() pour les mois.
V. Convertir la date en timestamp
L'horodatage (timestamp) est une valeur numérique qui a pour objectif de représenter la date et l'heure selon un format bien précis. Dans certains cas, vous pourriez avoir besoin de comparer deux timestamps, si vous avez un timestamp d'un côté et la date/heure dans un autre format de l'autre, ça pose un problème.
Il est alors nécessaire de convertir la chaîne "date - heure" en valeur timestamp. Pour y parvenir, nous allons utiliser la méthode "ToFileTime()" accessible directement en PowerShell.
Ce qui nous donne :
(Get-Date).ToFileTime() 133566335296961495
La valeur retournée est alors un horodatage. Pour l'humain, cette valeur est incompréhensible, mais pas pour la machine.
VI. Convertir une chaine de caractères en date
Nous allons reprendre un exemple partagé précédemment afin de voir qu'il est possible de convertir une chaîne de caractères (string) en date, c'est-à-dire au format "DateTime", à l'aide d'une méthode nommée "ParseExact()", et la classe .NET "DateTime".
$DateStatique = "04/03/2024"
Si nous consultons le type de cette variable, nous pouvons constater que c'est le type "string" qui lui est affecté. Ce qui ne correspond pas à nos attentes.
$DateStatique.GetType()
La méthode "ParseExact" de la classe "DateTime" attend trois valeurs : la date sous la forme d'un texte, le format de sortie souhaité, ainsi qu'un provider (nous utiliserons $null).
[DateTime]::ParseExact("<Date>","<Format>",$null)
Ainsi, pour que notre variable "$DateStatique" soit actualisée pour passer d'un type "String" à "DateTime", nous allons utiliser ceci :
$DateStatique = [DateTime]::ParseExact("$DateStatique","MM/dd/yyyy",$null)
Ici, nous indiquons le format "MM/dd/yyyy" car notre date est écrite sous la forme "Mois / Jour / Année", mais il faut bien entendu adapter selon le format de la chaine envoyée en entrée.
Nous obtenons le résultat attendu :
Nous pourrions aussi utiliser cette syntaxe :
$DateStatique = [DateTime]::ParseExact("04/03/2024","MM/dd/yyyy",$null)
VII. Récupérer d'autres informations liées au calendrier
Au-delà de la date et l'heure, la commande "Get-Date" peut vous permettre d'obtenir d'autres informations liées au calendrier directement, par exemple : comment savoir quel jour de l'année nous sommes ? PowerShell peut répondre à cette interrogation.
(Get-Date).DayOfYear 94
Nous pouvons obtenir d'autres informations, comme le numéro du mois en cours :
(Get-Date).Month 4
Il est aussi possible d'obtenir des détails sur le jour en cours : combien est-ce qu'il y a eu de secondes écoulées aujourd'hui, et même de millisecondes ? Via cette commande, c'est facile !
(Get-Date).TimeOfDay Days : 0 Hours : 18 Minutes : 0 Seconds : 42 Milliseconds : 264 Ticks : 648422642098 TotalDays : 0,750489169094907 TotalHours : 18,0117400582778 TotalMinutes : 1080,70440349667 TotalSeconds : 64842,2642098 TotalMilliseconds : 64842264,2098
VIII. Conclusion
Suite à la lecture de ce chapitre, vous disposez d'une bonne base pour manipuler la date et l'heure dans vos scripts PowerShell ! Pour aller plus loin, vous pouvez consulter l'aide de ce cmdlet et lister les propriétés et méthodes à l'aide de "Get-Member".