2016-11-29 10 views
0

Я пишу инструмент поиска на Powershell, и я столкнулся с проблемой, что я не могу подавить возврат функции, и она всегда печатается на консоли. Чтобы было ясно, я сделал несколько более мелких тестовых функций.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, которую я пропустил в Интернете?

Любое решение было бы полезно, если она не включает в себя каких-либо действий со стороны заказчика

Спасибо заранее

ответ

3

Чтобы ответить на этот вопрос

есть способ, чтобы определить, в функции само, если возвращаемое значение конвейерно или нет?

Да, есть. Проверьте $MyInvocation автоматическую переменную и сравнить PipelineLength и PipelinePosition свойства:

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

Оригинальный ответ следует ниже.


Очень простое решение:

Не используйте Write-Host в сценариях.

Как видно из названия, это будет писать материал непосредственно к хоста приложения

Если вам нужно сохранить эти заявления для отладки, используйте Write-Debug или Write-Verbose командлеты вместо:

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) 
} 

Если вам нужно увеличить значение $PrevRes между командлетами, вы можете использовать переменную от th е вызова сферы (хотя это несколько из анти-паттерна, и я настоятельно рекомендую против него):

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) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^