Назад | Перейти на главную страницу

Странное поведение списка форматов в этом сценарии PowerShell

У меня странное поведение с форматным списком. Когда я вставляю следующий код прямо в оболочку - все работает как шарм:

    @("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 *
    }

Однако, когда я помещаю один и тот же код в функцию, скажем, test и call test, PowerShell выдает ошибку о списке форматов. Не могу понять почему - может, искал не с того конца, но ничего не нашел.

    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 *
        }
    }

Отображаемое сообщение об ошибке:

out-lineoutput: объект типа «Microsoft.PowerShell.Commands.Internal.Format.FormatStartData» недействителен или находится в неправильной последовательности. Вероятно, это вызвано
указанная пользователем команда "список-форматов", которая конфликтует с форматированием по умолчанию.
+ CategoryInfo: InvalidData: (:) [out-lineoutput], InvalidOperationException
+ FullyQualifiedErrorId: ConsoleLineOutputOutOfSequencePacket, Microsoft.PowerShell.Commands.OutLineOutputCommand

Скриншот проблемы:

Предполагается, что функция возвращает один или несколько объектов, а не форматированные выходные данные (которые предназначены для хоста / экрана).

Другими словами, не используйте командлеты Format- * внутри функции

Просто удалить |fl * из последнего оператора и перетащите вывод из test вызов функции 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 *

В том же духе, по крайней мере, для написания повторно используемых функций:

Вам также может быть полезно использовать -Query параметр с Get-WmiObject, и пусть WMI выполняет фильтрацию вместо того, чтобы возвращать всех пользователей в PowerShell и затем фильтруя их

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