none
PowerShell Script mit via Task Scheduler laufen lassen RRS feed

  • Frage

  • Hallo

    Ich habe Probleme mein PowerShell Script via den Task Scheduler laufen zu lassen.

    Es führt das Script zu einem gewissen Grad aus, es öffnet Excel im  Hintergrund, löscht alle Excel Dateien im Ordner und schreibt das Transcript aber es speichert das Excel nicht.
    Wichtig zu beachten ist, dass wenn ich es Manuel ausführe es einwandfrei funktioniert.

    Ich habe bereits den Ordner erstellt:
    C:\Windows\SysWOW64\config\systemprofile\Desktop

    Es zeigt mir im Task Scheduler auch keinen Error an.

    Ich wäre froh wenn mir jemand dabei helfen könnte.

    #Starting Transcript to file
    $go = "D:\Transcript.txt:"
    Start-Transcript -Path $gitgud
    
    #Silently continus the Script incase an error occures
    $ErrorActionPreference = "Silentlycontinue"
    
    #Delete last months Excel so folder wont get too big
    $path = "D:\Script"
    Get-ChildItem -Path $path -include *.xls, *.xlsx -recurse |
    foreach($_) { Remove-Item $_.fullname } | Out-Null
    
    #Create excel COM object
    $excel = New-Object -ComObject excel.application
    
    #Make Visible
    $excel.Visible = $True
    $excel.DisplayAlerts = $false
    
    #Add a workbook
    $workbook = $excel.Workbooks.Add()
    
    #Remove other worksheets
    1..2 | ForEach {
        $Workbook.worksheets.item(2).Delete()
    }
    
    #Connect to first worksheet to rename and make active
    $serverInfoSheet = $workbook.Worksheets.Item(1)
    $serverInfoSheet.Activate() | Out-Null
    
    #Create a Title for the first worksheet
    $row = 1
    $Column = 1
    $serverInfoSheet.Cells.Item($row,$column)= "Disk Space Information $(get-date -f yyyy-MM-dd)"
    
    $Selection = $serverInfoSheet.Range("A1:F2")
    $Selection.Merge()
    $Selection.VerticalAlignment = -4160
    
    #Give it a nice Style so it stands out
    $serverInfoSheet.Cells.Item($row,$column).Font.Size = 18
    $serverInfoSheet.Cells.Item($row,$column).Font.Bold=$True
    $serverInfoSheet.Cells.Item($row,$column).Font.Name = "Cambria"
    $serverInfoSheet.Cells.Item($row,$column).Font.ThemeFont = 1
    $serverInfoSheet.Cells.Item($row,$column).Font.ThemeColor = 4
    $serverInfoSheet.Cells.Item($row,$column).Font.ColorIndex = 55
    $serverInfoSheet.Cells.Item($row,$column).Font.Color = 8210719
    
    #Increment row for next set of data
    $row++;$row++
    
    #Save the initial row so it can be used later to create a border
    $initalRow = $row
    
    #Create a header for Disk Space Report; set each cell to Bold and add a background color
    $serverInfoSheet.Cells.Item($row,$column)= 'Computername'
    $serverInfoSheet.Cells.Item($row,$column).Interior.ColorIndex =48
    $serverInfoSheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++
    $serverInfoSheet.Cells.Item($row,$column)= 'DeviceID'
    $serverInfoSheet.Cells.Item($row,$column).Interior.ColorIndex =48
    $serverInfoSheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++
    $serverInfoSheet.Cells.Item($row,$column)= 'TotalSizeGB'
    $serverInfoSheet.Cells.Item($row,$column).Interior.ColorIndex =48
    $serverInfoSheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++
    $serverInfoSheet.Cells.Item($row,$column)= 'UsedSpaceGB'
    $serverInfoSheet.Cells.Item($row,$column).Interior.ColorIndex =48
    $serverInfoSheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++
    $serverInfoSheet.Cells.Item($row,$column)= 'FreeSpaceGB'
    $serverInfoSheet.Cells.Item($row,$column).Interior.ColorIndex =48
    $serverInfoSheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++
    $serverInfoSheet.Cells.Item($row,$column)= '%Free'
    $serverInfoSheet.Cells.Item($row,$column).Interior.ColorIndex =48
    $serverInfoSheet.Cells.Item($row,$column).Font.Bold=$True
    
    #Increment Row and reset Column back to first column
    $row++
    $Column = 1
    
    #Getting Server Names
    $disk = Get-Content D:\servers.txt, D:\testservers.txt
    $servers = Get-Content D:\servers.txt, D:\testservers.txt
    
    #Pinging all servers and writing output to Error file
      foreach ($server in $servers) {
      if (test-Connection -ComputerName $server -Count 2 -Quiet ) {  
            Write-Output "$server is alive" 
             } else 
               { Write-Output "$server seems dead" 
                 }     
    }
    
    #Get the drives and filter out CD/DVD drives
    $diskDrives = Get-WmiObject win32_LogicalDisk -Filter "DriveType='3'" -ComputerName $disk
    
    #Process each disk in the collection and write to spreadsheet
    ForEach ($disk in $diskDrives) {
        $serverInfoSheet.Cells.Item($row,$column)= $disk.__Server
        $Column++
        $serverInfoSheet.Cells.Item($row,$column)=  $disk.DeviceID
        $Column++
        $serverInfoSheet.Cells.Item($row,$column)= ($disk.Size /1GB).ToString("#0.00")
        $Column++
        $serverInfoSheet.Cells.Item($row,$column)= (($disk.Size - $disk.FreeSpace)/1GB).ToString("#0.00")
        $Column++
        $serverInfoSheet.Cells.Item($row,$column)= ($disk.FreeSpace / 1GB).ToString("#0.00")
        $Column++
        $serverInfoSheet.Cells.Item($row,$column)= ("{0:P}" -f ($disk.FreeSpace / $disk.Size))  
        $Column++ 
    
        #Check to see if space is near empty and use appropriate background colors
        $range = $serverInfoSheet.Range(("A{0}" -f $row),("F{0}"  -f $row))
        $range.Select() | Out-Null
        
        #Determine if disk needs to be flagged for warning or critical alert
       
        #Critical threshold 
        If ($disk.FreeSpace -lt 5GB)  {
            $range.Interior.ColorIndex = 3
    
        #Warning threshold 
        } ElseIf ($disk.FreeSpace -lt 10GB) {
            $range.Interior.ColorIndex = 6
            }
        #Add row and reset Column for the next Server
        $row++
        $Column = 1
               
      }
    
        #Creat Borders for the Data
      $row--
    $dataRange = $serverInfoSheet.Range(("A{0}" -f $initalRow),("F{0}"  -f $row))
    7..12 | ForEach {
        $dataRange.Borders.Item($_).LineStyle = 1
        $dataRange.Borders.Item($_).Weight = 2
        }
    
    #All numbers from right to left for readability
    $border = $serverInfoSheet.Range(("C{0}" -f $initalRow),("F{0}"  -f $row))
    7..12 | ForEach {
        $border.HorizontalAlignment = -4152
        }
    
      #Auto fit everything so it looks better
    $usedRange = $serverInfoSheet.UsedRange	
    $usedRange.EntireColumn.AutoFit() | Out-Null
    
    #Save the file
    $workbook.SaveAs("D:\Script\$(get-date -f yyyy-MM-dd) DiskSpace.xlsx")
    
    #Closing the file and releasing it
    $excel.Quit()
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$excel) | Out-Null
    
    
    #Convert all exels in this Folder and its Subfolders to Pdf
    $path = "D:\Script"
    $xlFixedFormat = “Microsoft.Office.Interop.Excel.xlFixedFormatType” -as [type] 
    $excelFiles = Get-ChildItem -Path $path -include *.xls, *.xlsx -recurse 
    $objExcel = New-Object -ComObject excel.application 
    $objExcel.visible = $false 
    foreach($wb in $excelFiles) 
    { 
     $filepath = Join-Path -Path $path -ChildPath ($wb.BaseName + “.pdf”) 
     $workbook = $objExcel.workbooks.open($wb.fullname, 3) 
     $workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $filepath) 
     $objExcel.Workbooks.close() 
    } 
    #Closing the file
    $objExcel.Quit()
    
    #Stoping the Transcript
    Stop-Transcript
    
    kill -processname Excel


    • Bearbeitet iSavicx Mittwoch, 19. Oktober 2016 14:10 Grammatik
    Mittwoch, 19. Oktober 2016 14:07

Antworten

  • Manchmal ist es einfacher einen Fehler zu umgehen, als ihn zu beseitigen. Ich vermute mal das Import-Excel Modul kennst Du schon? Wenn das auch nicht weiterhilft, kannst Du Deine Aufgabe eventuell 'aufteilen'. Die Informationsbeschaffung könntest Du in Deinem scheduled task erledigen und die Ergebnisse in CSV-Dateien pumpen. Die Aufbereitung könnte dann eine entsprechend vorbereitete Exceldatei übernehmen. Excel kann gut mit CSV umgehen. ;-) Oder wenn Du sowieso schon einen SQL-Server mit Reporting Service zur Verfügung hast, kannst Du die Daten dort abladen und dann entsprechend aufbereiten.

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''


    Donnerstag, 20. Oktober 2016 14:28

Alle Antworten

  • Warst Du mit den Antworten im englischen Forum unzufrieden?  ;-)

    Du hast ma Anfang Deines Scriptes ....

    $ErrorActionPreference = "Silentlycontinue"
    ... hast Du mal versucht, eventuell auftretende Fehler nicht zu ignorieren/übergehen, sondern abzufangen? Manchmal hilft es ja doch, eine Fehlermeldung auszuwerten.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 19. Oktober 2016 14:59
  • Die Antwort "es geht halt nicht" ist nicht gerade zufrieden stellend ;-)
    Aber wie in dem Forum schon angesprochen glaube ich auch das es am Excel Objekt liegt. Nur hoffe ich, dass es einen weg gibt dieses Problem zu beheben.

    Das habe ich probiert. Der einzige Error den es anzeigt ist, dass es keine Infos von den Servern in der DMZ holen kann. Ich habe es nur drin damit das Transcript file nicht unlesbar wird.

    Donnerstag, 20. Oktober 2016 13:58
  • Manchmal ist es einfacher einen Fehler zu umgehen, als ihn zu beseitigen. Ich vermute mal das Import-Excel Modul kennst Du schon? Wenn das auch nicht weiterhilft, kannst Du Deine Aufgabe eventuell 'aufteilen'. Die Informationsbeschaffung könntest Du in Deinem scheduled task erledigen und die Ergebnisse in CSV-Dateien pumpen. Die Aufbereitung könnte dann eine entsprechend vorbereitete Exceldatei übernehmen. Excel kann gut mit CSV umgehen. ;-) Oder wenn Du sowieso schon einen SQL-Server mit Reporting Service zur Verfügung hast, kannst Du die Daten dort abladen und dann entsprechend aufbereiten.

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''


    Donnerstag, 20. Oktober 2016 14:28
  • Das Import-Excel Modul kenn ich noch nicht, werde mich dort einlesen.

    Habe gerade begonnen mit dem Aufteilen des Scripts. Als ich damit begonnen habe, habe ich alles mit CSV gemacht doch dort hatte ich sehr viel mühe alles korrekt zu formatieren. Schlussendlich brauch ich alle Laufwerkinformationen schön lesbar, wie ich zu dem gelange ist nebensächlich. Ich bin offen andere Sache auszuprobieren.

    Das mit SQL wäre eigentlich Überlegenswert aber das ist leider, im Moment zumindest, nicht möglich.


    • Bearbeitet iSavicx Freitag, 21. Oktober 2016 13:10 Logikfehler
    Freitag, 21. Oktober 2016 13:04
  • Wenn es Dir nur um die Präsentation und nicht um die Weiterverarbeitung in Excel geht, könntest Du die gewonnenen und in CSV-Dateien gespeicherten Daten in HTML konvertieren und so entsprechend aufbereiten. Es müsste zahlreiche Beispiele im Netz geben, wie man in Powershell HTML-Output manipuliert. 

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Freitag, 21. Oktober 2016 13:10