从 Get-Childitem 捕获不可访问文件夹的路径

Catching paths of inaccessible folders from Get-Childitem

我正在编写小脚本来捕获 运行 系统上的文件哈希值。我只有 Powershell 可用。

这是代码的活动部分:

get-childitem -path $path -filter $filename -Recurse -Force | Select FullName | foreach-object { get-filehash $_.fullname | select * }

这是我正在测试的命令:

./Get-FileHashesRecursive.ps1 -path c:\ -filename *.txt

当 运行 脚本出现一系列错误,因为某些文件夹无法访问。我想记录这些文件夹的路径,以便用户在完成失败时有记录。

控制台中的错误看起来像这样 window:

get-childitem : Access to the path 'C:$Recycle.Bin\S-1-5-21-4167544967-4010527683-3770225279-9182' is denied.
At E:\git\Get-RemoteFileHashesRecursive\Get-FileHashesRecursive.ps1:14 char:9
+         get-childitem -path $path -filter $filename -Recurse -Force | ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (C:$Recycle.Bin...3770225279-9182:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

有没有一种方法可以在不停止脚本的其余部分的情况下从 运行 获取错误的路径或整个第一行?

根据要求,这是我之前的评论作为答复:

Get-ChildItem -Path $Path -Filter $Filename -File -Recurse -Force -ErrorVariable FailedItems -ErrorAction SilentlyContinue | ForEach-Object { Get-FileHash -Path $_.FullName | Select-Object * }
$FailedItems | Foreach-Object {$_.CategoryInfo.TargetName} | Out-File "C:\Users\sailingbikeruk\Desktop\noaccess.log"
  • 我已将 -File 参数添加到 Get-ChildItem,因为您专门只处理文件。
  • 我还在 Get-ChildItem 命令中添加了 -ErrorVariable-ErrorAction 参数。 -ErrorVariable FailedItems 为变量定义自定义名称,该变量存储处理过程中来自命令的错误。 -ErrorAction SilentlyContinue,告诉脚本继续而不通知您错误。
  • 命令处理完成后,您可以解析 $FailedItems 变量的内容。在上面的例子中,我把TargetName输出到一个文件中,这样你就可以在闲暇时阅读它,(请记住根据需要调整它的文件路径和名称,如果你也想将其输出到文件)。