在 .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
这适用于统计 *.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