PowerShell 5.1:为何Invoke-Expression需重定向才能捕获错误至变量
问题原因解析
git是外部原生程序,它的错误信息直接输出到标准错误流(stderr,对应PowerShell的流2),不属于PowerShell自身的结构化错误体系。- PowerShell的
-ErrorVariable参数,仅负责捕获PowerShell引擎生成的结构化错误记录对象,对外部程序的stderr输出默认不做捕获处理。所以直接执行Invoke-Expression "git clone asdasdasd" -ErrorVariable myErrors时,错误只会直接打印到控制台,不会存入$myErrors变量。 - 当添加
2>file.txt重定向时,PowerShell会将外部程序的stderr输出内容自动包装成PowerShell错误记录,此时-ErrorVariable就能捕获到这些转换后的记录;同时重定向操作本身会把原始的stderr内容写入目标文件,所以会出现错误既在文件里、又存入变量的情况。
验证示例
可以用cmd模拟外部程序输出stderr,验证这个逻辑:
# 直接执行,错误打印到屏幕,$errVar为空 Invoke-Expression "cmd /c echo 'test error' 1>&2" -ErrorVariable errVar $errVar.Count # 输出0 # 重定向后,错误写入文件,同时$errVar捕获到内容 Invoke-Expression "cmd /c echo 'test error' 1>&2" -ErrorVariable errVar 2>err.txt $errVar.Count # 输出1 Get-Content err.txt # 输出'test error'
内容的提问来源于stack exchange,提问作者Andrew Ducker
相关产品推荐
相关产品推荐

