我已经使用此脚本在远程服务器中搜索我在CSV中列出的特定文件。然而,这个过程非常缓慢,我想知道我的代码是否能够实现这一目标。我可以以某种方式改善它吗?我以为只是制作目录列表并在我的CSV中搜索文件可能会更快,以避免递归浏览每个文件。
$source = "\\server1\Scanning_Maps"
$destination = "\\server1\Transfer\TEST"
$searchFiles = Import-CSV 'C:\Users\user1\Desktop\test.csv' -Header ("filename")
ForEach($File in $searchFiles)
{
Get-ChildItem -Path $source -Recurse | Where-Object { $_.Name -match $File.filename } | Copy-Item -Destination $destination
}
答案 0 :(得分:2)
您需要进行一些测试,但除了jisaak的调查结果之外,您可以通过仅将要复制的文件返回到所有文件然后进行处理来进一步减少这一点。
我认为只需创建一个目录列表并在其中搜索我的CSV中的文件可能会更快,以避免递归浏览每个文件。
使用-Include
,你可以传递文件名数组,它只应搜索并返回你想要的文件。
另外如果你要添加标题,我猜你只有一列csv?如果是这种情况,您甚至不需要使用该cmdlet,只使用Get-Content
。
$searchFiles = Get-Content 'C:\Users\user1\Desktop\test.csv'
如果这是一个CSV文件,并且您使用标题来处理第一列,则忽略该tidbit。如果它是一个csv我们至少应该扩展列,所以你只有一个字符串数组而不是一个对象。
$searchFiles = Import-CSV 'C:\Users\user1\Desktop\test.csv' -Header ("filename") | Select-Object -ExpandProperty filename
现在让我们尝试使用-Include
。请注意,它仅适用于-Recurse
,如果没有它,可能无效。
Get-ChildItem -Path $source -Include $searchFiles -Recurse | Copy-Item -Destination $destination
在那里,不再需要foreach循环。那应该更快。
答案 1 :(得分:1)
您为$searchFiles
中的每个文件运行Get-ChildItem cmdlet,您应将其放在foreach
循环之外:
$source = "\\server1\Scanning_Maps"
$destination = "\\server1\Transfer\TEST"
$searchFiles = Import-CSV 'C:\Users\user1\Desktop\test.csv' -Header ("filename")
$sourceList = Get-ChildItem -Path $source -Recurse
ForEach($File in $searchFiles)
{
$sourceList | Where-Object { $_.Name -match $File.filename } | Copy-Item -Destination $destination
}