Problemas de desempenho para o Excel Revinculando no Powershell

1

Estamos fazendo uma reorganização de unidade de rede compartilhada. Isso quebrará os links em centenas de gigabytes de arquivos do Excel usados pela empresa. Para suavizar o golpe, criei um script Powershell que automaticamente religa esses arquivos. No entanto, ele é executado super lento em apenas cerca de 1 MB por minuto. Levaria vários meses para vincular novamente todos os arquivos do Excel. Por enquanto, estou pedindo à empresa que restrinja a quantidade de dados que estão solicitando para vincular, mas quanto mais rápido eu conseguir executar o script, mais feliz será o negócio. Atualmente é perfeitamente funcional, apenas lento. Alguém tem algum conselho de como eu posso acelerar este script Powershell? Qualquer feedback seria apreciado.

$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() 
    
por Jonathan Nelson 27.07.2016 / 22:53

1 resposta

1

Dê uma olhada no módulo ImportExcel . Ele pode importar e exportar dados do Excel diretamente, por isso é muito mais rápido e confiável do que usar objetos COM.

    
por 02.08.2016 / 10:47