Question Impossible de convertir la valeur en type System.S

Plus d'informations
il y a 11 ans 5 mois #18213 par usopp
Bonjour,

je ne comprends pas.. et je viens ici chercher une explication :silly:

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 .. :woohoo: 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 !! :)

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

Plus d'informations
il y a 11 ans 5 mois #18214 par Laurent Dardenne
Salut,
usopp écrit:

je bloque je comprends pas c'est du [string] de partout ?!

Si c'était le cas tu n'aurais pas de soucis :whistle:
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.

Plus d'informations
il y a 11 ans 5 mois #18215 par usopp
Hello Laurent

si je fais un $item.DNSListData |gm j'ai bien un
TypeName: System.String :dry:

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 ..:angry:

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 :ohmy:

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

Plus d'informations
il y a 11 ans 5 mois #18217 par Arnaud Petitjean
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

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 11 ans 5 mois #18220 par usopp
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 ..:silly:

:woohoo: :S

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

Plus d'informations
il y a 11 ans 5 mois #18222 par usopp
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 ? :(

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

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