Question Impossible de convertir la valeur en type System.S
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 11 ans 5 mois #18223
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
Je ne sais pas pourquoi ça ne fonctionne pas, mais toujours est-il qu'un Write-OutPut (ou un Return) émet de la donnée.
Write-Output n'est donc pas adapté dans ton cas. Tu devrais utiliser plutôt Write-Host.
Write-Output n'est donc pas adapté dans ton cas. Tu devrais utiliser plutôt Write-Host.
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.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 11 ans 5 mois #18224
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
Je viens de voir un truc qui attire mon attention dans ta déclaration de paramètres:
[code:1]
[Parameter(Mandatory=$true)][array]$ListDNS2008)[/code:1]
A mon avis tu n'utilises pas le bon type (array). Si tu attends en entrée un tableau de chaines, c'est [String[]] qu'il faut mettre à la place de [Array].
Sinon quelques petits conseils :
- No1 : pour plus de lisibilité pour tout le monde (y compris pour moi qui essaie de débogguer ton script), tu devrais spécifier explicitement les paramètres lors des appels à tes fonctions.
- No2 : toujours pour plus de lisibilité, n'utilise pas d'alias dans tes scripts
- No3 : Evite l'usage du mot clé Return, car j'ai déjà rencontré quelques effets de bord avec lui. Je te conseille de le supprimer purement et simplement ou de le remplacer par Write-Output si tu veux être plus explicite.
Arnaud
[code:1]
[Parameter(Mandatory=$true)][array]$ListDNS2008)[/code:1]
A mon avis tu n'utilises pas le bon type (array). Si tu attends en entrée un tableau de chaines, c'est [String[]] qu'il faut mettre à la place de [Array].
Sinon quelques petits conseils :
- No1 : pour plus de lisibilité pour tout le monde (y compris pour moi qui essaie de débogguer ton script), tu devrais spécifier explicitement les paramètres lors des appels à tes fonctions.
- No2 : toujours pour plus de lisibilité, n'utilise pas d'alias dans tes scripts
- No3 : Evite l'usage du mot clé Return, car j'ai déjà rencontré quelques effets de bord avec lui. Je te conseille de le supprimer purement et simplement ou de le remplacer par Write-Output si tu veux être plus explicite.
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 #18225
par usopp
Réponse de usopp sur le sujet Re:Impossible de convertir la valeur en type System.S
merci pour tes conseils
etrange le write-output a la place du return mais je te fait confiance je vais tous les changer
je suis ok pour le 1 et 2 aussi
j'ai modifier ma fonction test-dns
[code:1]Function test-dns {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][string]$p,[Parameter(Mandatory=$true)][string[]]$ListDNS2008)
$listdns = ($p).split(\",\"«»)
$op = diff $listdns $ListDNS2008 -IncludeEqual -ExcludeDifferent
if(($op).count -eq 4)
{
write-output \"OK\"
}
else
{
write-output \"KO\"
}
}[/code:1]
et j'ai le $op qui me retourne rien je comprend pas.. c'est Basic pourtant ..ca fait bientot 2 jours que je suis sur ces 3 fonctions qui bug ca me rend fou..
etrange le write-output a la place du return mais je te fait confiance je vais tous les changer
je suis ok pour le 1 et 2 aussi
j'ai modifier ma fonction test-dns
[code:1]Function test-dns {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][string]$p,[Parameter(Mandatory=$true)][string[]]$ListDNS2008)
$listdns = ($p).split(\",\"«»)
$op = diff $listdns $ListDNS2008 -IncludeEqual -ExcludeDifferent
if(($op).count -eq 4)
{
write-output \"OK\"
}
else
{
write-output \"KO\"
}
}[/code:1]
et j'ai le $op qui me retourne rien je comprend pas.. c'est Basic pourtant ..ca fait bientot 2 jours que je suis sur ces 3 fonctions qui bug ca me rend fou..
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 11 ans 5 mois #18226
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
On progresse, on progresse...!!! 
A présent c'est un autre problème.
Par contre, pour que l'on puisse t'aider ce serait bien que tu postes tous tes scripts ainsi que des exemples de fichiers CSV. Et le plus important, ce serait que tu nous explique ce que doit faire ton script. Car j'essaie de t'aider mais je ne sais pas vraiment quel est le but de la manip. Car si ça se trouve, on pourrait t'apporter une autre façon d'aborder ta problématique.
@+
A présent c'est un autre problème.
Par contre, pour que l'on puisse t'aider ce serait bien que tu postes tous tes scripts ainsi que des exemples de fichiers CSV. Et le plus important, ce serait que tu nous explique ce que doit faire ton script. Car j'essaie de t'aider mais je ne sais pas vraiment quel est le but de la manip. Car si ça se trouve, on pourrait t'apporter une autre façon d'aborder ta problématique.
@+
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 #18228
par usopp
Réponse de usopp sur le sujet Re:Impossible de convertir la valeur en type System.S
merci !! 
je ne peux pas vraiment donner mon code source il y a des données entreprise dedans..
et j'utilise pas mal de cmdlet active directory
par contre je peux donner des bouts génériques et ma logique tu pourras peut être déjà me dire si ce que je fais c'est pas trop de la merde..sachant que je suis autodidacte et je me demmerde seul donc je dois pas forcement faire comme il faut ..
j'ai un fichier CSV avec header :
ServerNameData,DNSListData,Wins1Data,Wins2Data
ex :
[code:1]
ServerNameData,DNSListData,Wins1Data,Wins2Data
serveur01,\"192.168.0.1, 192.168.0.2\",192.168.0.6,192.168.0.7[/code:1]
il me faut faire un script qui check certaines choses
comme par exemple :
- le nombre de DNS
- si le wins1 est correct
- si le wins2 est correct
- si les 4 DNS présent font bien parti d'une liste d'IP de serveurs active directory 2008
etc
mon idée était de faire :
-des fonctions courte
-simple (c'est raté pour le moment lol
)
-facile a maintenir
j'essaye de travailler avec des collections pour pouvoir faire des exports & manipulations etc
pour commencer je transforme les entrées CSV en collection avec New-CSV_to_Object
[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)
$DNScheck
$Hash =@{ SERVERNAME = $Servername
DNS = ($dns.replace(\" \",\"\"«»))
cDNS = $cDNS
DNScheck = $DNScheck
WINS1 = $WINS1
WINS2 = $WINS2
}
$Object = New-Object PSObject -Property $hash
write-output $Object
} [/code:1]
apres je voulais faire :
une fonction qui compte le nombre de DNS (cela fonctionne) et qui met le résultat dans cDNS
une fonction qui test le DNS (la function dns-test ci dessus) qui ne fonctionne pas et qui devrait me mettre OK ou KO dans DNScheck (le truc qui fou la merde depuis le debut)
et 2 autres fonctions pour tester wins1 et wins2 qui sont normalement très simple que j'ai pas encore coder
dans ma fonction New-CSV_Collection je met a \"0.0.0.0\" si certaines entreés CSV sont vide pour éviter des problèmes de paramètres dans mes functions
[code:1]Function New-CSV_Collection {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][string]$CSV,[Parameter(Mandatory=$true)][string]$LogFilePath)
if((ifCSVExist $CSV $LogFilePath))
{
$DC2008 = New-DC_Collection2008 $LogFilePath
$ListDNS2008 = $dc2008 | select dns
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\"
}
$item.ServerNameData
$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) (test-dns $item.DNSListData $ListDNS2008) ($item.Wins1Data) ($item.Wins2Data)
}
return $collection
}
catch
{
#WriteLog \"Echec de l'Importation du CSV\" 0 $LogFilePath
$data = \"FAIL\"
$ErrorMessage = $_.Exception.Message
$ErrorMessage
return $data
}
}
}[/code:1]
$ListDNS2008 = la liste des IP DNS des serveurs active directory 2008 a laquelle je compare les DNS dans la fonction test-dns
[code:1]Function test-dns {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][string]$p,[Parameter(Mandatory=$true)][string[]]$ListDNS2008)
$listdns = ($p).split(\",\"«»)
$op = diff $listdns $ListDNS2008 -IncludeEqual -ExcludeDifferent
write-output $listdns
if(($op).count -eq 4)
{
write-output \"OK\"
}
else
{
write-output \"KO\"
}
}[/code:1]
je sais pas si cela te suffit comme infos..
je ne peux pas vraiment donner mon code source il y a des données entreprise dedans..
par contre je peux donner des bouts génériques et ma logique tu pourras peut être déjà me dire si ce que je fais c'est pas trop de la merde..sachant que je suis autodidacte et je me demmerde seul donc je dois pas forcement faire comme il faut ..
j'ai un fichier CSV avec header :
ServerNameData,DNSListData,Wins1Data,Wins2Data
ex :
[code:1]
ServerNameData,DNSListData,Wins1Data,Wins2Data
serveur01,\"192.168.0.1, 192.168.0.2\",192.168.0.6,192.168.0.7[/code:1]
il me faut faire un script qui check certaines choses
comme par exemple :
- le nombre de DNS
- si le wins1 est correct
- si le wins2 est correct
- si les 4 DNS présent font bien parti d'une liste d'IP de serveurs active directory 2008
etc
mon idée était de faire :
-des fonctions courte
-simple (c'est raté pour le moment lol
-facile a maintenir
j'essaye de travailler avec des collections pour pouvoir faire des exports & manipulations etc
pour commencer je transforme les entrées CSV en collection avec New-CSV_to_Object
[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)
$DNScheck
$Hash =@{ SERVERNAME = $Servername
DNS = ($dns.replace(\" \",\"\"«»))
cDNS = $cDNS
DNScheck = $DNScheck
WINS1 = $WINS1
WINS2 = $WINS2
}
$Object = New-Object PSObject -Property $hash
write-output $Object
} [/code:1]
apres je voulais faire :
une fonction qui compte le nombre de DNS (cela fonctionne) et qui met le résultat dans cDNS
une fonction qui test le DNS (la function dns-test ci dessus) qui ne fonctionne pas et qui devrait me mettre OK ou KO dans DNScheck (le truc qui fou la merde depuis le debut)
et 2 autres fonctions pour tester wins1 et wins2 qui sont normalement très simple que j'ai pas encore coder
dans ma fonction New-CSV_Collection je met a \"0.0.0.0\" si certaines entreés CSV sont vide pour éviter des problèmes de paramètres dans mes functions
[code:1]Function New-CSV_Collection {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][string]$CSV,[Parameter(Mandatory=$true)][string]$LogFilePath)
if((ifCSVExist $CSV $LogFilePath))
{
$DC2008 = New-DC_Collection2008 $LogFilePath
$ListDNS2008 = $dc2008 | select dns
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\"
}
$item.ServerNameData
$collection += New-CSV_to_Object ($item.ServerNameData) ($item.DNSListData) (CountDNS $item.DNSListData) (test-dns $item.DNSListData $ListDNS2008) ($item.Wins1Data) ($item.Wins2Data)
}
return $collection
}
catch
{
#WriteLog \"Echec de l'Importation du CSV\" 0 $LogFilePath
$data = \"FAIL\"
$ErrorMessage = $_.Exception.Message
$ErrorMessage
return $data
}
}
}[/code:1]
$ListDNS2008 = la liste des IP DNS des serveurs active directory 2008 a laquelle je compare les DNS dans la fonction test-dns
[code:1]Function test-dns {
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)][string]$p,[Parameter(Mandatory=$true)][string[]]$ListDNS2008)
$listdns = ($p).split(\",\"«»)
$op = diff $listdns $ListDNS2008 -IncludeEqual -ExcludeDifferent
write-output $listdns
if(($op).count -eq 4)
{
write-output \"OK\"
}
else
{
write-output \"KO\"
}
}[/code:1]
je sais pas si cela te suffit comme infos..
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 11 ans 5 mois #18229
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
Bon... Après réflexion je pense que tu vas un peu plus vite que la musique. C'est à dire que tu devrais y aller un peu plus progressivement et tester de façon unitaire chacune de tes fonctions.
Avec PowerShell il ne faut plus penser comme en VBS; c'est à dire coder coder et coder puis déboguer, déboguer et déboguer... Ce qui pour moi a toujours été très pénible.
PowerShell nous offre la possibilité de tester des bouts de code de manière interactive directement dans la console. Il ne faut donc surtout pas s'en priver. Ainsi on s'évite de perdre beaucoup de temps à déboguer.
Pour moi il faudrait revoir pas mal la logique de ton script...
Pour commencer, je te propose de revoir complètement ta fonction Test-DNS.
Je l'ai donc rebaptisé et un peu transformé :
[code:1]
function isDNSConfigValid
{
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)]
[string[]]$DNSConfig,
[Parameter(Mandatory=$false)]
[string[]]$ListDNS2008= ('192.168.0.1','192.168.0.2')
)
$i=0
foreach ($DNSServer in $DNSConfig)
{
if ($ListDNS2008 -contains $DNSServer)
{
$i++
}
}
if ($i -ne 2)
{
$false
}
else
{
$true
}
}
[/code:1]
Exemple d'utilisation:
[code:1]
PS C:\Users\Arnaud> isDNSConfigValid -DNSConfig '192.168.0.1','192.168.0.2'
True
PS C:\Users\Arnaud> isDNSConfigValid -DNSConfig '192.168.0.1','192.168.0.3'
False
PS C:\Users\Arnaud> isDNSConfigValid -DNSConfig '192.168.0.10','192.168.0.3'
False
PS C:\Users\Arnaud> isDNSConfigValid -DNSConfig '192.168.0.1','192.168.0.3'
False
PS C:\Users\Arnaud> isDNSConfigValid -DNSConfig '192.168.0.1','192.168.0.2'
True
[/code:1]
Il faut essayer de raisonner PowerShell et donc penser réutilisation. Ma fonction retourne donc une valeur Booléenne et non texte.
Avec PowerShell il ne faut plus penser comme en VBS; c'est à dire coder coder et coder puis déboguer, déboguer et déboguer... Ce qui pour moi a toujours été très pénible.
PowerShell nous offre la possibilité de tester des bouts de code de manière interactive directement dans la console. Il ne faut donc surtout pas s'en priver. Ainsi on s'évite de perdre beaucoup de temps à déboguer.
Pour moi il faudrait revoir pas mal la logique de ton script...
Pour commencer, je te propose de revoir complètement ta fonction Test-DNS.
Je l'ai donc rebaptisé et un peu transformé :
[code:1]
function isDNSConfigValid
{
[CmdletBinding()]
Param ([Parameter(Mandatory=$true)]
[string[]]$DNSConfig,
[Parameter(Mandatory=$false)]
[string[]]$ListDNS2008= ('192.168.0.1','192.168.0.2')
)
$i=0
foreach ($DNSServer in $DNSConfig)
{
if ($ListDNS2008 -contains $DNSServer)
{
$i++
}
}
if ($i -ne 2)
{
$false
}
else
{
$true
}
}
[/code:1]
Exemple d'utilisation:
[code:1]
PS C:\Users\Arnaud> isDNSConfigValid -DNSConfig '192.168.0.1','192.168.0.2'
True
PS C:\Users\Arnaud> isDNSConfigValid -DNSConfig '192.168.0.1','192.168.0.3'
False
PS C:\Users\Arnaud> isDNSConfigValid -DNSConfig '192.168.0.10','192.168.0.3'
False
PS C:\Users\Arnaud> isDNSConfigValid -DNSConfig '192.168.0.1','192.168.0.3'
False
PS C:\Users\Arnaud> isDNSConfigValid -DNSConfig '192.168.0.1','192.168.0.2'
True
[/code:1]
Il faut essayer de raisonner PowerShell et donc penser réutilisation. Ma fonction retourne donc une valeur Booléenne et non texte.
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.
Temps de génération de la page : 0.087 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- Impossible de convertir la valeur en type System.S