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

时间:2019-01-16 14:49:50

标签: powershell

这可以计算* .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 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3 个答案:

答案 0 :(得分:2)

我认为你不能。除非您自己想实现目录遍历,否则您可能会陷入类似这样的情况:

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

答案 1 :(得分:1)

Ansgar Wiechers' helpful answer显示使用Get-ChildItem 解决方法,当使用完整的,仅限Windows的操作系统时,必要 .NET Framework (FullCLR),在其上构建 Windows PowerShell

通过对比, .NET Core v2.1 + -构建了 PowerShell Core -< em>确实提供了解决方案:

@([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,它提供了一个System.IO.EnumerationOptions参数。

答案 2 :(得分:0)

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

为了真正捕捉 .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