2017-10-06 31 views
2

我有一个复杂的函数(不是一个班轮),它接收一个对象,做一些工作人员,然后它应该返回相同的对象回管道。确保只有预期的对象从一个函数传递到管道

函数体打开文件进行写入,从Web服务下载某些内容等。它还通过打印到控制台向用户提供反馈。

function($obj) 
{ 
    do some staff 
    more staff 
    $obj 
} 

我如何确保只有预期的对象被返回到管道,并没有别的像印刷到能够从我在函数体中运行命令打印控制台或什么文字?

我认为写主机不应该影响管道。但不确定其他命令。也许,有一些方法可以做到这一点。还没有找到任何东西。

+0

吞食只是用个e在函数结尾处返回$ obj语句,以便返回。 –

+2

@SagePourpre这不会使'$ obj'必然成为传递给管道的唯一对象。 –

+0

@ManuelBatsching什么?!那么,我不得不为自己测试这个......当然,你是100%正确的。今天学到的另一件事!谢谢 ! –

回答

0

只有输出流将被传递到管道。如果您使用像Write-Verbose,Write-Warning或(如果您必须)Write-Host cmdlet处理您的控制台输出,它们将不会干扰管道。

如果您正在使用带有返回值的cmdlet,并且您不希望将其传递给输出流或变量,则可以将它们传输到Out-Null作为选项。

+0

Write-Host有问题吗? –

+0

另外,我不确定每个命令可以返回什么。例如,它可以保持沉默,然后在遇到错误时打印消息。然后它将走向管道。 –

+0

经典的答案是,对于大多数用例来说,'Write-Host'有更好的选择:fhttp://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/ –

2

一种策略可能是包裹函数体中一个单独的块,点源,但由它禁止所有输出,然后return的变数,您需要从主块外返回:

function Do-Stuff 
{ 
    param($obj) 

    $null = . { 
    Get-Random 
    $obj.Stuff = "Modified" 
    Write-Output "All sorts of noise" 
    } 
    return $obj 
} 

现在你可以这样做:

PS C:\> Do-Stuff -obj ([pscustomobject]@{Name="MyObject";Stuff="Original"}) 

Name  Stuff 
----  ----- 
MyObject Modified 

并返回只$obj,一切由$null

+0

这可能有效。需要测试如果任何命令生成某些输出会发生什么,它会丢失还是仍然显示在控制台中。我想这取决于它是否使用写 - 详细,写主机等 –

+0

它将全部丢失。你可以管''。 {}'声明到'Write-Host'而不是如果你想让它显示在控制台上 –

+0

Thanks Mathias! –

相关问题