Question Impossible de convertir la valeur en type System.S

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

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 #18224 par Arnaud Petitjean
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

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 #18225 par usopp
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 :P

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

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

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

@+

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 #18228 par usopp
merci !! :)

je ne peux pas vraiment donner mon code source il y a des données entreprise dedans..:unsure: 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 :woohoo:)
-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..:unsure:

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

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

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.109 secondes
Propulsé par Kunena