开发者

How do I avoid getting data printed to stdout in my return value?

开发者 https://www.devze.com 2023-02-03 12:14 出处:网络
In doing some Powershell automation, I\'m having trouble with the way that data written to stdout by开发者_如何学C a .cmd file is automatically captured. I have two functions that do something like th

In doing some Powershell automation, I'm having trouble with the way that data written to stdout by开发者_如何学C a .cmd file is automatically captured. I have two functions that do something like the following:

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

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

Basically, data that external.cmd sends to stdout is added to the return value of a, even though all I really want to return from a is the string that I specified. How can I prevent this?


Here are a few different approaches for handling this:

  • capture the output of the .cmd script:

    $output = & external.cmd # saves foo to $output so it isn't returned from the function
    
  • redirect the output to null (throw it away)

    & external.cmd | Out-Null # throws stdout away
    
  • redirect it to a file

    & external.cmd | Out-File filename.txt
    
  • ignore it in the caller by skipping it in the array of objects that's returned from the function

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

In PowerShell, any output value your code does not capture is returned the caller (including stdout, stderr, etc). So you have to capture or pipe it to something that doesn't return a value, or you'll end up with an object[] as your return value from the function.

The return keyword is really just for clarity and immediate exit of a script block in PowerShell. Something like this would even work (not verbatim but just to give you the idea):

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


I generally prefer to use one of the following two techniques which, in my opinion, make the code more readable:

  • Cast an expression to void in order to suppress the return value:

    [void] (expression)

  • Assign the output value to the $null variable:

    $null = expression

For example:

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

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

bar # outputs bar


If you want the output from the command to still print to the powershell command line, you can do a variant of the accepted answer:

& external.cmd | Out-Host
0

精彩评论

暂无评论...
验证码 换一张
取 消