Question Impossible de convertir la valeur en type System.S
- usopp
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 34
- Remerciements reçus 0
il y a 11 ans 5 mois #18213
par usopp
Impossible de convertir la valeur en type System.S a été créé par usopp
Bonjour,
je ne comprends pas.. et je viens ici chercher une explication
j'ai une fonction qui créé un Objet
[code:1]Function New-CSV_to_Object {
[CmdletBinding()]
Param ( [Parameter(Mandatory=$true)][string]$Servername,
[Parameter(Mandatory=$true)][string]$DNS,
[Parameter(Mandatory=$true)][int]$cDNS,
[Parameter(Mandatory=$true)][string]$DNScheck,
[Parameter(Mandatory=$true)][string]$WINS1,
[Parameter(Mandatory=$true)][string]$WINS2)
$Hash =@{ SERVERNAME = $Servername
DNS = ($dns.replace(\" \",\"\"«»))
cDNS = $cDNS
DNScheck = $DNScheck
WINS1 = $WINS1
WINS2 = $WINS2
}
$Object = New-Object PSObject -Property $hash
return $Object
} [/code:1]
j'ai une function qui créé une collection avec l'objet
[code:1]Function New-CSV_Collection {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][string]$CSV,[Parameter(Mandatory=$true)][string]$LogFilePath)
if((ifCSVExist $CSV $LogFilePath))
{
try
{
$data = Import-Csv -Path $CSV -Delimiter ','
$collection=@()
foreach ($item in $data)
{
if(!($item.DNSListData))
{
$item.DNSListData = \"0.0.0.0\"
}
if(!($item.Wins1Data))
{
$item.Wins1Data = \"0.0.0.0\"
}
if(!($item.Wins2Data))
{
$item.Wins2Data = \"0.0.0.0\"
}
$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) (test-dns $item.DNSListData) ($item.Wins1Data) ($item.Wins2Data)
}
return $collection
}
catch
{
#WriteLog \"Echec de l'Importation du CSV\" 0 $LogFilePath
$data = \"FAIL\"
$error[0]
return $data
}
}
}[/code:1]
j'ai une function test-dns
[code:1]Function test-dns {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][String]$p)
return $p
}[/code:1]
quand je lance j'ai une erreur ci dessous ..
j'ai passé l’après midi dessus.. je bloque je comprends pas c'est du [string] de partout ?!
[code:1]New-CSV_to_Object : Impossible de traiter la transformation d'argument sur le paramètre « DNScheck ». Impossible de convertir la valeur en type System.String.
$collection += New-CSV_to_Object <<<< ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) (test-dns $item.DNSListData) ($item.Wins1Data) ($i
tem.Wins2Data)
+ CategoryInfo : InvalidData: (:«») [New-CSV_to_Object], ParameterBindin...mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,New-CSV_to_Object[/code:1]
si vous avez des conseils sur mon code je suis prenneur merci !!
je ne comprends pas.. et je viens ici chercher une explication
j'ai une fonction qui créé un Objet
[code:1]Function New-CSV_to_Object {
[CmdletBinding()]
Param ( [Parameter(Mandatory=$true)][string]$Servername,
[Parameter(Mandatory=$true)][string]$DNS,
[Parameter(Mandatory=$true)][int]$cDNS,
[Parameter(Mandatory=$true)][string]$DNScheck,
[Parameter(Mandatory=$true)][string]$WINS1,
[Parameter(Mandatory=$true)][string]$WINS2)
$Hash =@{ SERVERNAME = $Servername
DNS = ($dns.replace(\" \",\"\"«»))
cDNS = $cDNS
DNScheck = $DNScheck
WINS1 = $WINS1
WINS2 = $WINS2
}
$Object = New-Object PSObject -Property $hash
return $Object
} [/code:1]
j'ai une function qui créé une collection avec l'objet
[code:1]Function New-CSV_Collection {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][string]$CSV,[Parameter(Mandatory=$true)][string]$LogFilePath)
if((ifCSVExist $CSV $LogFilePath))
{
try
{
$data = Import-Csv -Path $CSV -Delimiter ','
$collection=@()
foreach ($item in $data)
{
if(!($item.DNSListData))
{
$item.DNSListData = \"0.0.0.0\"
}
if(!($item.Wins1Data))
{
$item.Wins1Data = \"0.0.0.0\"
}
if(!($item.Wins2Data))
{
$item.Wins2Data = \"0.0.0.0\"
}
$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) (test-dns $item.DNSListData) ($item.Wins1Data) ($item.Wins2Data)
}
return $collection
}
catch
{
#WriteLog \"Echec de l'Importation du CSV\" 0 $LogFilePath
$data = \"FAIL\"
$error[0]
return $data
}
}
}[/code:1]
j'ai une function test-dns
[code:1]Function test-dns {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][String]$p)
return $p
}[/code:1]
quand je lance j'ai une erreur ci dessous ..
[code:1]New-CSV_to_Object : Impossible de traiter la transformation d'argument sur le paramètre « DNScheck ». Impossible de convertir la valeur en type System.String.
$collection += New-CSV_to_Object <<<< ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) (test-dns $item.DNSListData) ($item.Wins1Data) ($i
tem.Wins2Data)
+ CategoryInfo : InvalidData: (:«») [New-CSV_to_Object], ParameterBindin...mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,New-CSV_to_Object[/code:1]
si vous avez des conseils sur mon code je suis prenneur merci !!
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 11 ans 5 mois #18214
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Impossible de convertir la valeur en type System.S
Salut,
usopp écrit:
N'ayant pas le csv de test: je suppose que certaines de tes données sont à transformer :
[code:1]
$o=New-CSV_to_Object 1 2 3 (1,2,3) 5 6
[/code:1]
usopp écrit:
Si c'était le cas tu n'aurais pas de soucisje bloque je comprends pas c'est du [string] de partout ?!
N'ayant pas le csv de test: je suppose que certaines de tes données sont à transformer :
[code:1]
$o=New-CSV_to_Object 1 2 3 (1,2,3) 5 6
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- usopp
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 34
- Remerciements reçus 0
il y a 11 ans 5 mois #18215
par usopp
Réponse de usopp sur le sujet Re:Impossible de convertir la valeur en type System.S
Hello Laurent
si je fais un $item.DNSListData |gm j'ai bien un
TypeName: System.String
dans mon csv j'ai que des IP ou nom de serveurs
servernamedata=\"serveurnt\"
DNSListData= \"10.10.10.10,192.168.0.1\"
Wins1Data = \"0.0.0.0\"
Wins2Data = \"0.0.0.0\"
j'ai essayé de cast en [string] un peu partout ca change rien je comprends pas ..
c'est bien la fonction (test-dns $item.DNSListData) ou le parametre [Parameter(Mandatory=$true)][string]$DNScheck, qui pose problème ..si je fais
[code:1]$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) \"ok\" ($item.Wins1Data) ($item.Wins2Data)[/code:1]
ca fonctionne
si je fais un $item.DNSListData |gm j'ai bien un
TypeName: System.String
dans mon csv j'ai que des IP ou nom de serveurs
servernamedata=\"serveurnt\"
DNSListData= \"10.10.10.10,192.168.0.1\"
Wins1Data = \"0.0.0.0\"
Wins2Data = \"0.0.0.0\"
j'ai essayé de cast en [string] un peu partout ca change rien je comprends pas ..
c'est bien la fonction (test-dns $item.DNSListData) ou le parametre [Parameter(Mandatory=$true)][string]$DNScheck, qui pose problème ..si je fais
[code:1]$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) \"ok\" ($item.Wins1Data) ($item.Wins2Data)[/code:1]
ca fonctionne
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 11 ans 5 mois #18217
par Arnaud Petitjean
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 ?
Réponse de Arnaud Petitjean sur le sujet Re:Impossible de convertir la valeur en type System.S
Bonjour Usopp,
A mon avis ton problème vient du fait que dans ton fichier CSV, ta propriété DNSListData est multivaluée. Du coup à l'importation, tu récupères un type \"tableau\" et non pas un type String. C'est pourquoi tu as une erreur.
Dans l'exemple que tu donnes et qui fonctionne, tu as des guillemets autour de tes valeurs, ce qui fait que c'est bien un type String. Donc ça marche.
[code:1]DNSListData= \"10.10.10.10,192.168.0.1\"[/code:1]
De plus, attention avec l'utilisation de Get-Member. Car cette commande lorsqu'appliquée à un tableau, retourne le type des objets contenu dans le tableau. Ce qui peut induire en erreur.
Exemple:
[code:1]
$tb = 'aa', 'bb', 'cc', 1, 2
$tb | Get-Member
TypeName : System.String
Name MemberType Definition
----
Clone Method System.Object Clone
CompareTo Method int CompareTo(Syste
Contains Method bool Contains(strin
...
TypeName : System.Int32
Name MemberType Definition
----
CompareTo Method int CompareTo(System.Object
Equals Method bool Equals(System.Object ob
GetHashCode Method int GetHashCode()
GetType Method type GetType()
[/code:1]
Tandis que
[code:1]
$tb = 'aa', 'bb', 'cc', 1, 2
,$tb | Get-Member
TypeName : System.Object[]
Name MemberType Definition
----
Count AliasProperty Count = Len
Add Method int IList.A
Address Method System.Obje
Clear Method void IList.
[/code:1]
Tu vois la différence ?
Ce que je conseille pour déterminer le type d'un objet de façon certaine c'est d'utiliser la méthode Gettype(). Au moins avec cette dernière le résultat est fiable.
[code:1]
PS > $tb.gettype()
IsPublic IsSerial Name BaseType
----
True True Object[] System.Array
[/code:1]
En espérant que ça t'aide.
Arnaud
A mon avis ton problème vient du fait que dans ton fichier CSV, ta propriété DNSListData est multivaluée. Du coup à l'importation, tu récupères un type \"tableau\" et non pas un type String. C'est pourquoi tu as une erreur.
Dans l'exemple que tu donnes et qui fonctionne, tu as des guillemets autour de tes valeurs, ce qui fait que c'est bien un type String. Donc ça marche.
[code:1]DNSListData= \"10.10.10.10,192.168.0.1\"[/code:1]
De plus, attention avec l'utilisation de Get-Member. Car cette commande lorsqu'appliquée à un tableau, retourne le type des objets contenu dans le tableau. Ce qui peut induire en erreur.
Exemple:
[code:1]
$tb = 'aa', 'bb', 'cc', 1, 2
$tb | Get-Member
TypeName : System.String
Name MemberType Definition
----
Clone Method System.Object Clone
CompareTo Method int CompareTo(Syste
Contains Method bool Contains(strin
...
TypeName : System.Int32
Name MemberType Definition
----
CompareTo Method int CompareTo(System.Object
Equals Method bool Equals(System.Object ob
GetHashCode Method int GetHashCode()
GetType Method type GetType()
[/code:1]
Tandis que
[code:1]
$tb = 'aa', 'bb', 'cc', 1, 2
,$tb | Get-Member
TypeName : System.Object[]
Name MemberType Definition
----
Count AliasProperty Count = Len
Add Method int IList.A
Address Method System.Obje
Clear Method void IList.
[/code:1]
Tu vois la différence ?
Ce que je conseille pour déterminer le type d'un objet de façon certaine c'est d'utiliser la méthode Gettype(). Au moins avec cette dernière le résultat est fiable.
[code:1]
PS > $tb.gettype()
IsPublic IsSerial Name BaseType
----
True True Object[] System.Array
[/code:1]
En espérant que ça t'aide.
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.
- usopp
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 34
- Remerciements reçus 0
il y a 11 ans 5 mois #18220
par usopp
Réponse de usopp sur le sujet Re:Impossible de convertir la valeur en type System.S
merci de ton aide !! 
malheureusement cela change rien
si je fais
[code:1]$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) ($item.DNSListData) ($item.Wins1Data) ($item.Wins2Data)[/code:1]
et que je check $item.DNSListData c'est
[code:1]IsPublic IsSerial Name BaseType
----
True True String System.Object[/code:1]
et cela fonctionne mais des que je veux utiliser la fonction dns-test
[code:1]$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) (test-dns $item.DNSListData) ($item.Wins1Data) ($item.Wins2Data)[/code:1]
ben toujours la meme erreur.. alors que la fonction dns-test est basic a mourrir ..
malheureusement cela change rien
si je fais
[code:1]$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) ($item.DNSListData) ($item.Wins1Data) ($item.Wins2Data)[/code:1]
et que je check $item.DNSListData c'est
[code:1]IsPublic IsSerial Name BaseType
----
True True String System.Object[/code:1]
et cela fonctionne mais des que je veux utiliser la fonction dns-test
[code:1]$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) (test-dns $item.DNSListData) ($item.Wins1Data) ($item.Wins2Data)[/code:1]
ben toujours la meme erreur.. alors que la fonction dns-test est basic a mourrir ..
Connexion ou Créer un compte pour participer à la conversation.
- usopp
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 34
- Remerciements reçus 0
il y a 11 ans 5 mois #18222
par usopp
Réponse de usopp sur le sujet Re:Impossible de convertir la valeur en type System.S
j'ai modifier la fonction test-dns
[code:1]Function test-dns {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][string]$p,[Parameter(Mandatory=$true)][array]$ListDNS2008)
$listdns = ($p).split(\",\"«»)
$op = diff [array]$listdns [array]$ListDNS2008 -IncludeEqual -ExcludeDifferent
#write-output \"ici\"
if(($op).count -eq 4)
{
return \"OK\"
}
else
{
return \"KO\"
}
}[/code:1]
j’utilise donc
[code:1]$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) (test-dns $item.DNSListData $ListDNS2008) ($item.Wins1Data) ($item.Wins2Data)[/code:1]
j'ai pas d'erreur sur DNScheck
mais si je décommente write-output \"ici\" dans le fonction dns-test j'ai de nouveau le message
[code:1]
New-CSV_to_Object : Impossible de traiter la transformation d'argument sur le paramètre « DNScheck ».[/code:1]
c'est moi qui suis bugé ou le powershell ?
[code:1]Function test-dns {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][string]$p,[Parameter(Mandatory=$true)][array]$ListDNS2008)
$listdns = ($p).split(\",\"«»)
$op = diff [array]$listdns [array]$ListDNS2008 -IncludeEqual -ExcludeDifferent
#write-output \"ici\"
if(($op).count -eq 4)
{
return \"OK\"
}
else
{
return \"KO\"
}
}[/code:1]
j’utilise donc
[code:1]$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) (test-dns $item.DNSListData $ListDNS2008) ($item.Wins1Data) ($item.Wins2Data)[/code:1]
j'ai pas d'erreur sur DNScheck
mais si je décommente write-output \"ici\" dans le fonction dns-test j'ai de nouveau le message
[code:1]
New-CSV_to_Object : Impossible de traiter la transformation d'argument sur le paramètre « DNScheck ».[/code:1]
c'est moi qui suis bugé ou le powershell ?
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.083 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- Impossible de convertir la valeur en type System.S