PowerShell脚本中2>&1的含义及可替换等效cmdlet咨询
PowerShell中
2>&1的含义及等效替换说明 2>&1的具体作用
PowerShell对不同输出流做了数字编号划分,和类Unix Shell的流编号逻辑基本对齐:
- 1:成功输出流,存放命令正常执行返回的结果,默认输出到控制台
- 2:错误输出流,存放命令执行过程中产生的错误记录,默认以红色样式输出到控制台
- 其余还有3(警告流)、4(详细信息流)、5(调试流)、6(信息流)等编号对应其他输出流
>&是PowerShell的流重定向运算符,2>&1的含义就是将编号为2的错误输出流的所有内容,合并重定向到编号为1的成功输出流中。
结合给出的代码片段,这里加2>&1的目的是:避免Invoke-Expression执行命令时产生的错误直接打印到控制台,把错误记录和正常返回结果一起捕获到$er变量中,后续就可以通过判断$er是否携带Exception属性来识别执行错误,完成异常抛出逻辑。
注意:和cmd/bash中重定向后错误会转为纯文本不同,PowerShell中经过
2>&1重定向的错误依然会保留完整的ErrorRecord对象类型,因此代码里可以直接访问.Exception属性获取原始异常对象。
等效的cmdlet写法替换
2>&1属于PowerShell语言层面的语法糖,没有单一的原生cmdlet可以直接1:1替换这个运算符,但可以通过PowerShell所有cmdlet都支持的通用参数组合,实现完全一致的功能,写法更符合PowerShell的原生规范,可读性更强。
替换后的等效函数代码如下:
function InvExp { param ( [string]$cmd ) # 执行命令:设置错误不直接输出到控制台,同时把错误记录存入指定变量 $errorOutput = $null $successOutput = Invoke-Expression $cmd -ErrorAction SilentlyContinue -ErrorVariable errorOutput # 合并正常输出和错误输出,和原代码2>&1的捕获效果完全一致 $er = @($successOutput) + @($errorOutput) if($errorOutput.Exception){ throw $errorOutput.Exception } }
涉及的通用参数说明:
-ErrorAction SilentlyContinue:作用是阻止错误流内容直接输出到控制台,和原重定向写法隐藏错误打印的效果一致-ErrorVariable errorOutput:作用是把错误流产生的所有内容存入$errorOutput变量,不需要通过重定向就能单独捕获错误记录
额外提示:原代码直接判断合并后
$er的Exception属性存在逻辑隐患——如果命令正常返回的对象本身就带有名为Exception的属性,会被误判为执行错误。用-ErrorVariable单独捕获错误流做判断,能完全规避这个问题。
内容的提问来源于stack exchange,提问作者POSH Guy
相关产品推荐
相关产品推荐

