Мы проводим реорганизацию общего сетевого диска. Это приведет к разрыву ссылок в сотнях гигабайт файлов 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-объектов.