PSCustomObject convert install date

I’ve been trying to figure something out now for a day and can’t find a solution.

So the below code is to create customobject of Application name and date of install.

$application = (Get-WmiObject -Namespace ROOT\cimv2 -class Win32Reg_AddRemovePrograms) | 
ForEach-Object {[PSCustomObject]@{Applications = $_.Displayname; InstallofApplication = $_.installdate}}

I really want to convert the format of the date from 20150511 to dd/MM/yyyy.
Ive tried

but can’t get it to work. Drive me mad !

Try it like this:

$application = (Get-WmiObject -Namespace ROOT\cimv2 -class Win32Reg_AddRemovePrograms) | 
    ForEach-Object { [PSCustomObject]@{
        Applications = $_.Displayname; 
        InstallofApplication = Get-Date ([datetime]::ParseExact($_.InstallDate,'yyyyMMdd',$null)) -format d}}

First off - are you sure you have the correct class? Win32Reg_AddRemoveprograms only exists if you have the SCCM client installed.

In terms of date conversion. The WMI cmdlets return dates in WMI’s format
£> Get-WmiObject -Class Win32_OperatingSystem | select date | fl

InstallDate : 20131205101649.000000+000
LocalDateTime : 20150728121320.002000+060

A method to convert dates is added to all objects returned by Get-WmiObject

£> Get-WmiObject -Class Win32_OperatingSystem | select @{N=‘Install’; E={$.ConvertToDateTime($.Installdate)}}, @{N=‘Lo
calDate’; E={$.ConvertToDateTime($.LocalDateTime)}} | fl

Install : 05/12/2013 10:16:49
LocalDate : 28/07/2015 12:16:26

Alternatively (and easier) use the CIM cmdlets as the date comes pre-converted
£> Get-CimInstance -ClassName Win32_OperatingSystem | select date | fl

InstallDate : 05/12/2013 10:16:49
LocalDateTime : 28/07/2015 12:17:29

Hi Richard,

Yes its for an SCCM client.

I will have a play with both your solutions, Many thanks for your quick replies ! :slight_smile:

Hi Richard,

Doing Get-CIMInstance -ClassName Win32Reg_AddRemoveprograms doesn’t return the date in the correct format.

Also, don’t think i’m doing something write here,

$application = (Get-WmiObject -Namespace ROOT\cimv2 -class Win32Reg_AddRemovePrograms) | select  @{N='Install'; E={$_.ConvertToDateTime($_.Installdate)}

See if this works:

Get-WmiObject -Namespace ROOT\cimv2 -class Win32Reg_AddRemovePrograms | select displayname, @{l=“Installdate”;e={([DateTime]::ParseExact($_.InstallDate,‘yyyyMMdd’,$null).ToString(‘MM/dd/yyyy’))}}

So by doing this:

$application = Get-WmiObject -Namespace ROOT\cimv2 -class Win32Reg_AddRemovePrograms | 
ForEach-Object { [PSCustomObject]@{
Applications = $_.Displayname;
InstallofApplication = get-date ([datetime]::ParseExact($_.InstallDate,'yyyyMMdd',$null)) -Format d }} 

It generates a error :

Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
At line:4 char:24
+ InstallofApplication = get-date ([datetime]::ParseExact($_.InstallDate,'yyyyMMdd ...
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FormatException

But strangely the results are correct :

PS C:\WINDOWS\system32> $application

Applications                                                                         InstallofApplication                                                                
------------                                                                         --------------------                                                                
Microsoft Visual C++ 2010  x64 Redistributable - 10.0.40219                          06/07/2015                                                                          
Configuration Manager Client                                                         20/07/2015                                                                          
Microsoft Policy Platform                                                            06/07/2015                                                                          
Microsoft Visual C++ 2013 x64 Additional Runtime - 12.0.21005                        20/07/2015                                                                          
Microsoft Visual C++ 2013 x64 Minimum Runtime - 12.0.21005                           20/07/2015                                                                          
Microsoft Visual C++ 2005 Redistributable (x64)                                      06/07/2015 

Whats going on ? Could there be a hidden header or something ?

What you’ll find is that not all of the applications have the InstallDate property populated. Trying to convert the empty string to a date returns an error.

If you compare the results of

(Get-WmiObject Win32Reg_AddRemovePrograms).count



after running your script, you’ll find the ones without dates are missing from the output.

Methinks some error handling is required.

Matt, think you’ve hit the problem !

(Get-WmiObject Win32Reg_AddRemovePrograms).count
= 7

= 6

Checking between the two, the additional object is “Intel® Graphics Media Accelerator Driver”.