Powershell:如果是流水线,则将输出抑制到控制台

时间:2016-11-29 17:06:52

标签: powershell return output suppress

我正在Powershell上编写一个搜索工具,我遇到了一个问题,我无法抑制函数的返回,它总是打印到控制台。 为了说清楚,我做了一些较小的测试功能。

Function test1
{
    param(
    [Parameter(Mandatory=$false,ValueFromPipeline=$True)]
    $PrevRes = 0)
    write-host "alfa"
    return ($PrevRes+1)
}

Function test2
{
 param(
    [Parameter(Mandatory=$false,ValueFromPipeline=$True)]
    $PrevRes = 0)
    write-host "beta"
    return ($PrevRes+1) 
}

Function test3
{
 param(
    [Parameter(Mandatory=$false,ValueFromPipeline=$True)]
    $PrevRes = 0)
    write-host "omega"
    return ($PrevRes+1)
}

test1 gives:  
alfa
1

when test1 | test2:
alfa
beta
2

when test | test2 | test3:
alfa
beta
omega
3

when test | test3 | test2:
alfa
omega
beta
3

问题是我不知道这些函数将以什么顺序被调用,我需要的是确保最后没有管道,返回不会打印到屏幕上,但我仍然需要访问价值本身。

我想要这样的输出:

test1 gives:  
alfa


when test1 | test2:
alfa
beta


when test | test2 | test3:
alfa
beta
omega


when test | test3 | test2:
alfa
omega
beta

这是一个为客户提供解决方案的工具,如:

$tst = test1 |test2

不好,因为你知道,客户是客户,他不知道如何使用它。

有没有办法用PowerShell做到这一点,我在网上错过了?

如果不涉及客户的任何行动,任何解决方案都会有用

提前谢谢

2 个答案:

答案 0 :(得分:3)

回答问题

  

有没有办法在函数本身中确定返回值是否为流水线?

是的。检查$MyInvocation自动变量并比较PipelineLengthPipelinePosition属性:

if($MyInvocation.PipelinePosition -lt $MyInvocation.PipelineLength){
    return $PrevRes + 1
}

原始答案如下。

非常简单的解决方案:

不要在脚本中使用Write-Host

如名称所示,它将内容直接写入主机应用程序

如果您需要保留这些语句以进行调试,请改用Write-DebugWrite-Verbose cmdlet:

function test1
{
    param(
    [Parameter(Mandatory=$false,ValueFromPipeline=$True)]
    $PrevRes = 0)
    Write-Verbose "alfa"
    return ($PrevRes+1)
}

function test2
{
 param(
    [Parameter(Mandatory=$false,ValueFromPipeline=$True)]
    $PrevRes = 0)
    Write-Verbose "beta"
    return ($PrevRes+1) 
}

function test3
{
 param(
    [Parameter(Mandatory=$false,ValueFromPipeline=$True)]
    $PrevRes = 0)
    Write-Verbose "omega"
    return ($PrevRes+1)
}

如果需要在cmdlet之间增加$PrevRes值,可以使用调用范围中的变量(尽管这有点像反模式,我强烈建议不要使用它):

function test1 {
  Write-Host 'alpha'
  $global:PrevRes++
}

function test2 {
  Write-Host 'beta'
  $global:PrevRes++
}

function test3 {
  Write-Host 'omega'
  $global:PrevRes++
}

然后使用:

PS> test1; test2; test3
alpha
beta
omega
PS> $PrevRes
3

答案 1 :(得分:1)

@Mathias是正确的,但从问题的外观来看,您使用Write-Host输出作为用户的实际返回值,而不是实际返回数据。在这种情况下,你真的想做更像这样的事情。但正如已经说过的那样,除了早期开发/调试脚本之外,不要使用Write-Host。

Function test1
{
  param(
  [Parameter(Mandatory=$false,ValueFromPipeline=$True)]
  $PrevRes = @())
  $PrevRes += 'alpha'
  return ($PrevRes)
}