抑制和处理PowerShell脚本中的stderr错误输出

问题描述

我想使用PowerShell捕获SMB共享,​​但这不起作用

# Cannot use CIM as it throws up WinRM errors.
# Could maybe use if WinRM is configured on all clients,but this is not a given.
$cim = New-CimSession -ComputerName $hostname
$sharescim = Get-SmbShare -CimSession $cim

因此,这导致我找到了另一种使用网络视图的方法,如果主机是Windows,则完全可以

# This method uses net view to collect the share names (including hidden shares like C$) into an array
# https://www.itprotoday.com/powershell/view-all-shares-remote-machine-powershell
try { $netview = $(net view \\$hostname /all) | select -Skip 7 | ?{$_ -match 'disk*'} | %{$_ -match '^(.+?)\s+Disk*'|out-null ; $matches[1]} }
catch { $netview = "No shares found" }

因此,如果主机是Linux,则会收到错误消息,如您所见,我正在上面尝试通过try / catch抑制该错误,但是此操作失败。

很明显,这是因为“网络视图”是CMD,所以不能通过try / catch来控制。所以我的问题是:我该如何a)抑制下面的系统错误?b)在发生该错误时(例如,抛出“此主机未响应'net view'”)或处理而不是错误)

System error 53 has occurred.
The network path was not found.

解决方法

外部程序的Stderr(标准错误)输出未与PowerShell的错误处理集成,主要是因为该流不仅用于传达错误,还有状态信息。
(因此,您只能根据其退出代码推断外部程序调用的成功与失败,如$LASTEXTICODE [1] 所示。)>

但是,您可以重定向 stderr输出,并将其重定向到$null2>$null)会使它静音 [2] : >

$netview = net view \\$hostname /all 2>$null | ...
if (-not $netview) { $netview = 'No shares found' }

[1]对非零退出代码起作用,按照惯例,该代码表示​​发生故障,并且从v7.1开始,该代码也未集成到PowerShell的错误处理中,但正在this RFC中提出解决方案。 / sup>

[2]在PowerShell 7.0之前,任何2>重定向都 也会将stderr行记录在自动$Error集合中。 v7.1中已纠正此问题。
不幸的是,在v7.0之前的版本中,如果发出2>且至少发出一条stderr行,则$ErrorActionPreference = 'Stop'重定向也可能引发脚本终止错误。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...