PowerShell单行命令:赋值时抑制stderr并错误时赋值$null
问题
需要一个PowerShell单行命令,功能与以下代码完全一致:
[MyType]$var = My-Cmdlet -MyParam MyArg
但要抑制stderr输出。
以下写法无法实现需求:
([MyType]$var = My-Cmdlet -MyParam MyArg) 2>&1>$null
示例验证:
PS C:\> ($var = Get-installedModule "hooha") 2>&1>$null PS C:\> $var.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True ErrorRecord System.Object PS C:\> $var Get-Package: No match was found for the specified search criteria and module names 'hooha'. PS C:\> $var = Get-installedModule "hooha" Get-Package: No match was found for the specified search criteria and module names 'hooha'. PS C:\> $var.GetType() InvalidOperation: You cannot call a method on a null-valued expression. PS C:\>
补充要求:需在同一行命令中,抑制命令的stderr和stdout输出,同时将返回值赋值给变量,且赋值行为与普通赋值一致——即命令失败时变量赋值为$null。
解决方案
直接在Cmdlet后添加错误输出重定向即可实现需求,正确的单行命令如下:
[MyType]$var = My-Cmdlet -MyParam MyArg 2>$null
逻辑说明
- 错误写法
([MyType]$var = My-Cmdlet ...) 2>&1>$null会把命令的所有输出(包括错误信息)捕获后赋值给变量,导致命令失败时$var被设为ErrorRecord对象,而非预期的$null。 - 仅在Cmdlet末尾添加
2>$null,只会抑制stderr的输出,完全保留原赋值逻辑:命令成功时,将返回值强转为[MyType]后赋值给$var;命令失败时,$var自动赋值为$null,和普通赋值行为完全一致。
如果需要同时抑制stdout输出(部分Cmdlet成功时会额外输出内容到标准输出流),可以结合Out-Null,但要避免错误输出被捕获到变量:
[MyType]$var = My-Cmdlet -MyParam MyArg 2>$null | Out-Null; $var = $var ?? $null
多数场景下仅使用2>$null就足够,因为常规Cmdlet成功时的返回值就是需要赋值的目标对象,不会产生额外的stdout输出。
内容的提问来源于stack exchange,提问作者Keith Russell
相关产品推荐
相关产品推荐

