Corregir hipervinculos en ficheros Excel con PowerShell

Has usado alguna vez Microsoft Excel como índice para localizar documentación?
Imagina el excel de la foto en el que usas la columna G para enlazar a documentos de algún recurso compartido.


Y que pasa cuando toda esa documentación se migra a otro servidor/share?
Podemos corregir automáticamente la ruta antigua por la nueva con Powershell:
function Release-Ref ($ref) {
([System.Runtime.InteropServices.Marshal]::ReleaseComObject(
[System.__ComObject]$ref) -gt 0)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}

### main ###
$cambios=0
$buscar=read-host "Cadena a buscar"
$buscar=$buscar -replace '\\','\\' #para escapar el caracter reservado barra
$buscar=$buscar -replace '\$','\$' #para escapar el caracter reservado dollar
$reemplazar=read-host "Reemplazar por"
$archivo=gci(".\IndiceDocumentacion.xlsx")
$ruta=$archivo.directoryname
$nombre=$archivo.basename
$extension=$archivo.extension
$filenamenew=$nombre + "_corregido" + $extension
$objExcel = new-object -comobject excel.application 
$objExcel.Visible = $false
$objExcel.DisplayAlerts = $False
$objWorkbook = $objExcel.Workbooks.open($archivo.fullname)
$objworksheets=$objWorkbook.Worksheets
$objworksheets|%{
    write-host $_.name -fore cyan
    $objWorksheet = $objWorkbook.Worksheets.Item($_.name)   
    $hyperlinks = @($objWorksheet.hyperlinks)
    $hyperlinks|%{
        if ($_.address -match $buscar)
  {
  write-host $_.Address
        $_.address=$_.address -replace("$buscar","$reemplazar")
  $cambios=1
  }
    }#fin del foreach

}#fin de recorrer worksheets
if ($cambios -eq 1){$objWorkbook.SaveAs("$ruta\$filenamenew")}
else{write-host "No hay cambios a realizar en $nombre$extension" -back green -fore black}
$objExcel.Quit()
$a = Release-Ref($objWorksheet)
$a = Release-Ref($objWorkbook)
$a = Release-Ref($objExcel)

Comentarios