Résolu Transformation code en fonction

Plus d'informations
il y a 7 mois 3 semaines #34178 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 :
[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.

Plus d'informations
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
Dernière édition: il y a 7 mois 3 semaines par Alain.

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

Plus d'informations
il y a 7 mois 3 semaines - il y a 7 mois 3 semaines #34180 par Arnaud Petitjean
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 :

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.

Plus d'informations
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.

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

Plus d'informations
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.
        [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.

Plus d'informations
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
Propulsé par Kunena