我在powershell中有一个很长的脚本,它调用位于单独的.ps1文件中的更长的函数。该函数运行一些svn update
命令和一些生成标准输出的编译可执行文件。当我直接从脚本运行这些时,输出被重定向到Powershell ISE
中的调试控制台。当我通过函数运行它们时,我可以判断它们正在运行,但我在控制台中没有标准输出。
如何将函数中的标准输出重定向回 Powershell 调试控制台,我可以在其中看到它?
谢谢。
编辑
我正在导入函数,如下所示:
. "D:common.ps1"
并按如下方式调用它:
$MedianValue = Run-Comparison $LastRev $FirstRev $ScriptPath $SolutionPath $DevenvPath $TestPath $refFile $SVNPAth
在函数中,其中一个调用如下所示
svn update $FirstRev
Start-Process ExecutableName Argument
对于上述两个语句,当我调用它们的包含函数时,我看不到标准输出。
如果要捕获脚本的/函数的输出,并且该脚本/函数包含 PowerShell 本机输出语句和生成标准输出的外部程序调用的混合,则这两种类型的输出都将发送到 PowerShell 的常规成功输出流。
因此,除非在源位置重定向,否则无法有选择地将标准输出从外部程序传递到主机(例如,常规控制台窗口或 ISE 中的控制台窗格(,因为您将无法分辨哪些输出对象(行(来自何处。
要在源重定向 - 如果您可以控制被调用方的源代码 - 您有几个选项,最简单的是Write-Host
,如以下示例所示:
function Run-Comparison {
'PS success output'
cmd /c 'echo external stdout output' | Write-Host
}
# Captures 'PS success output', but passes the cmd.exe output through to the console.
$MedianValue = Run-Comparison
上述操作有选择地将cmd.exe
命令的输出发送到主机。
在 PSv5+ 中,Write-Host
写入新引入的信息流(编号6
(,您可以选择在调用时通过6>$null
来抑制到主机的输出。
要反转逻辑,请使用Write-Information
而不是Write-Host
(仅限 PSv5+(,默认情况下它是静默的,并允许您使用$InformationPreference = 'Continue'
打开输出。
如果您希望在 PSv4- 中默认保持静默行为,请使用Write-Verbose
或Write-Debug
,但请注意,此类输出将是不同的颜色,每行都有一个前缀(分别为VERBOSE:
和DEBUG:
(。