Question [Résolu] Get-Item: Caractères non conformes

Plus d'informations
il y a 13 ans 1 semaine #14252 par Giraud
Bonjour,
je viens vers vous car j'ai une erreur dans un script que j'essaye de faire et je ne trouve pas la solution.
Le script me sert à lister les fichiers PST configurés dans les profils outlook et cela en scrutant les bonnes clés dans le registre.
Je récupère bien le nom du profil, le nom des fichiers dans outlook et le chemin complet vers ces fichiers. L'affichage de ces valeurs ne pose aucun soucis.
Là où ça se corse, c'est quand je veux récupérer la taille des fichiers PST en utilisant le chemin complet récupéré dans le registre.
Get-Item me renvois deux erreurs :
Caractères non conformes dans le chemin d'accès.
Impossible de trouver le chemin d'accès.\"C:\......\" Le pire c'est que le chemin qu'il me donne est bon et le fichier existe bien ????

Voici mon code :

[code:1]$HKCU_PROFKEY = \"HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\"
$PROFILES_TAB = Get-ChildItem -Path Registry::$HKCU_PROFKEY
If ($PROFILES_TAB -ne $null) {
Foreach ($PROFILE in $PROFILES_TAB«») {
$PROFILENAME = $PROFILE.PSChildName
$PSTTABLE = Get-ChildItem -Path Registry::$PROFILE -Recurse | Where {($_ | Get-ItemProperty).\"001f6700\" -ne $NULL}
Foreach ($PST in $PSTTABLE) {
If ($PST -ne $NULL) {
$PSTNAME = [System.Text.Encoding]::Unicode.GetString(($PST | Get-ItemProperty).\"001f3001\"«»)
$PSTPATH = [System.Text.Encoding]::Unicode.GetString(($PST | Get-ItemProperty).\"001f6700\"«»)
$PSTFILE = Get-Item $PSTPATH
$PSTSIZE = $PSTFILE.length/1MB
}}}}[/code:1]

Merci d'avance pour toute aide apportée car je nage complet là !!!<br><br>Message édité par: Arnaud, à: 12/03/13 20:53

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 1 semaine #14259 par Arnaud Petitjean
Salut Gégé !

Et bé, un pas facile de trouver le \&quot;bug\&quot; dans ton script... Mais j'y suis tout de même parvenu... :P

Juste une question au passage: \&quot;Pourquoi n'as tu pas utilisé l'objet COM d'Outlook à la place ?\&quot;. L'objet COM Outlook est bien plus simple à manipuler que les clés de registres encodées en Unicode.

Tu avais ce script tout prêt dans la bibliothèque de scripts : Obtenir les fichiers PST connectés à Outlook

Ceci étant dit, voici ton script modifié qui marche:
[code:1]$HKCU_PROFKEY = \&quot;HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\&quot;
$PROFILES_TAB = Get-ChildItem -Path Registry::$HKCU_PROFKEY
If ($PROFILES_TAB -ne $null) {
Foreach ($PROFILE in $PROFILES_TAB«») {
$PROFILENAME = $PROFILE.PSChildName
$PSTTABLE = Get-ChildItem -Path Registry::$($PROFILE.Name) -Recurse | Where {($_ | Get-ItemProperty).\&quot;001f6700\&quot; -ne $NULL}
Foreach ($PST in $PSTTABLE) {
If ($PST -ne $NULL) {
$PSTNAME = [System.Text.Encoding]::Unicode.GetString(($PST | Get-ItemProperty).\&quot;001f3001\&quot;«»)
$PSTPATH = [System.Text.Encoding]::Unicode.GetString(($PST | Get-ItemProperty).\&quot;001f6700\&quot;«»)
$PSTFILE = Get-Item $PSTPATH.TrimEnd(0)
$PSTSIZE = $PSTFILE.length/1MB
new-object -TypeName PSObject -Property @{Name = $PSTFILE.Name; Length = $PSTSIZE}
}}}}[/code:1]

En fait, pour une raison que j'ignore mais c'est probablement normal, dans ta variable $PSTPATH il y avait un caractère de trop à la fin (code 0). C'est probablement le caractère de fin d'une chaîne Unicode. Du coup en le virant avant la méthode TrimEnd() ça fonctionne !!! :woohoo:

N'hésite pas à poster ton script lorsqu'il sera fini car je vais moi aussi avoir à manipuler des PST dans pas longtemps et on ne sait jamais, ça pourrait m'aider... Et c'est ça l'esprit communautaire ;).

Bonne journée,

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 1 semaine #14270 par Giraud
Merciiiii Arnaud :)
2 jours que je trimais et la soluce est TrimEnd() :P

Comment as-tu vu ce caractère de fin code 0 ? Car j'ai peut-être ce même caractère dans toutes mes lectures de clés de registre en unicode!:S

Sinon, je ne suis pas passé par l'objet COM Outlook, même si c'est vrai que c'est plus simple, pour plusieurs raisons :

- La création de l'objet lance outlook =&gt; script pas discret. De plus à la fin une icône persiste dans la zone de notif.
- Dans une config avec plusieurs profils de messagerie, comme le script lance outlook, il demande quel profil choisir. Pas discret non plus et en plus tu ne peux donc pas scruter les PST de tous les profils de messagerie.
Ou alors je m'y suis mal pris, ou j'ai pas compris un truc, ce qui est fort probable :-)

Concernant le script de la bibliothèque, je l'ai essayé pour être sûr, et il ne marche pas pour moi à cause de la recherche sur 'dossiers personnels', mes PST ont des noms divers et variés :angry:
Avec les infos que j'avais glané ici et là j'avais fait ce script avec COM (Pour info/partage) :

[code:1]
Function Get-PSTArchive {

Function ADDPSTLINE {
Param([String] $ORDI,[String] $UTIL,[String] $NOM,[String] $CHEMIN,[String] $TAILLE)
$PSTOBJ = New-Object PSObject
$PSTOBJ | Add-Member -Name Ordi -MemberType NoteProperty -Value $ORDI
$PSTOBJ | Add-Member -Name Util -MemberType NoteProperty -Value $UTIL
$PSTOBJ | Add-Member -Name Nom -MemberType NoteProperty -Value $NOM
$PSTOBJ | Add-Member -Name Chemin -MemberType NoteProperty -Value $CHEMIN
$PSTOBJ | Add-Member -Name Taille -MemberType NoteProperty -Value $TAILLE
Return $PSTOBJ
}

$OUTLOOK = New-Object -comObject Outlook.Application
$PSTTABLE = $OUTLOOK.Session.Stores | Where { ($_.FilePath -like '*.PST') }
# Pour ajouter fichiers OST dans le where : -or ($_.FilePath -like '*.OST')
$COMPR = $env:computername
$USR = $env:username
$PSTLIST=@()

If (!($PSTTABLE -eq $NULL)) {
Foreach ($LINE In $PSTTABLE) {
$NAME = $LINE.DisplayName
$PATH = $LINE.FilePath
$FILE = Get-Item $LINE.FilePath
$SIZE = $FILE.length/1KB/1000

$PSTLIST+=ADDPSTLINE -Ordi $COMPR -Util $USR -Nom $NAME -Chemin $PATH -Taille $SIZE
}
}

Stop-Process -name \&quot;OUTLOOK*\&quot;

Return $PSTLIST
}
[/code:1]
Concernant le partage de mon code, c'est avec grand plaisir que je le partagerai, vu comme il me fait trimer :P
Il s'agit d'un script que je prépare afin de reparamétrer outlook automatiquement pour une migration IMAP vers Exchange 2013 sans avoir à passer sur tous les poste. (Exécution par GPO) Par contre je ne suis pas un pro en powershell, donc il manquera sans doute des tests et il ne sera peut-être pas optimisé aux petits oignons ;)
En pièce jointe le script où il en est pour le moment : 3 Fonctions qui servent à : obtenir la liste des PSTs, obtenir la liste des comptes et obtenir l'utilisateur AD connecté.

Encore Merci Arnaud


La pièce jointe MigrationOutlook.ps1 est absente ou indisponible

Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 1 semaine #14281 par Arnaud Petitjean
Salut Gégé !

Pour découvrir qu'il y avait un caractère spécial à la fin de ta chaîne j'ai converti chaque caractère pour obtenir son code Unicode, comme ceci:

[code:1]
PS &gt; $str = \&quot;Bonjour !\&quot;
PS &gt; [int[]][char[]] $str

66
111
110
106
111
117
114
32
33
[/code:1]

Dans ton cas, il y avait un caractère 0 juste après le 33. C'est pourquoi j'ai passé 0 à la méthode TrimEnd().

Pour plus de détails sur le fonctionnement de TrimEnd, regarde ce lien MSDN .

Merci d'avoir partagé tes scripts. Je vais les adapter un peu et les inclure à la bibliothèque prochainement. Super ! :)

Arnaud<br><br>Message édité par: Arnaud, à: 12/03/13 20:52

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 1 semaine #14289 par Giraud
Ok, merci Arnaud

Sur le script que j'ai fourni en pièce jointe, je me suis aperçu d'un petit problème s'il n'y a qu'un profil, le comptage de profil que je fais me retourne rien. Il faut donc modifier comme cela :

[code:1]# Obtention du nombre de profils messagerie existant
$HKCU_PROFILES = @(Get-ChildItem -Path Registry::$HKCU_PROFKEY)
$NB_PROFILES = $HKCU_PROFILES.Count
$NB_PROFILES[/code:1]

En effet pour que count marche il faut le faire sur un tableau et le get-childitem ne renvoi pas un tableau si il n'y a qu'un seul élément. On convertit donc la sortie du GCI en tableau avec @()

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 1 semaine #14301 par Arnaud Petitjean

En effet pour que count marche il faut le faire sur un tableau et le get-childitem ne renvoi pas un tableau si il n'y a qu'un seul élément. On convertit donc la sortie du GCI en tableau avec @()


Effectivement c'est un problème classique avec PowerShell v1 et v2, mais ce n'est désormais plus le cas depuis la v3. :woohoo:

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.052 secondes
Propulsé par Kunena