Question [Résolu] Exception lors de l'appel de «ToString»

Plus d'informations
il y a 8 ans 1 mois #25003 par Philippe

pareil toujours pas le petit tiret

a quel endroit tu ne vois pas le tiret :
- quand tu visualise la variable $ReplaceText directement ou par write-host ?
- dans l'AD ?
- autrement ?

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

Plus d'informations
il y a 8 ans 1 mois #25004 par Philippe
@Laurent :

J'ai testé différent cas et je n'ai pas rencontré le message d'erreur affiché ici.

en faite après contrôle la variable qui cause l'erreur est de type System.Management.Automation.PSMethodInfo !!
c'est une variable qui ne contient rien cas l'attribut quel doit récupéré n'existe pas dans l'AD

le détail ci-dessous :

[code:1]
$UserName = $env:username
$Filter = \"(&(objectCategory=User)(samAccountName=$UserName))\"
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
$Searcher.Filter = $Filter
$ADUserPath = $Searcher.FindOne()
$ADUser = $ADUserPath.GetDirectoryEntry()
$ADTelephoneMobile = $ADUser.TelephoneMobile

$ADTelephoneMobile.ToString()
Exception lors de l'appel de «ToString» avec «0» argument(s): «L'exception suivante s'est produite lors de la récupération de la représentation sous forme de chaîne de la méthode «
TelephoneMobile»: «La référence d'objet n'est pas définie à une instance d'un objet.»»
Au caractère Ligne:1 : 1
+ $ADTelephoneMobile.ToString()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:«») [], MethodInvocationException
+ FullyQualifiedErrorId : ExtendedTypeSystemException


PS C:\WINDOWS\system32\WindowsPowerShell\v1.0> Get-Variable ad*

Name Value
----
ADTelephoneMobile
ADTelePhoneNumber {}
ADDisplayName {6ratgus}
ADUser System.DirectoryServices.DirectoryEntry


PS C:\WINDOWS\system32\WindowsPowerShell\v1.0> $ADTelephoneMobile.GetType()


IsPublic IsSerial Name BaseType

----
True False PSMethod System.Management.Automation.PSMethodInfo



PS C:\WINDOWS\system32\WindowsPowerShell\v1.0> $ADTelephoneMobile|gm



TypeName : System.Management.Automation.PSMethod

Name MemberType Definition
----

Copy Method System.Management.Automation.PSMemberInfo Copy()
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
Invoke Method System.Object Invoke(Params System.Object[] arguments)
ToString Method string ToString()
IsInstance Property bool IsInstance {get;}
MemberType Property System.Management.Automation.PSMemberTypes MemberType {get;}
Name Property string Name {get;}
OverloadDefinitions Property System.Collections.ObjectModel.Collection[string] OverloadDefinitions {get;}
TypeNameOfValue Property string TypeNameOfValue {get;}
Value Property System.Object Value {get;set;}
[/code:1]

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

Plus d'informations
il y a 8 ans 1 mois #25005 par Laurent Dardenne
Merci 6ratgus, j'ai appris quelque chose :-)
J'ai trouvé ceci qui aborde le sujet.

Ensuite on pourrait ce dire que c'est un bug, mais le code de PS semble s'attendre à ce type de cas.
Les objets provenant de ADSI semble adaptés dans cette classe .

De catcher l'exception [System.Management.Automation.ExtendedTypeSystemException] pourrait couvrir ces cas.

[edit]
Voir aussi .<br><br>Message édité par: Laurent Dardenne, à: 13/02/18 18:32

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 1 mois #25006 par PAWLAK
6ratgus écrit:

pareil toujours pas le petit tiret

a quel endroit tu ne vois pas le tiret :
- quand tu visualise la variable $ReplaceText directement ou par write-host ?
- dans l'AD ?
- autrement ?


Bonjour 6ratgus,

Dans la signature dans le mail directement.
Les informations téléphone et mobile s'affichent bien à la ligne mais j'ai pas le tiret entre deux.

J'ai mise le code après et voici ce que ça me donne (le tiret apparaît bien là :P :

[code:1]Ligne Directe : 02 32 32 32 32 Ligne Directe : System.DirectoryServices.PropertyValueCollection - Mobile : System.DirectoryServices.PropertyValueCollection : 06 45 45 45 45[/code:1]

et le code :

[code:1]if($ADTelephoneNumber -ne \&quot;\&quot;«»){
$FindText = \&quot;TelephoneNumber\&quot;
$ReplaceText = 'Ligne Directe : '+ $ADTelephoneNumber.ToString()
}
Else{
$FindText = \&quot;TelephoneNumber\&quot;
$ReplaceText = \&quot;\&quot;
}
$MSWord.Selection.Find.Execute($FindText, $MatchCase, $MatchWholeWord, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap, $Format, $ReplaceText, $ReplaceAll)


If ($ADMobile -ne \&quot;\&quot;«») {
$FindText = \&quot;Mobile\&quot;
$ReplaceText = 'Mobile : '+ $ADMobile.ToString()
}
Else {
$FindText = \&quot;Mobile\&quot;
$ReplaceText = \&quot;\&quot;
}
$MSWord.Selection.Find.Execute($FindText, $MatchCase, $MatchWholeWord, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap, $Format, $ReplaceText, $ReplaceAll)

if($ADTelephoneNumber -ne \&quot;\&quot; -and $ADMobile -ne \&quot;\&quot;«»){
$ReplaceText ='{0} - {1}' -f $ADTelephoneNumber,$ADMobile
$MSWord.Selection.Find.Execute($FindText, $MatchCase, $MatchWholeWord, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap, $Format, $ReplaceText, $ReplaceAll)
}[/code:1]<br><br>Message édité par: rico76, à: 14/02/18 08:45

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

Plus d'informations
il y a 8 ans 1 mois #25008 par Laurent Dardenne
Peut être as tu un pb d'encodage dans le fichier PS ?
Tu utilises Word pour le rendu de ton mail, je ne pense pas que ce soit un pb lié aux instructions Powershell.
La ligne conseillée renvoie bien le tiret dans PS, en tout cas sur mon poste.

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 1 mois #25009 par PAWLAK
Je ne saurais te répondre, mes compétences dans ce domaine étant limitées.

le faites qu'il remplace les numéros par System.DirectoryServices.PropertyValueCollection - System.DirectoryServices.PropertyValueCollection
Je n'en ai pas la moindre idée ! :S

Ce n'est pas bien grave de toute manière, le principal était le message d'erreur à l'origine.

Là c'est juste une question esthétique. Si je trouve je n'hésiterais pas à mettre l'info.

Merci encore pour votre aide.

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

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