我想获取 Get-PSDrive 的输出来获取所有驱动器的驱动器号,并搜索 ISO 并使用 Get-PSDrive 中的路径



我正试图使用Get-PSDrive将磁盘使用的所有驱动器号放入一个字符串中,该字符串返回每个字母(有效(

我在使用$ISODeviceLetter变量将其用作在所有驱动器中搜索.ISO文件的路径时遇到问题。

$ISODeviceLetter = Get-PSDrive | Select-Object -ExpandProperty 'Name' | Select-String -Pattern '^[a-z]:$'
$ISOLocation = Get-ChildItem -Path $ISODeviceLetter -Recurse -Include *.ISO

这是我得到的错误:

Get-ChildItem : Cannot find path 'C:UsersAdministratorC' because it does not exist.
At line:1 char:16
+ ... OLocation = Get-ChildItem -Path $ISODeviceLetter -Recurse -Include *. ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (C:UsersAdministratorC:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

我从错误中看到get-childitem使用的默认位置是C:\Users\Administrator

期望的输出是通过CCD_ 4作为服务器上所有驱动器的路径";C: "D: "E: ";,因此所有驱动器都可以搜索.ISO文件。

提前感谢您的帮助。

问题是,当引用驱动器时,必须使用冒号(:(来区分它们,以消除驱动器与常规文件夹/文件的歧义:

  • 使用Foreach-Object命令将冒号附加到返回的每个驱动器号
  • 将过滤器从-Include更改为-Filter,以加快进程,因为-Filter是由FileSystemProvider实现的,而且您也不需要查找多个文件
  • 由于.ISO扩展名与文件关联,因此添加了-File开关以实现更高效的查询
$ISODeviceLetter = [array](Get-PSDrive | 
Where-Object -FilterScript {$_.Name -match "^.$"}).Foreach{
$_.Name + ':'
}
$ISOLocation = Get-ChildItem -Path $ISODeviceLetter -File -Recurse -Filter *.ISO

奖金:您可以使用简化语法来获得与上面相同的结果,以获得更好的可读性:

$ISODeviceLetter = (Get-PSDrive).Where{$_.Name -match "^.$"} | 
Select -exp Name | Foreach Insert -ArgumentList 1,':' 

只有真实的";"下行";这就是,你正在更多地使用管道。尽管在本例中,它可能不会影响返回的速度,但使用管道可能会对其他时间敏感的任务的性能造成相当大的影响

最新更新