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