POWERSHELL : Calculer le nombre de caractères que comporte une chaîne – Extraire une partie de la chaîne

Logo PowerShell

Dans l’un de mes scripts Powershell j’ai rencontré le besoin de calculer le nombre de caractères que pouvait contenir les résultats d’un Get-ChildItem.

Le répertoire de recherche est : C:\temp\

Dans ce dossier j’ai des e-mails (.msg) d’extrait avec tous la même architecture de nommage : ANNEE_MOIS_JOUR_HEURE_MINUTE_SECONDE_OBJET_du_Message

(Ce sont des e-mails extrait d’outlook via la macro présentée dans l’article : Macro VBA Outlook pour Extraire les e-mails )

En regardant bien, la structure des noms des e-mails (ANNEE_MOIS_JOUR_HEURE_MINUTE_SECONDE_), on peut se rendre compte que cette chaîne se fera toujours sur 20 caractères (on commence à compter à partir du 0 et non du 1), et que seul le nombre de caractères que comporte l’objet des e-mails sera un chiffre variable.

Le code :


#On définis les variables
$chemin="C:\temp\"
$objet = 0
$nbrcaract = 0
$chaines = 0

#La variable $chaine liste les noms de tous les fichiers se trouvant dans C:\temp\ ayant l’extension ".msg" et supprime le chemin "C:\temp\" du résultat.
$chaines = @(Get-ChildItem $chemin -recurse -force | where {!$_.PsIsContainer}  | where {$_.extension -eq ".msg"} | foreach {$_ -replace '$chemin', ""})

#Vue que nous avons plusieurs fichiers dans ce dossier, nous allons donc créer une boucle
for ($i=0;$i -lt $chaines.Length;$i++)

{

#la variable nbrcaract ne contiendra uniquement le chiffre correspondant au nombre de caractères dans la chaîne
$nbrcaract = ($chaines[$i] | measure-object -character | select -expandproperty characters)
#Si toute fois, vous ne souhaitez calculer uniquement le nombre de caractère dans l'objet alors voici la commande :
#$nbrcaract = (($chaines[$i] | measure-object -character | select -expandproperty characters)-20)

#On affiche les résultats :

$nbrcaract

}

 

Maintenant si vous souhaitez récupérer toutes les valeurs : année, mois, jours, heure, minute, seconde, et objet en plus du nombre de caractères alors voici la marche à suivre :


#On définis les variables
$chemin="C:\temp\"
$objet = 0
$nbrcaract = 0
$chaines = 0

#La variable $chaine liste les noms de tous les fichiers se trouvant dans C:\temp\ ayant l’extension ".msg" et supprime le chemin "C:\temp\" du résultat.
$chaines = @(Get-ChildItem $chemin -recurse -force | where {!$_.PsIsContainer}  | where {$_.extension -eq ".msg"} | foreach {$_ -replace '$chemin', ""})

#Vue que nous avons plusieurs fichiers dans ce dossier, nous allons donc créer une boucle
for ($i=0;$i -lt $chaines.Length;$i++)

{
# La variable nbrcaract ne contiendra uniquement le chiffre correspondant au nombre de caractères dans la chaîne, moins le nombre de caractères que comporte la date :
# "ANNEE_MOIS_JOUR_HEURE_MINUTE_SECONDE_" = 20 caractères

$nbrcaract = (($chaines[$i] | measure-object -character | select -expandproperty characters)-20)

#On récupère l'année :
$annee = $chaines[$i].Substring(0,4)

#On récupère le mois :
$mois = $chaines[$i].Substring(5,2)

#On récupère le jour :
$jour = $chaines[$i].Substring(8,2)

#On récupère l'heure :
$heure = $chaines[$i].Substring(11,2)

#On récupère les minutes:
$minute = $chaines[$i].Substring(14,2)

#On récupère les secondes :
$seconde = $chaines[$i].Substring(17,2)

#On récupère l'objet
$objet = $chaines[$i].Substring(20,$nbrcaract)

#On affiche les résultats :

$nbrcaract

$annee

$mois

$jour

$heure

$minute

$seconde

$objet

}

 

Maintenant que vous avez une partie de la syntaxe vous pouvez l’adapter à vos besoins.

Enjoy 😉

Laissez un commentaire

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