Ищите способ, чтобы все функции отправляли вывод в другую функцию - PullRequest
1 голос
/ 22 марта 2012

Я понимаю, что название немного сбивает с толку, но я не мог придумать лучший способ выразить это.

У меня есть скрипт Powershell с парой дюжин функций. В настоящее время у меня есть одинаковый код в каждой функции для форматирования вывода. Вот фрагмент кода:

function function1 () {
    do something...
    output code here
}

function function2 () {
    do something...
    output code here
}

Код вывода точно такой же. Будучи фанатом дедупликации кода, это сводит меня с ума, потому что каждый раз, когда я добавляю новую функцию, у меня появляется этот шаблон кода, который я должен применить. Я попытался поместить весь скрипт в блок try / catch и выдать объект, который выводится, но я не смог заставить его работать, но для этого все еще требуется кодирование в одном и том же операторе throw в каждой функции.

Кто-нибудь знает что-то, что я могу сделать, чтобы все эти функции в этом скрипте автоматически отправляли свои выходные данные другой функции, или мне просто придется с этим смириться?

1 Ответ

2 голосов
/ 22 марта 2012

Если функции не имеют параметров, вы можете использовать это простое решение:

function addOutputCode {
    param($name)
    $oldBody = (get-item function:$name).ScriptBlock
    $newBody = {
        param($computer) 
        $funcOutput = . $oldBody $computer
        # some formatting
        $funcOutput | % { 'FORMATTED: ' + $_ }
    }.GetNewClosure()
    Set-Item function:$name -value $newBody
}

Как видите, функции получают тело функции и присваивают новое тело с кодом форматирования.Вы можете попробовать это, просто скопируйте и вставьте код ниже.

# this is your file with defined functions
function f1 { param($c) 'this is test of ' + $c }
function f2 { $c.Length; 'this was length of $c' }
# now f1 and f2 would return unformatted data
# f1 
# f2

# add formatting code
addOutputCode f1
addOutputCode f2
# now if you call f1 or f2, they return formatted data
# f1 comp1
# f2 comp2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...