我正在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做到这一点,我在网上错过了?
如果不涉及客户的任何行动,任何解决方案都会有用
提前谢谢
答案 0 :(得分:3)
回答问题
有没有办法在函数本身中确定返回值是否为流水线?
是的。检查$MyInvocation
自动变量并比较PipelineLength
和PipelinePosition
属性:
if($MyInvocation.PipelinePosition -lt $MyInvocation.PipelineLength){
return $PrevRes + 1
}
原始答案如下。
非常简单的解决方案:
Write-Host
。如名称所示,它将将内容直接写入主机应用程序
如果您需要保留这些语句以进行调试,请改用Write-Debug
或Write-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)
}