none
No se ejecuta script con programador de tareas - pero si manual RRS feed

  • Pregunta

  • Estimados amigos,

    quisiera su gentil apoyo con el siguiente problema:

    Tengo el siguiente script :

    #Conversión XLS a XLSX-------------------------------------------------------------
    $getyesterday = (get-date).AddDays(-1)
    $getyesterday = date $getyesterday -Format "yyyyMMdd"
    write-host $getyesterday
    Add-Type -AssemblyName Microsoft.Office.Interop.Excel

    $xlFixedFormat=[Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbook
    write-host $xlFixedFormat
    $excel = New-Object -ComObject excel.application
    $excel.visible = $true
    $folderpath = "E:\Portabilidad_Ventas\Audios\$getyesterday\"
    $filetype ="*xls"
    Get-ChildItem -Path $folderpath -Include $filetype -recurse | 
    ForEach-Object `
    {
    $path = ($_.fullname).substring(0, ($_.FullName).lastindexOf("."))

    "Converting $path"
    $workbook = $excel.workbooks.open($_.fullname)

    $path += ".xlsx"
    $workbook.saveas($path, $xlFixedFormat)
    $workbook.close()
    }
    $excel.Quit()
    $excel = $null
    [gc]::collect()
    [gc]::WaitForPendingFinalizers()

    #---------------------------------------------------------------
    #Renombrar
    $getyesterday2 = (get-date).AddDays(0)
    $getyesterday2 = date $getyesterday2 -Format "ddMMyyyy"
    write-host $getyesterday2
    Rename-Item -Path "E:\Portabilidad_Ventas\Audios\$getyesterday\METADATA_$getyesterday.xlsx" -NewName "E:\Portabilidad_Ventas\Audios\$getyesterday\METADATA_$getyesterday2.xlsx"

    #Mover metadata
    Move-Item -path "E:\Portabilidad_Ventas\Audios\$getyesterday\METADATA_$getyesterday.xls" -Destination "E:\Portabilidad_Ventas\Audios\MetaDatas\"

    #--------------------------------------------------------------

    Lo que más importa es la conversión de xls a xlsx. Sin embargo, cuando ejecuto esto de manera manual por Powershell ISE, lo realiza sin problemas, pero con el programador de tareas, no lo realiza. Puede alguien apoyarme con el inconveniente??

    domingo, 3 de marzo de 2019 4:43

Todas las respuestas

  • Hola Glen Espinoza:

    Obviando el contenido del powershell, que seguro que es fantástico, lo que hay que mirar, es eso de que "no lo realiza".

    En el programador de tareas, en la parte de la ventana derecha, panel de acciones, tienes una posibilidad de habilitar el historial de todas las tareas o su contrario. Si tienes habilitar, púlsalo.

    Después de que le haya tocado la hora de ejecución, vas al panel, buscas tu acción, y buscas en la pestaña de historial.

    Fijate en la linea, que ha desencadenado. Verás una o varias anotaciones de la misma. 

    En la misma ventana, en la parte inferior, verás algún detalle de la misma

    En mi ejemplo, mi tarea no se inicio, porque mi sesión estaba cerrada y lo que hace mi tarea, requiere de que la sesión este iniciada. 

    Además de esto, luego te queda con esta información, darte una pasada por el visor de eventos haber los rastros de tu acción.

    Ahora entrando en tu script de powershell, por si el error lo genera un problema de contexto, ya que cuando tu lo ejecutas con el powershell, quien lo ejecutas eres tú, sin embargo cuando lo ejecuta el programador de tareas, quien lo ejecuta es el usuario que ha declarado la tarea.

    PowerShell

    Crea una carpeta c:\Log

    Cambia tu script

    #Inicio log
    Start-Transcript "c:\Log\Milog.txt" -NoClobber
    
    #Conversión XLS a XLSX-------------------------------------------------------------
    $getyesterday = (get-date).AddDays(-1)
    $getyesterday = date $getyesterday -Format "yyyyMMdd"
    write-host $getyesterday
    Add-Type -AssemblyName Microsoft.Office.Interop.Excel
    
    $xlFixedFormat=[Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbook
    write-host $xlFixedFormat
    $excel = New-Object -ComObject excel.application
    $excel.visible = $true
    $folderpath = "E:\Portabilidad_Ventas\Audios\$getyesterday\"
    $filetype ="*xls"
    Get-ChildItem -Path $folderpath -Include $filetype -recurse | 
    ForEach-Object `
    {
    $path = ($_.fullname).substring(0, ($_.FullName).lastindexOf("."))
    
    "Converting $path"
    $workbook = $excel.workbooks.open($_.fullname)
    
    $path += ".xlsx"
    $workbook.saveas($path, $xlFixedFormat)
    $workbook.close()
    }
    $excel.Quit()
    $excel = $null
    [gc]::collect()
    [gc]::WaitForPendingFinalizers()
    
    #---------------------------------------------------------------
    #Renombrar
    $getyesterday2 = (get-date).AddDays(0)
    $getyesterday2 = date $getyesterday2 -Format "ddMMyyyy"
    write-host $getyesterday2
    Rename-Item -Path "E:\Portabilidad_Ventas\Audios\$getyesterday\METADATA_$getyesterday.xlsx" -NewName "E:\Portabilidad_Ventas\Audios\$getyesterday\METADATA_$getyesterday2.xlsx"
    
    #Mover metadata
    Move-Item -path "E:\Portabilidad_Ventas\Audios\$getyesterday\METADATA_$getyesterday.xls" -Destination "E:\Portabilidad_Ventas\Audios\MetaDatas\"
    
    #Fin log
    Stop-Transcript
    
    #--------------------------------------------------------------
    
    

    A partir de este punto, sabrás si el programador de tareas dice que entro, y así si realmente, entro

    Espero te ayude

    domingo, 3 de marzo de 2019 7:34
  • Hola,

    Además de lo que te dice Javi, la causa mas habitual para lo que indicas es que el programador de tareas no pueda utilizar el objeto COM de Excel que estás intentando utilizar en tu script.

    En este enlace, tienes las instrucciones para otorgar los permisos necesarios y que el objeto COM pueda ser utilizado.

    Espero que te sirva.

    Un saludo.

    Diego

    lunes, 4 de marzo de 2019 9:45