dcr*_*ven 3 powershell performance coding-efficiency
下面的代码从list.txt文件中搜索400多个数字,以查看它是否存在于指定的文件夹路径中的任何文件中.
该脚本非常慢并且尚未完成,因为它在运行25分钟后没有完成.我们正在搜索的文件夹是507 MB(532,369,408字节),它包含1,119个文件和480个文件夹.任何有助于提高搜索速度和效率的帮助都非常感谢.
$searchWords = (gc 'C:\temp\list.txt') -split ','
$results = @()
Foreach ($sw in $searchWords)
{
$files = gci -path 'C:\Users\david.craven\Dropbox\Asset Tagging\_SJC Warehouse_\_Project Completed_\2018\A*' -filter "*$sw*" -recurse
foreach ($file in $files)
{
$object = New-Object System.Object
$object | Add-Member -Type NoteProperty –Name SearchWord –Value $sw
$object | Add-Member -Type NoteProperty –Name FoundFile –Value $file.FullName
$results += $object
}
}
$results | Export-Csv C:\temp\output.csv -NoTypeInformation
Run Code Online (Sandbox Code Playgroud)
以下内容可以大大加快您的任务:
如果意图真的要在文件名中查找搜索词:
$searchWords = (Get-Content 'C:\temp\list.txt') -split ','
$path = 'C:\Users\david.craven\Dropbox\Facebook Asset Tagging\_SJC Warehouse_\_Project Completed_\2018\A*'
Get-ChildItem -File -Path $path -Recurse -PipelineVariable file |
Select-Object -ExpandProperty Name |
Select-String -List -SimpleMatch -Pattern $searchWords |
Select-Object @{n='SearchWord'; e={$_.Pattern}},
@{n='FoundFile'; e={$file.FullName}} |
Export-Csv C:\temp\output.csv -NoTypeInformation
Run Code Online (Sandbox Code Playgroud)
如果目的是在文件内容中查找搜索词:
$searchWords = (Get-Content 'C:\temp\list.txt') -split ','
$path = 'C:\Users\david.craven\Dropbox\Facebook Asset Tagging\_SJC Warehouse_\_Project Completed_\2018\A*'
Get-ChildItem -File -Path $path -Recurse |
Select-String -SimpleMatch -Pattern $searchWords |
Select-Object @{n='SearchWord'; e={$_.Pattern}},
@{n='FoundFile'; e={$_.Path}} |
Export-Csv C:\temp\output.csv -NoTypeInformation
Run Code Online (Sandbox Code Playgroud)
绩效改进的关键:
通过将所有搜索词传递给,使用单个命令执行搜索.Select-String
相反,在脚本块以构建自定义对象New-Object和Add-Member,让Select-Object直接构造的对象为您的管道,利用计算性能.
而不是迭代地构建一个中间数组+=- 在幕后每次重新创建数组 - 使用单个管道直接将结果对象传递给Export-Csv.