Question Transmission de paramètre étrange

Plus d'informations
il y a 4 ans 4 mois #29449 par Gabriel
Bonjour à tous,
Je deviens chèvre avec un bug étrange.
J'ai un script qui fabrique des paramètres pour une fonction print-img. Cela marchait jusqu'à ce que je change sans doute un détail et ça ne marche plus. Les paramètres ne veulent plus se transmettre.
J'ai déshabillé la fonction pour que ce soit plus clair.
[code:1]function print-img{param([boolean]$fitImageToPaper,[string]$printer,[string]$imgPath)
write-host \"img_reçu=\" $imgPath
}
############ Programme principal
##### mettre le Home Dir égal au répertoire courant
##################
$p = get-location -PSProvider filesystem | select -exp path
[environment]::CurrentDirectory = $p
[String]$MonPath=\"Scan\Images\"
$Doss = Get-ChildItem -Path $MonPath -File
$NumFich=$Doss.count
Write-host \"Nb fich=\" $NumFich
If ($NumFich -gt 1) {write-host \"plusieurs fichiers\"}
If ($NumFich -eq 1){
Foreach ($Fich in $Doss){

$ThePath=$MonPath + \"\\" + $Fich.Name
[string]$MonPath=$ThePath.ToString()
}
$printer=\"Brother\"
$fitImageToPaper=$true

print-img ($fitImageToPaper,$printer,$MonPath)
}[/code:1]
J'ai contrôlé que les types des variables transmises étaient corrects, et pourtant les paramètres sont mal transmis comme le prouve le résultat du write-host de $imgPath. La variable qui devrait être un string (premier paramètre) est en fait une liste des paramètres.
[code:1]img_reçu= Scan\Images\scan1001.jpg Brother True[/code:1]
Alors évidemment un peu plus loin la fonction se plante car elle attend un string et elle trouve un objet.


??????

:) gabier
P.S. J'ai fait un test clair, en imprimant le paramètre avant d'appeler la fonction, puis comme première instruction de la fonction
[code:1]Img envoyée Scan\Images\scan1001.jpg
img_reçu= Scan\Images\scan1001.jpg Brother True[/code:1]<br><br>Message édité par: gabier, à: 19/11/19 14:12

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

Plus d'informations
il y a 4 ans 4 mois #29454 par Laurent Dardenne
Salut,
à la différence d'autres langage de programmation, les concepteurs de Powershell on fait le choix de ne pas utiliser les parenthèses pour l'appel de cmdlet :
[code:1]
print-img ($fitImageToPaper,$printer,$MonPath)

#En + mieux
print-img $fitImageToPaper $printer $MonPath
[/code:1]
Le choix du terme function pour couvrir l'implémentation du concept de cmdlet est discutable, mais c'est leur choix.

Tu peux aussi débuger ce cas avec :
[code:1]Trace-Command parameterbinding {print-img ($fitImageToPaper,$printer,$MonPath)} -pshost
[/code:1]
Voir utiliser ce cmdlet:
[code:1]
Set-StrictMode -Version latest
print-img ($fitImageToPaper,$printer,$MonPath)
[/code:1]

Tutoriels PowerShell

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

Plus d'informations
il y a 4 ans 4 mois #29455 par Gabriel
Laurent Dardenne écrit:

Salut,
à la différence d'autres langage de programmation, les concepteurs de Powershell on fait le choix de ne pas utiliser les parenthèses pour l'appel de cmdlet :
[code:1]
print-img ($fitImageToPaper,$printer,$MonPath)

#En + mieux
print-img $fitImageToPaper $printer $MonPath
[/code:1]


Décidément, je suis vraiment novice en Powershell, je ne sais même pas appeler correctement une fonction:unsure:
Personellement, je ne peux critiquer les concepteurs de Powershell d'avoir choisi une syntaxe plutôt qu'une autre, c'est leur choix.
Par contre, ce que je déplore c'est qu'ils n'aident pas beaucoup l'utilisateur à se rendre compte de son erreur. Au lieu d'indiquer mes 3 paramètres séparés par des blancs et sans parenthèses, je les ai mis entre parenthèse. Il y a 2 choses qui auraient dû entraîner un message d'erreur ou au moins d'avertissement
- la présence des parenthèses.
- si j'admets que ces parenthèses peuvent être interprétées comme un seul paramètre (ce qui a été le cas puisqu'il a transformé mes 3 paramètre en un objet, une collection de 3 variables) alors j'ai appelé la fonction avec 1 paramètre tandis que sa spécification prévoit 3 paramètres. Le langage n'oblige pas à préciser null pour les 2 autres paramètres.
Avec un langage un peu moins laxiste j'aurais eu un message d'erreur.

Il m'a suffi de remettre l'appel aux normes pour que le script marche à nouveau. Mais je vais quand même essayer les outils de trace sur la version fautive pour voir.

Merci pour l'aide

:) gabier

P.S. La trace est trop verbeuse, je ne sais pas l’interpréter. Le strict-mode n'a rien vu du tout, il m'a trouvé un truc qui ne lui plaît pas ailleurs mais rien sur les paramètres.<br><br>Message édité par: gabier, à: 20/11/19 07:45

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

Plus d'informations
il y a 4 ans 4 mois #29458 par Laurent Dardenne
gabier écrit:

je ne sais même pas appeler correctement une fonction

J'ai eu le même soucis et la même prise de tête à mes débuts, c'est un grand classique de piège sous PS.
gabier écrit:

Par contre, ce que je déplore c'est qu'ils n'aident pas beaucoup l'utilisateur à se rendre compte de son erreur.

Oui c'est vrai, comme quoi la gestion d'erreur à destination des utilisateurs n'est pas chose aisée.
Mais avec Powershell il faut vraiment passer du temps sur les bases sinon on en perd pas mal sur des broutilles.
En même temps, la leçon étant douloureuse on s'en souvient ;)
gabier écrit:

Avec un langage un peu moins laxiste j'aurais eu un message d'erreur.

C'est un langage dynamique qui n'est pas typé, c'est donc pour moi un laxisme assumé :)

Je serais tenté de te dire qu'ici c'est celui/celle qui code qui l'ai avant tout.
Le pb avec PS c'est que tout le monde se dit que c'est facile (ce qui est en partie vrai, mais en partie seulement), je me retrouve souvent (en prestation) avec des solutions avec des milliers de lignes de code immondes, voir des fonctions de 800 lignes shootées aux globales où tout est couplés :sick:
gabier écrit:

Décidément, je suis vraiment novice en Powershell

On a tous débuté un jour, moi sur PS ça fait un bail et cela n'a pas été 'facile'.<br><br>Message édité par: Laurent Dardenne, à: 20/11/19 18:20

Tutoriels PowerShell

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

Plus d'informations
il y a 4 ans 4 mois #29460 par Gabriel
Laurent Dardenne a écrit

C'est un langage dynamique qui n'est pas typé, c'est donc pour moi un laxisme assumé

Oui c'est là un des gros soucis de ce langage. Je crois que je ne tenterai jamais de faire un programme de milliers de lignes avec Powershell.
Le langage que je pratique le plus depuis quelques années est le VBA Office (Excel et Word). Il est typé ou pas, on a le choix (Option \&quot;Explicit\&quot;). Moi j'opte toujours pour le typé. Alors on a du typé strict, pas du typé à la Powershell qui change le type à la première occasion.
Bon, je vais faire avec. Je n'utilise pas Powershell très souvent, c'est là aussi mon malheur car la formation est lente...
Heureusement que tu es là pour secourir les brebis égarées;)

:) gabier<br><br>Message édité par: gabier, à: 21/11/19 07:49

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

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