在 .Net 调用中在哪里应用 -ErrorAction?

Where to apply -ErrorAction on a .Net call?

这适用于统计 *.jpg 文件。

PS C:\> @([System.IO.Directory]::EnumerateFiles('C:\Users\Public\Pictures', '*.jpg', 'AllDirectories')).Count
8

如何将 -ErrorAction Continue 应用于此?

PS C:\> @([System.IO.Directory]::EnumerateFiles('C:\Users', '*.jpg', 'AllDirectories')).Count
An error occurred while enumerating through a collection: Access to the path 'C:\Users\Administrator' is denied..
At line:1 char:1
+ @([System.IO.Directory]::EnumerateFiles('C:\Users', '*.jpg', 'AllDire ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我认为你做不到。除非你想自己实现目录遍历,否则你可能会遇到这样的问题:

Get-ChildItem 'C:\Users' -Filter '*.jpg' -Recurse -Force -ErrorAction SilentlyContinue

使用 Get-ChildItem 显示 解决方法 ,这是 必需的 使用完整时,Windows-仅 .NET Framework (FullCLR),其中 Windows PowerShell 已构建。

相比之下,.NET Core v2.1+ - PowerShell Core 已构建 - 是否提供解决方案:

@([System.IO.Directory]::EnumerateFiles(
  'C:\Users',
  '*.jpg', 
  [System.IO.EnumerationOptions] @{ 
    IgnoreInaccessible = $true
    RecurseSubDirectories = $true
  }
)).Count

请注意,这相当于 -ErrorAction Ignore,而不是 Continue(或 SilentlyContinue),因为无法访问的目录被 悄悄忽略 ,无法检查 其中哪些 之后无法访问。

以上解决方案基于this System.IO.Directory.EnumerateFiles() overload, which offers a System.IO.EnumerationOptions参数。

以上答案解决了这个问题。他们不应用错误操作。

为了真正捕获 .net 调用中的错误操作,我在 Windows PowerShell 中使用 $ErrorActionPreference 变量,如 https://devblogs.microsoft.com/scripting/handling-errors-the-powershell-way/:

中所述
# Store $ErrorActionPreference
$OldErrorActionPreference = $ErrorActionPreference
# Set $ErrorActionPreference for .net action
# see https://devblogs.microsoft.com/scripting/handling-errors-the-powershell-way/ for other values
$ErrorActionPreference = 'SilentlyContinue'
# .net call
@([System.IO.Directory]::EnumerateFiles('C:\Users\Public\Pictures', '*.jpg', 'AllDirectories')).Count
# restore origional $ErrorActionPreference
$ErrorActionPreference = $OldErrorActionPreference