Author Posts

October 28, 2015 at 4:02 pm

Hello All

First time I'm posting as I've become quite stuck on a script I'm creating using Dons 'Convertto-EnhancedHTML' function.
Any help would be greatly appreciated ....

I've basically created a script that reads in a load of objects and pipes them out to a webpage using the 'Convertto-EnhancedHTML' advanced function.
The script is shown below and consists of a module file (which has all the advanced functions) that is called from the main script file.
The styling of the webpage is done via a css file which is also working fine. There are a lot more fragments in total but i've purposely not shown them
due to ease of readability.

PROBLEM: The problem I'm experiencing is when my Get-OsinfoVminfo function returns NOTHING (i.e. no objects) It messes up the entry on the
outputted webpage, so I would prefer it not to be outputted. Hence, I've been trying to figure out a way that if NO objects are
outputted then that fragment does not get added to my list of fragments .....
Make sense ????

The code (which I've shown below) shows the basic configuation script and my functions sit in another PSM1 module file. (not added).
As I have mentioned it works great, just want to figure this 'quirk' out.

As usual any help would be GREATLY appreciated. Many thanks in advance

# Controller Script – to be used in conjunction with 'Advanced functions'

[CmdletBinding()]
PARAM(
[Parameter(Mandatory=$true,
Position=0,
HelpMessage = "Please enter a Servername")]
[ValidateNotNullOrEmpty()]
[String[]]$computerName
)
BEGIN{
$style = (Get-content 'C:\css\style.css')
Get-Module OSTools | Out-Null

} # Begin
PROCESS{
Foreach ($computer in $computername) {
Write-Verbose $VC

$frag12 = Get-OsinfoVMInfo -VCName $computer | where { $_.name -ne (((($_.vmpathname).Split(']')[1]).Split('/'))[0].TrimStart(' '))} | Select Name,vmpathname |
ConvertTo-EnhancedHTMLFragment -TableCssID IFolders_TCID `
-DivCssID IFolders_DCID `
-DivCssClass IFolders_DCC `
-TableCssClass IFolders_TCC `
-As Table `
-Properties Name,vmpathname `
-MakeHiddenSection `
-MakeTableDynamic `
-Precontent 'Inconsistent Folders' | Out-String

$frag13 = Get-OsinfoVMInfo -VCName $computer | where {$_.'Consolidation Needed' -eq $true} | Select Name, 'Consolidation Needed' |
ConvertTo-EnhancedHTMLFragment -TableCssID Consolidation_Needed_TCID `
-DivCssID Consolidation_Needed_DCID `
-DivCssClass Consolidation_Needed_DCC `
-TableCssClass Consolidation_Needed_TCC `
-As Table `
-Properties Name,'Consolidation Needed' `
-MakeHiddenSection `
-MakeTableDynamic `
-Precontent 'Consolidation Required' | Out-String

$frag14 = Get-OsinfoVMInfo -VCName $computer | where {($_.'NIC Connected' -ne $true) -or ($_.'NIC Start' -ne $true)} | Select Name, 'NIC Connected','NIC Start' |
ConvertTo-EnhancedHTMLFragment -TableCssID NIC_Connected_TCID `
-DivCssID NIC_Connected_DCID `
-DivCssClass NIC_Connected_DCC `
-TableCssClass NIC_Connected_TCC `
-As Table `
-Properties Name,'NIC Connected','NIC Start' `
-MakeHiddenSection `
-MakeTableDynamic `
-Precontent 'NIC State' | Out-String

$frag15 = Get-OsinfoVMInfo -VCName $computer | where {($_.'Inaccessible/Invalid VM' -eq 'Invalid') -or ($_.'Inaccessible/Invalid VM' -eq 'Inaccessible')} | Select Name, 'Inaccessible/Invalid VM' |
ConvertTo-EnhancedHTMLFragment -TableCssID InvalidVMs_TCID `
-DivCssID InvalidVMs_DCID `
-DivCssClass InvalidVMs_DCC `
-TableCssClass InvalidVMs_TCC `
-As Table `
-Properties Name,'Inaccessible/Invalid VM' `
-MakeHiddenSection `
-MakeTableDynamic `
-Precontent 'Inaccessible VMs' | Out-String

$path = Join-Path -Path 'C:\temp' -ChildPath ("$VC" + "_" + "$(((Get-date).ToShortDateString()) -replace '/',")" + ".html")

ConvertTo-EnhancedHTML -Title "Morning Check Report for $computer" `
-PreContent "Morning Report: $(($VC).ToUpper())" `
-HTMLFragments $frag1,$frag2,$frag3,$frag4,$frag5,$frag6,$frag7,$frag8,$frag9,$frag10,$frag11,$frag12,$frag13,$frag14,$frag15 `
-PostContent "Time Retrieved $(Get-Date)" `
-CssStyleSheet $style |
Out-File $path -Encoding ascii
} #foreach
} # Process
END{} # End

October 28, 2015 at 4:13 pm

Heading on vacation, but briefly:

Capture the output of your function into a variable. Then check $var.count to see if it's zero. If it is, don't output. If it isn't, create your HTML fragment.

Alternately, see if $var -Eq $null – meaning, it's got nothing in it. Sometimes that's more reliable of a check.

October 29, 2015 at 4:08 am

Thanks Don – Much appreciated (have a nice break) ! I thought as much but I've run into another problem .... shown below.

So as you mentioned I have captured my output into a variable and using $null I'm omitting each of the $frags that are not reporting back anything – see below:

if((Get-OSinfoVMInfo -computerName Server1 | where {($_.'NIC Connected' -ne $true) -or ($_.'NIC Start' -ne $true)}) -eq $null){
Out-Null
} else {
$frag14 = Get-OsinfoVMinfo -computerName Server1 | where {($_.'NIC Connected' -ne $true) -or ($_.'NIC Start' -ne $true)} | Select Name, 'NIC Connected','NIC Start' |
ConvertTo-EnhancedHTMLFragment -TableCssID NIC_Connected_TCID `
-DivCssID NIC_Connected_DCID `
-DivCssClass NIC_Connected_DCC `
-TableCssClass NIC_Connected_TCC `
-As Table `
-Properties Name,'NIC Connected','NIC Start' `
-MakeHiddenSection `
-MakeTableDynamic `
-Precontent 'NIC State' | Out-String
$HTMLFrags += ($frag14 + ',')
}

I then am trying to add them into the '$HTMLFrags' variable. (Hence only the successful ones will be added in.)

The issue is this when I get my $HTMLfrags variable back it has all the 'successful' 'frags' in there as expected but I CANNOT enter that into the '-HTMLfragments' parameter in the 'Convertto-EnhanceHTML' advanced function. This is because the parameter requires that each of the '$frag' variables that are to be entered in be separated by commas.

So I need a way to enter in the $HTMLFrags variable in a manner that the separate $frags can be separated by a',' (comma). I've tried splitting the entries by using the -split operator (using 'span' to split on) but it removes it completely. After the split Ive tried the -join operator but that hasnt worked.

I feel like Im close to a solution but could do with the extra help.

Many thanks in advance
munster99

October 29, 2015 at 5:33 am

You're meant to capture each fragment into a different variable. If you're concatenating them all together, then the command won't work the way it's designed.

October 29, 2015 at 6:33 am

Thanks Don – but how would I omit a fragment if it reports back with nothing ???!? ?

All of my fragments come back in their own $frag[1-15] using the below syntax ...

$frag14 = Get-OSinfoVMVMInfo -computerName servername | where {($_.'NIC Connected' -ne $true) -or ($_.'NIC Start' -ne $true)} | Select Name, 'NIC Connected','NIC Start' |
ConvertTo-EnhancedHTMLFragment -TableCssID NIC_Connected_TCID `
-DivCssID NIC_Connected_DCID `
-DivCssClass NIC_Connected_DCC `
-TableCssClass NIC_Connected_TCC `
-As Table `
-Properties Name,'NIC Connected','NIC Start' `
-MakeHiddenSection `
-MakeTableDynamic `
-Precontent 'NIC State' | Out-String

When I enter into the -HTMLfragments parameter I am entering the following string:

-HTMLFragments $frag1,$frag2,$frag3,$frag4,$frag5,$frag6,$frag7,$frag8,$frag9,$frag10,$frag11,$frag12,$frag13,$frag14,$frag15 `

The error i'm getting is as follows:

Write-Verbose : Cannot bind argument to parameter 'Message' because it is null.
At D:\scripts\MorningChecks.ps1:202 char:23
+ Write-Verbose $HTMLFrags
+ ~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Write-Verbose], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.WriteVerboseCommand

So i am assuming I am getting this error back due to one of the $frag variables is null. Ideally would like to know how I can create a foreach loop for all of my frags – the issue is once the 'out-string' cmdlet is used ALL of the frags are populated hence the $null does not work.

October 29, 2015 at 6:35 am

What the parameter accepts is an array, not a comma separated list per se.

$array = @()

Creates a fresh array.

$array += $frag

Adds a fragment to it. So you simply don't add a blank fragment. Pass $array to the parameter.

October 29, 2015 at 6:58 am

Ok so I understand that the parameter requires an array. But how do I add each fragment as shown above to the array. i tried that with the if statement but it didnt work ;-(

Im getting all the frags but its adding them to the array thats puzzling me.

thanks for your help again DON 😉

October 29, 2015 at 7:03 am

That was the command I gave you.

$array = @()

$frag = do-something | convertto-enhancedhtmlfragment
$array += $frag

$frag = do-somethingelse | convertto-enhancedhtmlfragment
$array += $frag

$result = do-somethingagain
If ($result -ne $null) {
$frag = $result | convertto-enhancedhtmlfragment
$array += $frag
}

$array now has 2-3 fragments in it.

October 30, 2015 at 12:51 am

OMG! that worked and it rocks !!!!

Thank you soooo much Don – much appreciated. Will remember this 'technique' for the future as its really handy.

(For anyone who wants to know – instead of labelling my fragments $frag1, $frag2,$frag3 etc I ended up labelling them as $frag and appended to the $array variable (as shown by Don). The if statement then allowed me to output data if I received any objects and vice versa.This $array variable was then inputted into the -HTMLfragments parameter, and 'voila' only the frags that had data would output to my webpage.)