Использование PowerShell объекта where в функции скрипта не работает - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь включить свой скрипт профиля powershell с помощью функции, которая позволит мне выполнять буквальный и групповой поиск присутствия функции в моем текущем сеансе терминала powershell.

В моем скрипте профиля powershell [$ env: userprofile \ Documents \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1] я создал следующую функцию.

function Get-Fnc { 
    #Get-ChildItem function:\ | Where-Object { $_.Name -like "$args" }
    Get-ChildItem function:\$args
}

Использование закомментированной строки Get-ChildItem function:\ | Where-Object { $_.Name -like "$args" } не работает, хотя я могу использовать ее в командной строке, например, Get-ChildItem function:\ | Where-Object { $_.Name -like "get-*" }, она работает как положено. Использование строки без комментария Get-ChildItem function:\$args работает как в функции сценария профиля, так и в командной строке, например, Get-ChildItem function:\get-*.

Поиск по net и в stackoverflow, я не смог найти никаких подробностей о полученных ошибках использование выходного конвейера | в другом командлете и / или использование командлета Where-Object внутри функций для определения того, как заставить его работать. Есть какие-нибудь идеи о том, как сделать так, чтобы выходные данные передавались по каналу, где-объект работал в функции сценария, когда известно, что то же самое работает в командной строке?

Обновление В дополнение к ответу при условии, что solutin также был возможность использовать следующие

function Get-Fnc { 
    $argsFncScope = $args # works because we make function scoped copy of args that flows down into Where-Object script block / stack frame
    Write-Host "function scoped args assigned variable argsFncScope = $argsFncScope and count = $($argsFncScope.Count) and type = $($argsFncScope.GetType().BaseType)"
    Get-ChildItem function:\ | Where-Object { $_.Name -like "$argsFncScope" } 
}

Отладочный вывод

get-fnc *-env

[DBG]: PS C:\Users\myusrn\Documents\WindowsPowerShell> 
function scoped args assigned variable argsFncScope = *-env and count = 1 and type = array

[DBG]: PS C:\Users\myusrn\Documents\WindowsPowerShell>

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Get-Env

1 Ответ

1 голос
/ 29 апреля 2020

Каждый скрипт-блок имеет собственную переменную $ args automati c.

function Get-Fnc { 
  Get-ChildItem function:\ | where-object { write-host $args; 
    $_.name -like "$args" } }

get-fnc get-*




# lots of empty lines

Аргумент $ для where-object является массивом $ null.

function Get-Fnc {   
  Get-ChildItem function:\ | where-object { $global:myargs = $args;
    $_.name -like "$args" } }

get-fnc get-*

$myargs

$myargs.count

0

$myargs.gettype()

IsPublic IsSerial Name     BaseType
-------- -------- ----     --------
True     True     Object[] System.Array

Однако вы можете использовать другую версию where-object, в которой не используется блок сценария:

function Get-Fnc { 
  Get-ChildItem function:\ | where-object name -like $args }

get-fnc get-*

CommandType Name    Version Source
----------- ----    ------- ------
Function    Get-Fnc

См. Также: Почему PowerShell Where-Object не работает при передаче переменной?

На самом деле я не знаю, как установить $ args внутри скриптового блока where-object, но вот еще один пример скриптового блока и $ args. $ args на самом деле является массивом .

& { $args[0]; $args[1] } hi there

hi
there
...