Назад | Перейти на главную страницу

Проблемы производительности при повторном связывании Excel в Powershell

Мы проводим реорганизацию общего сетевого диска. Это приведет к разрыву ссылок в сотнях гигабайт файлов Excel, используемых в бизнесе. Чтобы смягчить удар, я создал сценарий Powershell, который автоматически повторно связывает эти файлы. Однако он работает очень медленно - всего около 1 МБ в минуту. Повторная привязка всех файлов Excel займет несколько месяцев. На данный момент я прошу бизнес ограничить объем данных, которые они запрашивают для повторного связывания, однако, чем быстрее я смогу запустить свой скрипт, тем счастливее будет бизнес. В настоящее время он отлично работает, только медленно. Есть ли у кого-нибудь совет, как я могу ускорить этот скрипт Powershell? Любая обратная связь будет оценена.

$object = New-Object -comObject Shell.Application  
$folder = $object.BrowseForFolder(0, 'Select the folder where your Excel files are located', 0)

$oldname = "oldname"
$newname = "newname"

if (!$folder -or !$oldname -or !$newname) {exit} 

$excel = New-Object -comObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false

foreach ($file in Get-ChildItem -literalPath $folder.self.Path*.xls?) {
$workbook = $excel.Workbooks.Open($file.fullname)

foreach ($link in $workbook.LinkSources(1))
{
    write-host Old link: $link
    $newlink = $link -ireplace [regex]::Escape($oldname), $newname
    if (Test-Path $newlink) {
        write-host New link: $newlink
        $workbook.ChangeLink($link,$newlink,1)
    }
    else {
        write-host New link does not exist: $newlink
    }
}
$workbook.Save()
$workbook.Close()
}
$excel.quit()

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
[System.GC]::Collect() 
[System.GC]::WaitForPendingFinalizers() 

Взгляните на ImportExcel модуль. Он может импортировать и экспортировать данные из Excel напрямую, поэтому это намного быстрее и надежнее, чем использование COM-объектов.