PowerShell会话命令输出自动分配变量及全局Tee到临时变量的方法
PowerShell 输出捕获相关问题解答
1. 如何在PowerShell中自动将命令输出分配给变量?
日常使用PowerShell时,有几种简单直接的方式可以把命令输出存到变量里:
- 直接赋值:最基础的操作,把命令结果直接赋值给变量,这种方式下输出不会显示在控制台,仅保留在变量中:
$fileList = Get-ChildItem C:\YourFolder - 用
-OutVariable参数:大部分内置cmdlet都支持这个参数,能同时把输出送到控制台和变量,一举两得:
执行后你能看到进程列表,之后用Get-Process -OutVariable runningProcesses$runningProcesses就能调用这份结果。 - 借助
Tee-Object:如果是自定义函数或者不支持-OutVariable的命令,用这个工具可以实现“分流”——同时输出到控制台和变量:Your-CustomFunction | Tee-Object -Variable functionOutput
2. 全局捕获所有会话输出到临时变量
你说得对,单条命令的捕获方式没法满足“预先不知道要存哪些输出”的场景,这里有两个实用的全局解决方案:
方案1:覆盖Out-Default实现全局Tee
PowerShell里所有最终要显示到控制台的输出都会经过Out-Default这个cmdlet,我们可以自定义它来实现全局捕获:
function Out-Default { # 把输入先存到全局变量,再传给原生的Out-Default显示到控制台 $input | Tee-Object -Variable global:PSMyCustomTempVariable -PassThru | Microsoft.PowerShell.Core\Out-Default }
执行这段代码后,之后所有命令的输出都会自动被存到$PSMyCustomTempVariable里,同时正常显示在控制台。要是之后想恢复默认行为,删掉这个自定义函数就行:
Remove-Item function:\Out-Default
方案2:用参数默认值+错误捕获覆盖会话
如果只需要在某一段会话中生效,可以用$PSDefaultParameterValues给所有支持-OutVariable的cmdlet设置默认参数,再加上错误捕获确保异常也被记录:
# 初始化全局临时变量 $global:PSMyCustomTempVariable = @() & { # 给所有cmdlet默认加上OutVariable参数 $PSDefaultParameterValues['*:OutVariable'] = 'PSMyCustomTempVariable' # 捕获错误输出并存到变量 trap { $_ | Tee-Object -Variable global:PSMyCustomTempVariable -PassThru; continue } # 这里写你要执行的所有命令 Get-ChildItem C:\Temp Get-Service # 哪怕是出错的命令也会被捕获 Get-Item C:\NonExistentFolder }
这个方案能覆盖大部分场景的输出,包括错误信息。
内容的提问来源于stack exchange,提问作者Stadem




