3 votes

Comportement étrange de la liste de format dans ce script PowerShell

J'ai un comportement étrange avec format-list. Lorsque je colle directement le code suivant dans l'interpréteur de commandes - tout fonctionne parfaitement :

    @("Administrateur","UnUtilisateur","UnAutreUtilisateur") |% {
        $uname = $_;
        $u = gwmi win32_useraccount |? { $_.Name –eq $uname }
        if (-not $u) {
            write-host ("[-] "+ $uname + " n'existe pas!")
        } else {
            write-host ("[+] "+ $uname + ":")
            $u
        }
    }

    @("Administrateur","UnUtilisateur","UnAutreUtilisateur") |% {
        $uname = $_;
        gwmi win32_groupuser -computer . | select GroupComponent,PartComponent |? { $_.PartComponent -match ",Name=`""+$uname+"`""} | fl *
    }

Cependant, lorsque je mets le même code dans une fonction, disons test, et que j'appelle test, PowerShell affiche une erreur à propos de format-list. Je n'arrive pas à comprendre pourquoi - peut-être que j'ai cherché du mauvais côté, mais je n'ai rien trouvé.

    function test {
        @("Administrateur","UnUtilisateur","UnAutreUtilisateur") |% {
            $uname = $_;
            $u = gwmi win32_useraccount |? { $_.Name –eq $uname }
            if (-not $u) {
                write-host ("[-] "+ $uname + " n'existe pas!")
            } else {
                write-host ("[+] "+ $uname + ":")
                $u
            }
        }

        @("Administrateur","UnUtilisateur","UnAutreUtilisateur") |% {
            $uname = $_;
            gwmi win32_groupuser -computer . | select GroupComponent,PartComponent |? { $_.PartComponent -match ",Name=`""+$uname+"`""} | fl *
        }
    }

Le message d'erreur affiché est :

out-lineoutput : L'objet de type "Microsoft.PowerShell.Commands.Internal.Format.FormatStartData" n'est pas valide ou pas dans la séquence correcte. Cela est vraisemblablement causé par une commande "format-list" spécifiée par l'utilisateur qui entre en conflit avec le formatage par défaut.
+ CatégorieInfo : InvalidData: (:) [out-lineoutput], InvalidOperationException
+ Identifiant d'erreur entièrement qualifié : ConsoleLineOutputOutOfSequencePacket,Microsoft.PowerShell.Commands.OutLineOutputCommand

Une capture d'écran du problème :

Description de l'image

7voto

Mathias R. Jessen Points 24807

Une fonction est censée retourner un ou plusieurs objets, et non pas des données formatées en sortie (qui sont destinées à l'hôte/à l'écran).

En d'autres termes, ne pas utiliser les cmdlets Format-* à l'intérieur d'une fonction

Il suffit de supprimer |fl * de la dernière instruction, et de rediriger la sortie de l'appel de fonction test vers Format-List à la place:

function test {
    @("Administrateur","SomeUser","SomeOtherUser") |% {
        $uname = $_;
        $u = gwmi win32_useraccount |? { $_.Name –eq $uname }
        if (-not $u) {
            write-host ("[-] "+ $uname + " n'existe pas!")
        } else {
            write-host ("[+] "+ $uname + ":")
            $u
        }
    }

    @("Administrateur","SomeUser","SomeOtherUser") |% {
        $uname = $_;
        gwmi win32_groupuser -computer . | select GroupComponent,PartComponent |? { $_.PartComponent -match ",Name=`""+$uname+"`""}
    }
}

test |fl *

Dans le même ordre d'idées, au moins pour l'écriture de fonctions réutilisables:

Vous pourriez également bénéficier de l'utilisation du paramètre -Query avec Get-WmiObject, et laisser WMI effectuer le filtrage au lieu de renvoyer tous les utilisateurs à powershell et de les filtrer ensuite

Get-WmiObject -Query "SELECT * FROM Win32_UserAccount WHERE Name = '$uname'"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X