Передача в объекты / свойства / методы в PowerShell - PullRequest
3 голосов
/ 03 октября 2011

В PowerShell вы можете передавать в командлеты и в скриптовые функции. Но можно ли передать в объекты, свойства или функции-члены?

Например, если у меня есть объект подключения к базе данных $dbCon, я хочу иметь возможность примерно так:

$dbCon.GetSomeRecords() | <code-to-manipulate-those-records | $dbCon.WriteBackRecords()

Я знаю, что та же функциональность может быть достигнута с помощью Foreach-Object или с помощью командлета, который получает объект в качестве аргумента - причина, по которой я хочу передать по конвейеру непосредственно к объекту или его членам, заключается в достижении элегантности и сохранении ООП стиль (использование метода объекта вместо отправки объекта в качестве аргумента)

Возможно ли это?


EDIT:

Похоже, что люди не понимают мой вопрос, поэтому мне нужно уточнить его:

PowerShell может передавать обычные функции. Я могу написать:

function ScriptedFunction
{
    $input|foreach{"Got "+$_}
}
1,2,3|ScriptedFunction

и получите
Got 1<br> Got 2<br> Got 3
В результате. Но когда я пытаюсь использовать эту технику с помощью скриптового метода:

$object=New-Object System.Object
$object|Add-Member -MemberType ScriptMethod -Name ScriptedMethod -Value {$input|foreach{"Got "+$_}}
1,2,3|$object.ScriptedMethod

Я получаю сообщение об ошибке: Expressions are only allowed as the first element of a pipeline. (добавление () не помогает, кстати). Я ищу способ заставить эту команду работать так же, как она работает с глобальными функциями.

Ответы [ 2 ]

3 голосов
/ 03 октября 2011

Это не совсем то, что вы просите, но у него почти тот же синтаксис: используйте NoteProperty вместо ScriptedMethod и вызывайте его с помощью операторов . или &:

$object = New-Object System.Object
$object | Add-Member -MemberType NoteProperty -Name Script -Value {$input|foreach{"Got "+$_}}
1,2,3 | & $object.Script

Вывод

Got 1
Got 2
Got 3

НО: Предостережение, возможно, стопор шоу: это вообще не метод сценария, не будет $this, определяемого ядромдля этого (вы можете определить $this = $object перед вызовом самостоятельно, но это довольно уродливо, лучше отправить $object в качестве параметра).

0 голосов
/ 03 октября 2011

Если я подписан, вы можете присоединить новые методы сценария к выходу из объектов с помощью командлета Add-Member (см. Пример кода № 4 в справке). Вы также можете добавить их в файл типа (xml) и загрузить файл с помощью командлета Update-TypeData, чтобы они стали автоматически доступны, когда у вас есть определенный тип объектов.

UPDATE

Вы не можете передавать методы. Добавленные вами методы доступны для объектов:

function ScriptedFunction
{
    process
    {
        $object = $_
        $object = $object | Add-Member -MemberType ScriptMethod -Name Increment -Value {$this+1} -PassThru -Force
        $object
    }
}

$newObjects = 1,2,3 | ScriptedFunction 
# increment the first object, its value is one, when the 
# Incereent method is invoked you get 2
$newObjects[0].Increment() 

2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...