在没有调用代码的情况下将输出定向到函数中的stdout

时间:2011-12-17 16:22:05

标签: function powershell stdout powershell-v2.0

我写了几个Powershell脚本,为客户端部署软件。我使用Write-Host输出了大量信息,以便可以监视部署的进度,并使用Start-Transcript从其中一个部署应用程序调用此信息来捕获此输出。

但是,他们还需要能够从另一个只能从stdout捕获输出的应用程序调用其中一些脚本。这意味着Write-Host将无法在那里工作,因为它仅输出到控制台或主机,并且不会定向到stdout(正确吗?)

我的想法是我可以更改代码以使用Write-Out,但这会导致另一个问题。因为我使用函数,因为Powershell中的函数“返回”所有转到stdout到调用者,这可能会搞砸我从代码中检索输出的任何代码。

有没有办法从函数直接输出到stdout而不将它作为函数本身的输出转到调用代码?以下是问题的一个示例:

function Test-Output ([int]$number) {
    Write-Output "This is a string"
    return $number
}

[int]$someNumber = Test-Output 10

$someNumber

如果你运行上面的代码,你会看到一个错误,因为Powershell试图将“This is a string”分配给整数$someNumber。如果将变量更改为string,则它将捕获函数的完整输出(这是一个字符串10)并将其分配给变量。

感谢您提出的任何建议!

2 个答案:

答案 0 :(得分:2)

函数输出和stdout是相同的,所以调用代码将看到输出到stdout流的任何内容。在这种情况下,我建议使用Write-Progress cmdlet向最终用户报告进度并单独保留实际功能输出。

答案 1 :(得分:1)

试试这个。

function Add-Numbers {
    param (
        [double] $FirstNumber,
        [double] $SecondNumber
    )

    Write-Host "Hello World"

    return ($FirstNumber + $SecondNumber)
}

$result = Add-Numbers 1 2

#Write-Host "Result is $result"