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 😉