Powershell 调用表达式-将输出写入控制台,但不从函数返回

Powershell 调用表达式-将输出写入控制台,但不从函数返回,powershell,io,stdout,powershell-5.1,Powershell,Io,Stdout,Powershell 5.1,我想在函数中调用Invoke Expression,并将命令的输出打印到控制台,但不从函数中返回,因为我想从函数中返回特定值 function Foo { $command = 'mvn clean package "-Dmaven.test.skip"' Invoke-Expression -Command $command | Write-Host $result = 'computed return value' return $res

我想在函数中调用
Invoke Expression
,并将命令的输出打印到控制台,但不从函数中返回,因为我想从函数中返回特定值

function Foo {
    $command = 'mvn clean package "-Dmaven.test.skip"'
    Invoke-Expression -Command $command | Write-Host

    $result = 'computed return value'
    return $result
}


$fooResult = Foo
Write-Output "fooResult is: ${fooResult}"

这是可行的,但是我想避免使用邪恶的
写主机
函数,所以我尝试了
写信息
。 但我认为您似乎无法将
调用表达式的输出输送到
写入信息。当我简单地用
写入信息
替换
写入主机
时,其行为类似于未提供
-MessageData
参数(在明确说明
-MessageData
时类似)


是否有方法将
调用表达式的输出写入控制台,但避免在不使用
写入主机的情况下从函数返回它?

您尝试使用
OutVariable

function Foo {
    $command = 'mvn clean package "-Dmaven.test.skip"'
    Invoke-Expression -Command $command -OutVariable OutputData | Out-Null

    Write-Information -MessageData "INFO: $OutputData" -INFA "Continue"
    return "something else"
}

输出到屏幕是Powershell的默认值,除非您告诉它这样做。 因此,在许多情况下,Write-*几乎没有意义。然而,人们使用Write-*cmdlet有其原因

有几种方法可以写入屏幕,甚至可以保存到变量并同时写入屏幕

  • 可变压缩
  • 外线
  • 外宾
  • T形物体
上述及以上内容已定期涵盖

网络点击示例:

您的帖子甚至可以被视为类似用例的副本:

从Powershell运行可执行文件也是一个有很好文档记录的用例。看到这个了吗

•PowerShell:运行可执行文件


“但我想避免使用邪恶的
写主机
功能”-您想要的确切行为(绕过流,直接写入主机)正是
写主机
有时被描述为邪恶的原因-换句话说,您希望在这里邪恶:)我认为使用
写主机
有更多的缺点。据我所知,我不能将它的输出重定向到一个文件,例如,当我想在调用它时将整个脚本的所有输出重定向到一个文件,否?执行此Powershell会告诉我,
$OutputData
NULL
对不起,更新了我的帖子,请重试。现在
$OutputData
包含输出,但整个输出仍然从函数返回。请在发布代码之前测试代码。此外,换行符似乎不再存在。我再次编辑了我的帖子,并测试了代码,很抱歉,我不知道“缺少换行符”是什么意思。我没有安装
mvn
。这应该可以工作,
$outputData
被定向到
信息流
,而
其他东西
被定向到std outThe
Tee对象
将输出写入管道,这导致函数将其包含在返回值中,这是我想要避免的。
Get-Process a* -OutVariable process
($process = Get-Process a*)
Get-Process a* | Tee-Object -Variable p
Invoke-Expression $var -OutVariable | Tee-Object -Variable out 

Invoke-Expression $var | Tee-Object C:\Path\To\File.txt