Bonjour,
Je vous présente $addr:
$addr est une String:Code:
1
2 [DBG]: PS G:\>>> $addr machine@bidule.com
Le problème:Code:
1
2
3
4
5 [DBG]: PS G:\>>> $addr.getType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object
Après une heure de débogage:Code:
1
2
3
4
5
6
7
8 [DBG]: PS G:\>>> Set-ADUser $username -Replace @{'info'=$addr} Type non valide « System.Management.Automation.PSObject ». Nom du paramètre*: info Au niveau de ligne*: 1 Caractère*: 11 + Set-ADUser <<<< $username -Replace @{'info'=$addr} + CategoryInfo : InvalidArgument: (machin:ADUser) [Set-ADUser], ArgumentException + FullyQualifiedErrorId : Type non valide « System.Management.Automation.PSObject ». Nom du paramètre*: info,Microsoft.ActiveDirectory.Management.Commands.SetADUser
Ca passe...Code:[DBG]: PS G:\>>> Set-ADUser $username -Replace @{'info'=$addr.ToString()}
Pour être sûr:
C'est reproductible et à un autre endroit dans le code j'ai du également utiliser $addr.ToString() pour résoudre un problème similaire.Code:
1
2
3
4
5 [DBG]: PS G:\>>> $addr.getType() -eq $addr.ToString().getType() True [DBG]: PS G:\>>> $addr -eq $addr.ToString() True
Comment est-ce possible ?
Y a-t-il plusieurs types String identiques en apparence mais différents ?
Suis-je condamné à sombrer dans la folie si je continue à utiliser PowerShell ?
La génération de la valeur de $addr est un peu longue mais la seule partie sur laquelle j'ai un doute est une fonction que j'ai reprise du Web pour enlever les accents et autres diacritiques:
Est-ce que cela pourrait venir de là ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 function Remove-Diacritics { param ([String]$src = [String]::Empty) foreach ($s in $src) { if ($s -eq $null) { return [String]::Empty } $s = $s.Normalize("FormD") $s.ToCharArray() | % { $uCategory = [Globalization.CharUnicodeInfo]::GetUnicodeCategory($_) if ($uCategory -ne "NonSpacingMark") { $res += $_ } } return $res } }