New-Object to CSV problem

Hi Guys,

I have this script that queries remote machines to get all java version installed.
There is one query for 32 bits and another one for 64 bits as i need them to be separated in my csv.

It works absolutely fine if a machine has one 32 bits version and/or a 64 bits too.
However, if the machine has more than one 32 bits or 64 bits, the wmi query outputs 2 lines, and in my csv i get System.object[].

Current CSV output:

Computer Name	Statut	Java 32 bits version	Java 64 bits version
GVA-GUEST-08	Online	Java 8 Update 91	
GVA-GUEST-09	Online	System.Object[]	        Java 8 Update 40 (64-bit)

Sorry for the Where-Object verylong lines, piping was the only way i found to add multiple conditions.

Any help ?

My code:

$ComputerList = Read-Host -Prompt 'Enter path to computer list'
$ComputerName = Get-Content $ComputerList

Function Get-JavaVersion{
    Foreach ($C in $ComputerName) {
        If (-not (Test-Connection -cn $C -quiet -Count 1)){
            $OffHashTable=[ordered]@{
                'Computer Name'=$C
                'Statut'='Offline'
                }
            New-Object PSObject -Property $OffHashTable
        }

        Else {
            $Java32 = gwmi -cn $C Win32_Product | ? Name -Like "Java*Update*" | ? Name -NotLike "*64*" | ? Name -NotLike "*Auto*" | ? Name -NotLike "*Development*" -ErrorAction SilentlyContinue
            $Java64 = gwmi -cn $C Win32_Product | ? Name -Like "Java*Update*64*" | ? Name -NotLike "*Auto*"| ? Name -NotLike "*Development*" -ErrorAction SilentlyContinue
        
            $OnHashTable=[ordered]@{
                'Computer Name'=$C
                'Statut'='Online'
                'Java 32 bits version'=$Java32.caption
                'Java 64 bits version'=$Java64.caption
                }
            New-Object PSObject -Property $OnHashTable
        }       
    }
}  

Get-JavaVersion | Export-Csv C:\Javaversion.csv -NoTypeInformation

CSV’s are all string values. Your captions should be arrays of captions, so you can join them and convert them to a string. Try:

Get-JavaVersion | 
Select "Computer Name", 
       Statut, 
       @{Name="Java 32 bits version";Expression={$Java32.caption -join ","}},
       @{Name="Java 64 bits version";Expression={$Java64.caption -join ","}} |
Export-Csv C:\Javaversion.csv -NoTypeInformation

Sweeet !

Just added -join “,” to both $Java32.Caption and $Java64.Caption and it works !

Thanks a lot Rob

you can also shorten the

$Java32 = gwmi -cn $C Win32_Product | ? Name -Like "Java*Update*" | ? Name -NotLike "*64*" | ? Name -NotLike "*Auto*" | ? Name -NotLike "*Development*" -ErrorAction SilentlyContinue
$Java64 = gwmi -cn $C Win32_Product | ? Name -Like "Java*Update*64*" | ? Name -NotLike "*Auto*"| ? Name -NotLike "*Development*" -ErrorAction SilentlyContinue

with

#this will match if Name ends with a digit like "Java 8 Update 91"
$Java32 = gwmi -cn $C Win32_Product | ? Name -match "java.*\d$" 
#this will match if Name ends with a parenthesis character like "Java 8 Update 91 (64-bit)"
$Java64 = gwmi -cn $C Win32_Product | ? Name -match "java.*\)$"

however , i’m not sure if this is constant in java versioning

Just want to point out if you do some further googling you will come across many articles that advise against querying the Win32_Product class as querying it may cause something like a reinstall of some applications or something like that. Most professionals will recommend querying the registry for such information over wmi.