从 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
输出到一个文件中,这样你就可以在闲暇时阅读它,(请记住根据需要调整它的文件路径和名称,如果你也想将其输出到文件)。
我正在编写小脚本来捕获 运行 系统上的文件哈希值。我只有 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
输出到一个文件中,这样你就可以在闲暇时阅读它,(请记住根据需要调整它的文件路径和名称,如果你也想将其输出到文件)。