02/07/2024

Get-Date : manipuler la date et l’heure en PowerShell

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".


livre pour apprendre PowerShell
author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.