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