使用PowerShell查找文件并获取其所在的文件夹

使用PowerShell查找文件并获取其所在的文件夹,powershell,Powershell,我正在尝试使用以下命令在我的硬盘中搜索文件: Get-ChildItem -Path C:\ -Filter *.pst -Recurse | ?{$_.PSIsContainer } | Select-Object FullName 这将返回它所在的文件夹。可能不止一个,因此我需要将其存储在一个数组中。它返回一个拒绝访问错误 如何执行此操作?将-erroraction SilentlyContinue添加到获取子项参数列表中。这样,您的cmdlet就不会在第一次出现拒绝访问错误时停止,而只扫

我正在尝试使用以下命令在我的硬盘中搜索文件:

Get-ChildItem -Path C:\ -Filter *.pst -Recurse | ?{$_.PSIsContainer } | Select-Object FullName
这将返回它所在的文件夹。可能不止一个,因此我需要将其存储在一个数组中。它返回一个拒绝访问错误


如何执行此操作?

-erroraction SilentlyContinue
添加到
获取子项
参数列表中。这样,您的cmdlet就不会在第一次出现拒绝访问错误时停止,而只扫描您有权访问的文件夹。

过滤器
?{$\p.psicContainer}
将只匹配作为容器的对象(即目录),但
Get ChildItem
语句只生成文件,而不生成目录,因此,管道的最终结果将是空的

您正在查找匹配文件的
目录
属性:

Get-ChildItem -Path 'C:\' -Filter '*.pst' -Recurse |
  Select-Object -Expand Directory -Unique |
  Select-Object -Expand FullName
您遇到的“拒绝访问”错误是因为您遍历了整个卷
C:
,其中很可能包含几个您无权访问的文件夹(即使是管理员也无权访问)

如前所述,将
-ErrorAction SilentlyContinue
添加到
Get ChildItem
语句中(或设置
$ErrorActionPreference='SilentlyContinue'
),使该语句跳过无法访问的目录

Get-ChildItem -Path 'C:\' -Filter '*.pst' -Recurse -ErrorAction SilentlyContinue |
  Select-Object -Expand Directory -Unique |
  Select-Object -Expand FullName

如果希望每个匹配文件的包含文件夹而不仅仅是唯一路径,请从第一个
选择对象
语句中删除
-unique
参数。

被否决,因为主要问题是如何将它们放入数组中,错误操作是次要的。@riahc3,拒绝访问,结果中没有收到任何内容,是因为选中的其中一个文件夹是
系统卷信息
,它没有供用户读取的ACE。由于
Get ChildItem
在拒绝访问错误时停止,因此克服这些错误的正确方法是通过
-erroraction
指示cmdlet忽略遍历拒绝访问错误。在数组中存储很简单,您可以将结果分配给一个变量,
$var=Get ChildItem….
。XY问题被发现了。谁否决了:小心解释你认为这个答案的错误吗?我希望这是OP,他有一个不同于解释的问题。