Как избежать вывода данных на стандартный вывод в возвращаемом значении? - PullRequest
13 голосов
/ 11 января 2011

При некоторой автоматизации Powershell у меня возникают проблемы с автоматическим захватом данных, записываемых в стандартный вывод с помощью файла .cmd. У меня есть две функции, которые делают что-то вроде следующего:

function a {
    & external.cmd # prints "foo"
    return "bar"
}

function b {
    $val = a
    echo $val # prints "foobar", rather than just "bar"
}

В основном, данные, которые external.cmd отправляет на стандартный вывод, добавляются к возвращаемому значению a, хотя все, что я действительно хочу вернуть из a, - это строка, которую я указал. Как я могу предотвратить это?

Ответы [ 3 ]

15 голосов
/ 11 января 2011

Вот несколько различных подходов для обработки этого:

  • захватить вывод сценария .cmd:

    $output = & external.cmd # saves foo to $output so it isn't returned from the function
    
  • перенаправлениевывод на нуль (выбросить)

    & external.cmd | Out-Null # throws stdout away
    
  • перенаправить его в файл

    & external.cmd | Out-File filename.txt
    
  • игнорировать его в вызывающейпропуская его в массиве объектов, возвращаемых функцией

    $val = a
    echo $val[1] #prints second object returned from function a (foo is object 1... $val[0])
    

В PowerShell любое выходное значение, которое ваш код не захватывает, возвращается вызывающей стороне (включаястандартный вывод, стандартный вывод и т. д.).Таким образом, вам нужно захватить или передать это по каналу, который не возвращает значение, или вы получите объект [] в качестве возвращаемого значения из функции.

Ключевое слово return действительнопросто для наглядности и немедленного выхода из блока скриптов в PowerShell.Нечто подобное будет работать (не дословно, а просто чтобы дать вам идею):

function foo()
{
    "a"
    "b"
    "c"
}

PS> $bar = foo
PS> $bar.gettype()
System.Object[]
PS> $bar
a
b
c

function foobar()
{
    "a"
    return "b"
    "c"
}

PS> $myVar = foobar
PS> $myVar
a
b
7 голосов
/ 24 августа 2013

Я обычно предпочитаю использовать один из следующих двух методов, которые, на мой взгляд, делают код более читабельным:

  • Привести выражение к void для подавления возвращаемого значения:

    [void] (expression)

  • Назначьте выходное значение переменной $ null:

    $null = expression

Например:

function foo
{
    # do some work
    return "success"
}

function bar
{
    [void] (foo)  # no output
    $null = foo   # no output
    return "bar"
}

bar # outputs bar
2 голосов
/ 05 августа 2015

Если вы хотите, чтобы вывод команды по-прежнему печатался в командной строке powershell, вы можете сделать вариант принятого ответа:

& external.cmd | Out-Host
...