2016-11-29 52 views
0

我正在Powershell上写一个搜索工具,我遇到了一个问题,我无法抑制函数的返回,并且它始终打印到控制台。 为了说清楚我做了一些较小的测试功能。Powershell:Supress输出到控制台,如果它是流水线

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来实现它,我错过了在线?

,如果它不涉及从客户

感谢您的任何行动提前

回答

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

非常感谢您的回复,但我很抱歉,也许我的问题不是自我解释。我必须使用写主机,因为它向用户提供数据。我真正要问的是,有没有一种方法可以确定函数本身的返回值是否是流水线? 我需要为计算增加$ PrevRes值,但是当它不再流水线时,我不想将其输出到屏幕。所以在我和我只需要阿尔法贝塔和欧米茄没有数字在最后。 – SokIsKedu

+0

@SokIsKedu我不确定你的意思是“如果返回值是流水线的” - 在PowerShell中,函数发出0个或更多对象,最后一个在return语句之后。如果管道中的下一个东西是另一个功能,则对象将被发送到它,否则返回给调用者 –

+0

如果您的客户“不知道如何使用它”,那他为什么要求您提供它? –

1

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

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