PowerShell捕获route change命令输出异常:接口不存在时无法捕获输出
route change错误输出的问题 这是PowerShell与原生控制台命令交互时非常常见的问题——像route这类传统CMD工具的错误信息是发送到标准错误流(stderr),而PowerShell默认只会捕获**标准输出流(stdout)**的内容。所以当命令执行失败(比如指定的接口不存在)时,错误信息会直接打印到控制台,无法存入$StrTemp变量;而Out-Null只能处理标准输出,对错误流完全无效。
下面是几个针对性的解决方案:
1. 捕获所有输出(成功+错误)
通过流重定向符号2>&1,把标准错误流(编号2)合并到标准输出流(编号1),这样不管命令成功还是失败,所有输出都会被存入变量:
$StrTemp = route change 0.0.0.0 mask 0.0.0.0 $Gateway metric 10 if $i 2>&1
之后你可以检查$StrTemp的内容,或者通过$LASTEXITCODE变量判断执行结果——外部命令成功时$LASTEXITCODE为0,失败则为非0值。
2. 用Try/Catch捕获错误
如果想把外部命令的错误当成PowerShell的终止错误来处理,可以结合$ErrorActionPreference和流重定向:
$ErrorActionPreference = 'Stop' try { $StrTemp = route change 0.0.0.0 mask 0.0.0.0 $Gateway metric 10 if $i 2>&1 # 命令执行成功后的逻辑 } catch { $StrTemp = $_.Exception.Message # 处理错误的逻辑,比如打印提示或者记录日志 } # 恢复默认的错误行为 $ErrorActionPreference = 'Continue'
这里2>&1把错误流转成输出流,$ErrorActionPreference = 'Stop'会让PowerShell将外部命令的非0退出码视为终止错误,从而触发Catch块。
3. 仅抑制错误显示(不捕获错误)
如果只需要隐藏错误信息,同时保留成功输出到变量,可以把错误流直接重定向到$null:
$StrTemp = route change 0.0.0.0 mask 0.0.0.0 $Gateway metric 10 if $i 2>$null
这样失败时的错误信息不会打印到控制台,成功时的正常输出依然能存入$StrTemp。
补充说明
Out-Null之所以无效,是因为它仅作用于标准输出流。外部命令的错误流不会经过管道传递给Out-Null,所以错误信息还是会直接显示在控制台。只有通过流重定向符号(2>&1、2>$null等)才能处理标准错误流。
内容的提问来源于stack exchange,提问作者Zac




