Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! Découvrez la Bibliothèque Numérique ENI. Cliquez ici

La gestion des dates

Introduction

Lors de l’écriture de scripts PowerShell, il se peut parfois que nous ayons besoin d’utiliser des dates pour :

  • l’écriture de logs pour indiquer ce que fait votre script, à quelle date et à quelle heure.

  • vérifier la date d’un élément, convertir une date en un élément compréhensible ou alors comparer deux dates afin d’établir un intervalle, puis exécuter un bloc d’instructions précises si cet intervalle est supérieur ou inférieur à une valeur numérique donnée.

Cmdlet Get-Date

PowerShell offre une cmdlet très complète pour manipuler les dates. Cette cmdlet se nomme Get-Date et permet d’obtenir la date et heure actuelle. Le résultat retourné est un objet au format DateTime : System.DateTime.

Vous pouvez le remarquer en utilisant la méthode GetType.

(get-date).gettype() 

Ci-dessous le résultat :

images/29RI01.png

1. Vérifier l’aide

Nous allons vérifier comment fonctionne cette cmdlet.

Il s’agit d’une bonne pratique à utiliser lors de l’utilisation d’une nouvelle cmdlet afin d’en comprendre son fonctionnement.

Nous utiliserons pour cela la cmdlet Get-Help puis le nom de la cmdlet à analyser, ici Get-Date.

Get-Help Get-Date 

Ci-dessous le retour :

PS C:\Users\damien.vanrobaeys> Get-Help Get-Date 
NAME 
    Get-Date 
 
SYNOPSIS 
    Gets the current date and time. 
 
 
SYNTAX 
    Get-Date [[-Date] <System.DateTime>] [-Day <System.Int32>]  
[-DisplayHint {Date | Time | DateTime}] [-Format <System.String>] 
[-Hour <System.Int32>] [-Millisecond <System.Int32>] 
    [-Minute <System.Int32>] [-Month <System.Int32>] [-Second  
<System.Int32>] [-Year <System.Int32>] [<CommonParameters>] 
 
    Get-Date [[-Date] <System.DateTime>] [-Day <System.Int32>]  
[-DisplayHint {Date | Time | DateTime}] [-Hour <System.Int32>]  
[-Millisecond <System.Int32>] [-Minute <System.Int32>] 
    [-Month <System.Int32>] [-Second <System.Int32>] [-UFormat  
<System.String>] [-Year <System.Int32>] [<CommonParameters>] 
 
 
DESCRIPTION 
    The `Get-Date` cmdlet...

Formatage des dates

Choisir le bon format pour une date peut être intéressant pour étoffer vos scripts et plus particulièrement lors de la création de fichiers de log.

Différents formats de date existent, par exemple :

  • 09/27/2022

  • 27/09/2022

  • Mardi 27 septembre 2022

  • Mardi 27 septembre 2022, 21:30

Le formatage de la date au travers de la cmdlet Get-Date peut s’effectuer facilement en utilisant le paramètre -Format suivi du formatage souhaité.

Get-Date -Format "Formatage souhaité" 

1. Formatage simple

Vous trouverez ci-dessous une liste des formats standards disponibles avec un exemple parlant.

Format

Description

Exemple

d

Date courte

27/09/2022

D

Date longue

Mardi, Septembre 27, 2022

f

Date longue et heure courte

Mardi, Septembre 27, 2022 20:51

F

Date et heure longues

Mardi, Septembre 27, 2022 20:51:49

g

Date et heure courtes

9/27/2022 8:52 PM

G

Date courte et heure longue

9/27/2022 8:52:34 PM

M, m

Mois et jour

September 27

s

Date et heure triée

2022-09-27T20:53:07

t

Heure abrégée

8:53 PM

T

Heure complète

8:53:26 PM

u

Date et heure universelle

2022-09-27 20:53:35Z

U

Date complète 

Tuesday, September 27, 2022 6:53:47 PM

Y, y

Année et mois

September 2022

Davantage d’informations sont disponibles sur le site Learn Microsoft, lien ci-dessous : https://learn.microsoft.com/fr-fr/dotnet/standard/base-types/standard-date-and-time-format-strings?redirectedfrom=MSDN

2. Formatage personnalisé

Vous trouverez ci-dessous une liste des formats personnalisés disponibles avec un exemple parlant.

Format

Description

Exemple

d

Jour du mois, de 1 à 31

9/27/2022

dd

Jour du mois, de 01 à 31

27

ddd

Jour de la semaine version abrégée

Tue

dddd

Nom complet du jour de la semaine

Tuesday

f

 

Tuesday, September 27, 2022 9:09 PM

ff

Centièmes de seconde dans une valeur de date et d’heure

18

fff

Millisecondes...

Conversion de dates

1. Convertir une chaîne de caractères en date

Prenons la chaîne de caractères suivante : 27/09/2022.

Ce texte aura donc comme type String.

images/29RI11.png

Nous pouvons, par exemple, imaginer une date saisie par un utilisateur. Cette date au format string n’est donc pas facilement exploitable, il faudra alors la convertir au format DateTime.

Nous utiliserons pour cela la classe DateTime et la méthode ParseExact.

[Datetime]::ParseExact(Date, Format, $null) 

Dans notre exemple, la date est 27/09/2022, le format est donc dd/MM/yyyy.

Ci-dessous la conversion de la date à l’aide de la classe DateTime :

[Datetime]::ParseExact('27/09/2022', 'yy/MM/yyyy', $null) 

Ci-dessous le résultat :

images/29RI12.png

Si la date est 09/27/2022, le format sera dd/MM/yyyy et le code :

[Datetime]::ParseExact('09/27/2022', 'yy/MM/yyyy', $null) 

Cela peut également s’écrire :

[System.Datetime]::ParseExact('09/27/2022', 'MM/dd/yyyy', $null) 

Ci-dessous le résultat :

images/29RI13.png

Nous pouvons également utiliser la classe DateTime sans la méthode ParseExact, comme ci-dessous :

[DateTime]"Date" 

ou :

$Date="Date" 
[DateTime]$Date 

Ci-dessous avec notre date du 27 septembre 2022 :

[DateTime]"9/27/2022" 

Ci-dessous le résultat :

images/29RI14.png

2. Convertir une date en chaîne de caractères

Nous allons effectuer l’inverse que précédemment. Nous avons une date de type DateTime que nous souhaitons convertir en une chaîne de caractères. Nous allons tout d’abord récupérer la date avec la cmdlet Get-Date.

Pour convertir la date en chaîne de caractères, nous utiliserons la méthode ToString.

(get-date).ToString("dd/MM/yyyy HH:mm:ss") 

3. Conversion de dates depuis le registre ou WMI

Dans la base de registre...

Comparaison de dates

1. Calcul d’intervalle entre deux dates

  • Prenons une date A : 27 septembre 2022

  • Prenons une date B : 09 mars 2020

Convertissons ces deux dates en DateTime avec la méthode ParseExact.

$Date_A = [Datetime]::ParseExact('27/09/2022', 'dd/MM/yyyy', $null) 
$Date_B = [Datetime]::ParseExact('09/03/2020', 'dd/MM/yyyy', $null) 

Nous souhaitons maintenant comparer les deux dates en affichant le nombre de jours, heures, etc. d’intervalle. Pour cela, rien de plus simple, une soustraction :

$Date_A - $Date_B 

Ci-dessous le résultat retourné :

PS C:\Users\damien.vanrobaeys> $Date_A - $Date_B 
Days: 932 
Hours: 0 
Minutes: 0 
Seconds: 0 
Milliseconds: 0 
Ticks: 805248000000000 
TotalDays: 932 
TotalHours: 22368 
TotalMinutes: 1342080 
TotalSeconds: 80524800 
TotalMilliseconds : 80524800000 

Le résultat nous donne donc :

  • le nombre total de jours entre les deux dates : 932 jours

  • les heures en plus des jours : 0 heure

  • les secondes en plus des jours : 0 minute

  • le nombre total d’heures entre les deux dates : 22368 heures

  • le nombre total de minutes entre les deux dates : 1342080 minutes

  • le nombre total de secondes entre les deux dates : 80524800000 secondes

Pour récupérer le nombre de jours seulement, il suffira d’ajouter le calcul dans une variable puis de récupérer la propriété Days.

$Diff = $Date_A - $Date_B 
$Diff.days 

Ci-dessous le retour :

images/29RI24.png

Cela peut nous être utile dans de nombreux cas et scripts :

  • Comparer la date actuelle (date A) avec celle de la dernière mise à jour du BIOS disponible (date B). Si la date A est supérieure à la date B, alors on affiche un message à l’utilisateur pour l’inviter à mettre...