Résolu
Transformation code en fonction
- Alain
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 7 mois 3 semaines #34178
par Alain
Transformation code en fonction a été créé par Alain
Bonjour,
Je travaille sur un script qui récupère des infos sur le système, dont la liste des programmes installés.
J'ai créé un petit code qui fonctionne bien dans l'éditeur :
J'aimerais beaucoup en faire une fonction, seulement quand je le transforme je n'ai rien qui s'affiche, même pas un message d'erreur :
Merci d'avance pour votre aide.
Je travaille sur un script qui récupère des infos sur le système, dont la liste des programmes installés.
J'ai créé un petit code qui fonctionne bien dans l'éditeur :
[array] $keys=@("HKLM:\SOFTWARE","HKLM:\SOFTWARE\WOW6432Node","HKCU:\SOFTWARE","HKCU:\SOFTWARE\WOW6432Node")
foreach ($key in $keys) {
[string] $subkey=$key + "\Microsoft\Windows\CurrentVersion\Uninstall\*"
Test-Path $subkey | out-null
if ($? -eq 0) {
[array] $apps+=Get-ItemProperty $subkey | where {$_.DisplayName -notlike ""}
}
}
$apps | Select-Object DisplayName, DisplayVersion, Publisher | Sort-Object DisplayName | Get-Unique -AsString | Format-Table -HideTableHeaders
J'aimerais beaucoup en faire une fonction, seulement quand je le transforme je n'ai rien qui s'affiche, même pas un message d'erreur :
function ListeProgrammes() {
[array] $keys=@("HKLM:\SOFTWARE","HKLM:\SOFTWARE\WOW6432Node","HKCU:\SOFTWARE","HKCU:\SOFTWARE\WOW6432Node")
foreach ($key in $keys) {
[string] $subkey=$key + "\Microsoft\Windows\CurrentVersion\Uninstall\*"
Test-Path $subkey | out-null
if ($? -eq 0) {
[array] $apps+=Get-ItemProperty $subkey | where {$_.DisplayName -notlike ""}
}
}
$apps | Select-Object DisplayName, DisplayVersion, Publisher | Sort-Object DisplayName | Get-Unique -AsString | Format-Table -HideTableHeaders
}
ListeProgrammes
Merci d'avance pour votre aide.
Connexion ou Créer un compte pour participer à la conversation.
- Alain
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 7 mois 3 semaines - il y a 7 mois 3 semaines #34179
par Alain
Réponse de Alain sur le sujet Transformation code en fonction
J'ai trouvé la solution, finalement il y avait un problème au niveau du test dans la condition if, j'ai rectifié comme ceci :
[array] $keys=@("HKLM:\SOFTWARE","HKLM:\SOFTWARE\WOW6432Node","HKCU:\SOFTWARE","HKCU:\SOFTWARE\WOW6432Node")
foreach ($key in $keys) {
[string] $subkey=$key + "\Microsoft\Windows\CurrentVersion\Uninstall\*"
$test=Test-Path $subkey -ErrorAction SilentlyContinue
if ($test) {
[array] $apps+=Get-ItemProperty $subkey | where {$_.DisplayName -notlike ""}
}
}
$apps | Select-Object DisplayName, DisplayVersion, Publisher | Sort-Object DisplayName | Get-Unique -AsString | Format-Table -HideTableHeaders
[array] $keys=@("HKLM:\SOFTWARE","HKLM:\SOFTWARE\WOW6432Node","HKCU:\SOFTWARE","HKCU:\SOFTWARE\WOW6432Node")
foreach ($key in $keys) {
[string] $subkey=$key + "\Microsoft\Windows\CurrentVersion\Uninstall\*"
$test=Test-Path $subkey -ErrorAction SilentlyContinue
if ($test) {
[array] $apps+=Get-ItemProperty $subkey | where {$_.DisplayName -notlike ""}
}
}
$apps | Select-Object DisplayName, DisplayVersion, Publisher | Sort-Object DisplayName | Get-Unique -AsString | Format-Table -HideTableHeaders
Dernière édition: il y a 7 mois 3 semaines par Alain.
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 7 mois 3 semaines - il y a 7 mois 3 semaines #34180
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 Transformation code en fonction
Bonjour Alain,
Sois le bienvenu sur le forum !
Même si ça fonctionne, j'ai quand même 2 remarques sur ton code.
1. Lorsque tu crées une fonction, il est préférable de le faire ainsi :
et de déclarer tes paramètres à l'intérieur de ton bloc Param qui est prévu à cet effet. Tel que tu le fais fonctionne, mais ce n'est pas recommandé et en plus on dirait du JavaScript .
2. Une fonction ne devrait jamais retourner un objet formaté avec la commande Format-Table. D'ailleurs, une commande de formatage ne devrait jamais se trouver dans un script, point final !
Car le problème avec ça, c'est que ton objet, bien que "joli", n'est plus utilisable. Car quel que soit le traitement que tu peux appliquer après, ça échouera car ton objet n'est plus du tout le même.
En PowerShell, on laisse le soin à l'utilisateur final de faire ce qu'il souhaite avec les données et on ne lui impose pas un formatage.
Après, il est toujours possible de le faire, mais dans ce cas, il faudrait créer un type d'objet personnalisé et créer des fichiers de formatage associés. Mais là c'est une autre paire de manches.
Arnaud
Sois le bienvenu sur le forum !
Même si ça fonctionne, j'ai quand même 2 remarques sur ton code.
1. Lorsque tu crées une fonction, il est préférable de le faire ainsi :
Function Get-SomeThing {
Param ()
}
et de déclarer tes paramètres à l'intérieur de ton bloc Param qui est prévu à cet effet. Tel que tu le fais fonctionne, mais ce n'est pas recommandé et en plus on dirait du JavaScript .
2. Une fonction ne devrait jamais retourner un objet formaté avec la commande Format-Table. D'ailleurs, une commande de formatage ne devrait jamais se trouver dans un script, point final !
Car le problème avec ça, c'est que ton objet, bien que "joli", n'est plus utilisable. Car quel que soit le traitement que tu peux appliquer après, ça échouera car ton objet n'est plus du tout le même.
En PowerShell, on laisse le soin à l'utilisateur final de faire ce qu'il souhaite avec les données et on ne lui impose pas un formatage.
Après, il est toujours possible de le faire, mais dans ce cas, il faudrait créer un type d'objet personnalisé et créer des fichiers de formatage associés. Mais là c'est une autre paire de manches.
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 ?
Dernière édition: il y a 7 mois 3 semaines par Arnaud Petitjean.
Connexion ou Créer un compte pour participer à la conversation.
- Alain
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 7 mois 3 semaines #34182
par Alain
Réponse de Alain sur le sujet Transformation code en fonction
Bonjour Arnaud,
Merci pour tes recommandations, j'en prends bonne note.
Merci pour tes recommandations, j'en prends bonne note.
Connexion ou Créer un compte pour participer à la conversation.
- Alastor
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 35
- Remerciements reçus 1
il y a 7 mois 2 semaines - il y a 7 mois 2 semaines #34191
par Alastor
Réponse de Alastor sur le sujet Transformation code en fonction
Hello,
Je vais me permettre de faire deux remarques deplus.
Dans la ligne ci-dessus tu fais un "+=" sur une variable que tu n'as pas initialisée avant de l'utiliser. C'est une source d'erreur ! En l'occurence ça ne fonctionne que parce que tu as précisé explicitement le type, ici [array]. Mais ce n'est pas du tout une bonne pratique.
Il faut initialiser ta variable App avant la boucle, et faire ensuite le += dans la boucle, comme ci-dessous :
Enfin, le nom de la variable test est bien mal choisi...
Premièrement, l'usage d'une variable est facultatif, le code suivant par exemple, fonctionne
Mais faire une variable est une bonne idée, pour lui faire porter du sens, et économiser des commentaires, comme ci-dessous :
[ccode]
$SubKeyExist=Test-Path $subkey -ErrorAction SilentlyContinue
if ($SubKeyExist) {
$apps+=Get-ItemProperty $subkey | where {$_.DisplayName -notlike ""}
}
[/code]
Le même code, mais porteur de sens pour sa maintenance.
Je vais me permettre de faire deux remarques deplus.
[array] $apps+=Get-ItemProperty $subkey | where {$_.DisplayName -notlike ""}
Dans la ligne ci-dessus tu fais un "+=" sur une variable que tu n'as pas initialisée avant de l'utiliser. C'est une source d'erreur ! En l'occurence ça ne fonctionne que parce que tu as précisé explicitement le type, ici [array]. Mais ce n'est pas du tout une bonne pratique.
Il faut initialiser ta variable App avant la boucle, et faire ensuite le += dans la boucle, comme ci-dessous :
$apps = @()
foreach ($key in $keys) {
...
$apps+=Get-ItemProperty $subkey | where {$_.DisplayName -notlike ""}
...
}
Enfin, le nom de la variable test est bien mal choisi...
Premièrement, l'usage d'une variable est facultatif, le code suivant par exemple, fonctionne
if (Test-Path $subkey -ErrorAction SilentlyContinue) {
$apps+=Get-ItemProperty $subkey | where {$_.DisplayName -notlike ""}
}
Mais faire une variable est une bonne idée, pour lui faire porter du sens, et économiser des commentaires, comme ci-dessous :
[ccode]
$SubKeyExist=Test-Path $subkey -ErrorAction SilentlyContinue
if ($SubKeyExist) {
$apps+=Get-ItemProperty $subkey | where {$_.DisplayName -notlike ""}
}
[/code]
Le même code, mais porteur de sens pour sa maintenance.
Dernière édition: il y a 7 mois 2 semaines par Alastor. Raison: coquilles
Connexion ou Créer un compte pour participer à la conversation.
- Alastor
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 35
- Remerciements reçus 1
il y a 7 mois 2 semaines #34192
par Alastor
Réponse de Alastor sur le sujet Transformation code en fonction
Euh... editer son message fonctionne de manière très aléatoire visiblement, je suis dans l'incapacité de corriger les coquilles...
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.110 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Transformation code en fonction