Comportamento estranho de lista de formatos neste script do PowerShell

3

Eu tenho um comportamento estranho com a lista de formatos. Quando colo o seguinte código diretamente no shell - tudo funciona como um encanto:

    @("Administrator","SomeUser","SomeOtherUser") |% {
        $uname = $_;
        $u = gwmi win32_useraccount |? { $_.Name –eq $uname }
        if (-not $u) {
            write-host ("[-] "+ $uname + " does not exist!")
        } else {
            write-host ("[+] "+ $uname + ":")
            $u
        }
    }

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

No entanto, quando coloco o mesmo código em uma função, digamos, teste e teste de chamada, o PowerShell solta um erro sobre a lista de formatos. Eu não consigo entender por que - talvez eu tenha procurado o lado errado, mas não encontrei nada.

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

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

A mensagem de erro exibida é:

out-lineoutput : The object of type "Microsoft.PowerShell.Commands.Internal.Format.FormatStartData" is not valid or not in the correct sequence. This is likely caused by
a user-specified "format-list" command which is conflicting with the default formatting.
+ CategoryInfo : InvalidData: (:) [out-lineoutput], InvalidOperationException
+ FullyQualifiedErrorId : ConsoleLineOutputOutOfSequencePacket,Microsoft.PowerShell.Commands.OutLineOutputCommand

Uma captura de tela do problema:

    
por go chilla 30.07.2014 / 12:37

1 resposta

7

Uma função deve retornar um ou mais Objetos, dados de saída não formatados (que são destinados ao host / tela).

Em outras palavras, não use cmdlets Format- * dentro de uma função

Basta remover |fl * da última declaração e canalizar a saída da chamada de função test para Format-List :

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

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

test |fl *

Na mesma linha, pelo menos para escrever funções reutilizáveis:

Você também pode se beneficiar do uso do parâmetro -Query com Get-WmiObject e fazer com que o WMI faça a filtragem, em vez de retornar todos os usuários ao powershell e então filtrá-los

Get-WmiObject -Query "SELECT * FROM Win32_UserAccount WHERE Name = '$uname'"
    
por 30.07.2014 / 13:20

Tags