Bonjour,
Je vous présente $addr:
1 2
| [DBG]: PS G:\>>> $addr
machine@bidule.com |
$addr est une String:
1 2 3 4 5
| [DBG]: PS G:\>>> $addr.getType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object |
Le problème:
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 |
Après une heure de débogage:
[DBG]: PS G:\>>> Set-ADUser $username -Replace @{'info'=$addr.ToString()}
Ca passe...
Pour être sûr:
1 2 3 4 5
| [DBG]: PS G:\>>> $addr.getType() -eq $addr.ToString().getType()
True
[DBG]: PS G:\>>> $addr -eq $addr.ToString()
True |
C'est reproductible et à un autre endroit dans le code j'ai du également utiliser $addr.ToString() pour résoudre un problème similaire.
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:
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
}
} |
Est-ce que cela pourrait venir de là ?
Partager