yonetpkbji
yonetpkbji

Reputation: 1019

Windows Powershell - Cannot create a html table correctly

I have a problem I am hoping someone is able to help with...

I have the following code:

Else {
                $script:MyReport += Get-CustomHeader "2" "Files older than"

                Get-ChildItem -Path $Target -Recurse | Where-Object { $_.LastWriteTime -lt $(get-date).('Add' + $PeriodName).Invoke(-$periodvalue) `
                -and $_.psiscontainer -eq $false } | `
                #Loop through the results and create a hashtable containing the properties to be added to a custom object

                ForEach-Object {
                    $properties = @{ 
                        Path = $_.Directory 
                        Name = $_.Name 
                        DateModified = $_.LastWriteTime }
                    #Create and output the custom object
                    $var1 = New-Object PSObject -Property $properties | select Path,Name,DateModified  
                    $script:MyReport += Get-HTMLTable ( $var1 | select Path,Name,DateModified )   

                }             

       } #Close Else clause on Test-Path conditional

The Get-HTMLTable function (shown below):

Function Get-HTMLTable{
    param([array]$Content)
    $HTMLTable = $Content | ConvertTo-Html
    $HTMLTable = $HTMLTable -replace '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">', ""
    $HTMLTable = $HTMLTable -replace '<html xmlns="http://www.w3.org/1999/xhtml">', ""
    $HTMLTable = $HTMLTable -replace '<head>', ""
    $HTMLTable = $HTMLTable -replace '<title>HTML TABLE</title>', ""
    $HTMLTable = $HTMLTable -replace '</head><body>', ""
    $HTMLTable = $HTMLTable -replace '</body></html>', ""
    Return $HTMLTable
}

The problem I am having:

The output I get from this is as follows:

Path                Name             DateModified
\\10.0.0.1\folder1  document1.xls    19/08/2013 16:02:01
Path                Name             DateModified
\\10.0.0.1\folder1  test.doc     20/08/2013 15:47:06
Path                Name             DateModified
\\10.0.0.1\folder1  anotherfile.txt  20/08/2013 15:42:26

However the output I actually want is as follows:

Path                Name             DateModified
\\10.0.0.1\folder1  document1.xls    19/08/2013 16:02:01
\\10.0.0.1\folder1  test.doc     20/08/2013 15:47:06
\\10.0.0.1\folder1  anotherfile.txt  20/08/2013 15:42:26

The part of the code I believe I am doing incorrectly and is the reason I am not getting the correct output is because of these few lines and the foreach object loop:

$var1 = New-Object PSObject -Property $properties | select Path,Name,DateModified  
$script:MyReport += Get-HTMLTable ( $var1 | select Path,Name,DateModified )   

Im sure there is something obvious I am overlooking but cannot see what I am doing wrong.

Your help with this much appreciated, thanks

Upvotes: 1

Views: 480

Answers (1)

nimizen
nimizen

Reputation: 3419

I too suspect it's related to how you're building the custom object within the foreach-object loop; after playing a while I gave up and tried to build it from scratch. Hopefully this will work for you.

Before your Get-ChildItem call create an empty array:

$tableObject = @()

Then change your foreach-object block to fill the array iteratively with the contents of the psobject:

    ForEach-Object {

        $properties = "" | Select Directory, Name, DateModified
            $properties.Directory = $_.Directory 
            $properties.Name = $_.Name 
            $properties.DateModified = $_.LastWriteTime
            $tableObject += $properties
    }             

Finally, outside of the foreach-object block add the table, passing the array without having to select anything:

$script:MyReport += Get-HTMLTable ( $tableObject )

As per my comment, don't change the values in the array, populate the array with the correct values:

    ForEach-Object {

        $properties = "" | Select 'Whatever You', Might, Want
            $properties.('Whatever You') = $_.Directory 
            $properties.Might = $_.Name 
            $properties.Want = $_.LastWriteTime
            $tableObject += $properties
    } 

Upvotes: 1

Related Questions