You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:45:36