2

我正在尝试查找已登录用户的所有 .PST 文件。但是,我似乎无法添加到“驱动器”的路径。我想搜索 C:\users\ + $env:UserName 下的所有文件

此命令似乎在 C:\ 上找到所有 PST 文件

$Res = Get-CimInstance CIM_DataFile -filter "Drive='c:' AND extension='pst'" -OutVariable m | Select-Object -Property Name

但是,当我将其更改为:

$Res = Get-CimInstance CIM_DataFile -filter "Drive='C:\users\' + $env:UserName AND extension='pst'" -OutVariable m | Select-Object -Property Name

甚至只是:

$Res = Get-CimInstance CIM_DataFile -filter "Drive='C:\users\' AND extension='pst'" -OutVariable m | Select-Object -Property Name

我收到以下错误:

Get-CimInstance : 在 C:\Users\mntle2\Documents\PSTMig.ps1:2 char:8 + $Res = Get-CimInstance CIM_DataFile -filter "Drive='c:\users\' AND ex ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Get-CimInstance], CimException + FullyQualifiedErrorId : HRESULT 0x80041017,Microsoft.Management.Infrastructure.CimCmdlets.GetCimInstanceCommand

有人可以帮我解决这个问题吗?

4

2 回答 2

0

tl;博士

  • 为了在目录子树(而不是单个目录)中执行基于CIM 的文件搜索,您必须使用运算符将​​该Path属性与驱动器相对路径通配符表达式进行比较LIKE

    "Drive='C:' AND Extension='pst' AND Path LIKE '\\Users\\$env:USERNAME\\%'"
    
    • 然而,这是低效且缓慢的,因为这种操作仍然会搜索所有文件。

      • 相比之下,在单个目录(而不是其子目录)中查找文件效率很高;例如:
        "Drive='C:' AND Extension='pst' AND Path='\\Users\\$env:USERNAME\\'"
        将在用户的主目录中有效地搜索,但只能直接在其中(注意所需的尾随\\
    • 此外,此功能在某些版本的 Windows 10 中被暂时破坏1703(在服务通道中的至少一个版本上观察到)。

  • 因此,为了有效地在目录的子树中的任何位置定位文件,请Get-ChildItem改用Invoke-Command -ComputerName如果需要,使用远程处理) - 见下文。


优选,更快的替代方案基于Get-ChildItem

$res = (Get-ChildItem -Recurse $HOME -File -Filter *.pst -OutVariable m).FullName

注意:严格来说Select-Object -Property Name,在您的原始命令中不会像上面的命令那样直接返回完整的文件路径,而是将它们包装在.Name属性包含它们的自定义对象中。

为了在远程机器上运行此命令,请将其传递给Invoke-Command -ComputerName(从提升的会话,并设置PS 远程处理):

$res = Invoke-Command -ComputerName $targetComputer { 
         (Get-ChildItem -Recurse $HOME -File -Filter *.pst -OutVariable m).FullName 
       }

基于 CIM / WMI 的文件搜索的次优 CIM 解决方案和一般提示:

这是 OP 问题的完整解决方案,但是,如前所述:

  • 它效率低下且缓慢

  • 1703它在更新通道中的至少一个 Windows 10 版本上被破坏。

$filter = "Drive='C:' AND Extension='pst' AND Path LIKE '\\Users\\$env:USERNAME\\%'"
$Res = Get-CimInstance CIM_DataFile -Filter $filter -OutVariable m |
  Select-Object -Property Name

-Filter参数接受一个WQL表达式,该表达式可能难以构造:

  • Drive只能接受一个驱动器规范,因此为了在特定目录中搜​​索,您必须使用Path一个-drive-relative- directory 路径来定位目标。

    • 通常,请务必按驱动器缩小搜索范围,因为默认情况下会搜索所有驱动器,包括网络驱动器,这可能非常慢。
  • Path参数必须有它的\\\字符doubled ( ),因为\在字符串操作数中充当转义字符。

    • 如果使用运算符=指定路径,则只搜索指定目录本身,但效率较高;请注意,路径必须以\\.

    • 相比之下,为了搜索指定路径及其整个子树

      • 如前所述,这通常是低效且缓慢的,并且在某些 W10 版本中被破坏
      • 使用运算符LIKE而不是=and
      • 将 WQL 通配符附加%到路径;(在 WQL(和 WQL 所基于的 SQL)中,%相当于通常的*通配符,_对应于?)
于 2018-04-10T02:24:10.940 回答
-1

您可以尝试path在查询中使用该属性:

$Res = Get-CimInstance CIM_DataFile -filter "Drive='C:' AND path='\\users\\' AND extension='pst'" -OutVariable m | Select-Object -Property Name
于 2018-04-10T01:14:06.320 回答