2012-03-22 42 views
1

我知道标题是有点混乱,但我不能想出更好的办法来句话吧。寻找一种方式让所有的功能将输出发送到另一个功能

我有一对夫妇打功能的PowerShell脚本。目前,我在每个函数中都有完全相同的代码来格式化输出。这里有一个片段:

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

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

输出代码是完全一样的。作为代码重复数据删除的粉丝,这让我疯狂,因为每次我添加一个新函数时,我都必须应用这个模板代码。我试图把整个脚本在try/catch块和投掷的是输出的对象,但我不能让它工作,这仍然需要在每一个功能相同的throw语句编码。

有谁知道我能够做到让所有的在这个脚本这些功能的输出自动发送给另一个函数或我只是将不得不住在一起呢?

+0

你在做什么样的输出格式,你如何输出它们?这些对象是否都是同一类型?也许一个代理函数对于任何你使用的out- *或write- *都会实现该类型对象的自定义格式化? – mjolinor 2012-03-22 20:05:12

+0

这些函数只是输出一个有几个元素的有序哈希表。它们都是相同的类型。 – 2012-03-23 00:11:33

+0

如果它涉及到其他线程的想法是,刚刚被从测试通过哈希表来测试原样。每个测试都增加了一点点。在所有测试结束时,将其传递给New-TestResult函数,并返回由哈希表构建的对象。 – mjolinor 2012-03-23 00:28:16

回答

2

如果函数没有参数,你可以使用这个简单的解决方案:

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 
} 

正如你所看到的功能得到函数体和assignes新的身体与格式代码。你可以试试,只需复制&粘贴下面的代码。

# 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 
+0

这些功能都有一个参数。他们是我竞选对手多台电脑来检查的东西像服务启动PC检查,文件存在,等等 – 2012-03-23 00:12:34

+0

好,改变所以它与一个PARAM工程;) – stej 2012-03-23 07:28:51