foreach object convert to html

This topic contains 5 replies, has 3 voices, and was last updated by  Norm Long 3 months, 1 week ago.

  • Author
    Posts
  • #98398

    Norm Long
    Participant

    Good afternoon;

    In the following script is there a way to have the pre and post content appear only once as opposed for each object?

    Thank you for your input

    $names=Import-Csv C:\Tmp\WinRM_Services.csv | select -ExpandProperty MachineName
    clear-content -Path 'D:\PowerShell_temp\psversion_errors.txt'
    clear-content -Path 'D:\Powershell_temp\psversion.txt'
    clear-content -Path 'D:\Powershell_temp\psversion.html'
    clear-content -Path 'D:\Powershell_temp\psversion_message.txt'
    $Title = "PSversion Analysis"
    $footer = "report run $(Get-Date)"
    $computername = $env:computername

    $output1 = foreach ($name in $names) {
    try {
    #Invoke-Command -ComputerName $name -ScriptBlock {$PSVersionTable.psversion} -ErrorAction Stop | Out-File -FilePath 'D:\Powershell_temp\psversion.txt' -Append
    Invoke-Command -ComputerName $name -ScriptBlock {$PSVersionTable.psversion} -ErrorAction Stop | `
    ConvertTo-Html -Title $Title -PreContent "$Computername" -PostContent $footer | `
    Out-File d:\powershell_temp\psversion.html -Append
    #The [ ] is not needful for the script to run, helpful script documentation to indicate what errors were lookin note below how the value in the [ ] brackets was obtained.
    } catch [System.Management.Automation.Remoting.PSRemotingTransportException] {

    #Piping the exception message to the outfile worked.
    $_.Exception.Message | out-file -FilePath 'D:\PowerShell_temp\psversion_errors.txt' -Append
    Write-Host "Message: [$($_.Exception.Message)"] -ForegroundColor Red -BackgroundColor DarkBlue
    #The following two lines produces the same output as in psversion_errors.txt
    $exception = $_.Exception.Message
    Out-File -FilePath 'D:\Powershell_temp\psversion_message.txt' -Append -InputObject $exception

    }
    }

  • #98467

    Olaf Soyk
    Participant

    Just to don't leave you without any answer at all ... just an idea: You could "collect" all the needed data "inside" your foreach loop like you actually already do and output it and convert it to HTML after the loop has finished in one big chunk. This way you wouldn't have multiple HTML documents in one file.
    Or you use the parameter -Fragment for your Convertto-HTML inside your loop and create the header and footer and everything else you need seperately and assemble it later.

  • #98506

    Norm Long
    Participant

    Olaf,
    Thank you for your response, a little over my head. My powershell scripting skill is at a novice level, trying to do things that are at times over my head.

    Norm

    • #98539

      Olaf Soyk
      Participant

      So you might start with learning the basics of Powershell from scratch. This thread lists some good starting points for your studies: Beginner sites and tutorials. (scroll down to the bottom)

      And here I have a simple example of what I meant: With

      $ServicesStartigWithA = Get-Service -Name a*  
      

      You store the result of this simple query in a variable. Then you can iterate over all single elements of this array and convert each single element to HTML and store the result in a file:

      foreach ($Service in $ServicesStartigWithA) {
      	$Service | 
          Select-Object -Property Status,Name,DisplayName  | 
              ConvertTo-Html | 
                  Out-File C:\sample\sample_Uncool.html -Append
      }

      If you open this HTML file in a browser it looks bad.
      If you "collect" the needed properties you want in a variable $output you can pipe this "outside your loop" in a big chunk to the Convertto-HTML and create a valid HTML file wich looks just fine in the browser.

      $output = foreach ($Service in $ServicesStartigWithA) {
      	$Service | 
              Select-Object Status,Name,DisplayName  
      }
      $output | 
          ConvertTo-Html | 
              Out-File C:\sample\sample_cool.html -Append
      

      Another tip: please do not use backticks as line continuation charachters. They are actually unnecessary and are usually considered as really bad style. 😉

  • #98533

    Joel Sallow
    Participant

    Something along these lines:

    $output1 = foreach ($ComputerName in $names) {
        try {
            Invoke-Command -ComputerName $ComputerName -ScriptBlock {$PSVersionTable.psversion} -ErrorAction Stop
        } 
        catch [System.Management.Automation.Remoting.PSRemotingTransportException] {
            $_.Exception.Message | out-file -FilePath 'D:\PowerShell_temp\psversion_errors.txt' -Append
            Write-Host "Message: [$($_.Exception.Message)"] -ForegroundColor Red -BackgroundColor DarkBlue
        }
    }
    
    $output1 | 
        ConvertTo-Html -Title $Title -PreContent "$Computername" -PostContent $footer |
        Add-Content -Path 'd:\powershell_temp\psversion.html'

    Basically, allow the $output1 variable to store the output instead of outputting to a file, then convert the whole lot to HTML at once, and then output everything to a file at the end.

    Alternate version which pipes the whole thing along at once without bothering to store it in a variable:

    $names | ForEach-Object {
        try {
            Invoke-Command -ComputerName $_ -ScriptBlock {$PSVersionTable.psversion} -ErrorAction Stop
        } 
        catch [System.Management.Automation.Remoting.PSRemotingTransportException] {
            $_.Exception.Message | out-file -FilePath 'D:\PowerShell_temp\psversion_errors.txt' -Append
            Write-Host "Message: [$($_.Exception.Message)"] -ForegroundColor Red -BackgroundColor DarkBlue
        }
    } | ConvertTo-Html -Title $Title -PreContent "$Computername" -PostContent $footer |
        Add-Content 'd:\powershell_temp\psversion.html'
  • #98574

    Norm Long
    Participant

    Thank you Joel your script works perfectly!!

    Norm

You must be logged in to reply to this topic.