How to format a date field in powershell?

0

In this script, I can get the date for shortcuts, but is in YYYYMMDD (and time) format. I'm going for MM/dd/yyyy. I've tried several suggestions from the web, but all result in errors, maybe because of the type of fields. Check the creation, last modified, and install date. If you remove my date format attempts, the script runs fine. Any ideas will be appreciated.

$strComputer = "." 

$colItems = get-wmiobject -class "Win32_ShortcutFile" -namespace "root\CIMV2" ` 
-computername $strComputer 

foreach ($objItem in $colItems) { 
#      write-host "Access Mask: " $objItem.AccessMask 
#      write-host "Archive: " $objItem.Archive 
#      write-host "Caption: " $objItem.Caption 
#      write-host "Compressed: " $objItem.Compressed 
#      write-host "Compression Method: " $objItem.CompressionMethod 
#      write-host "Creation Class Name: " $objItem.CreationClassName 

#      write-host "CS Creation Class Name: " $objItem.CSCreationClassName 
#      write-host "CS Name: " $objItem.CSName 

#      write-host "Drive: " $objItem.Drive 
#      write-host "8.3 File Name: " $objItem.EightDotThreeFileName 
#      write-host "Encrypted: " $objItem.Encrypted 
#      write-host "Encryption Method: " $objItem.EncryptionMethod 
#      write-host "Extension: " $objItem.Extension 
      write-host "File Name: " $objItem.FileName 
      write-host "Description: " $objItem.Description 
      write-host "Creation Date: " $objItem.CreationDate -Format 'MM/dd/yyyy'
      write-host "File Size: " $objItem.FileSize 
      write-host "File Type: " $objItem.FileType 
#      write-host "FS Creation Class Name: " $objItem.FSCreationClassName 
#      write-host "FS Name: " $objItem.FSName 
#      write-host "Hidden: " $objItem.Hidden 
      write-host "Installation Date: " $objItem.InstallDate -Format 'dd/MM/yyyy'
#      write-host "In Use Count: " $objItem.InUseCount 
      write-host "Last Accessed:  $objItem.LastAccessed.ToString("MM/dd/yyyy")
      write-host "Last Modified:  $objItem.LastModified.ToString("MM/dd/yyyy")
#      write-host "Manufacturer: " $objItem.Manufacturer 
      write-host "Name: " $objItem.Name 
      write-host "Path: " $objItem.Path 
#      write-host "Readable: " $objItem.Readable 
      write-host "Status: " $objItem.Status 
      write-host "System: " $objItem.System 
      write-host "Target: " $objItem.Target 
#      write-host "Version: " $objItem.Version 
#      write-host "Writeable: " $objItem.Writeable 
      write-host 
} 
echo "Done"

JCauble

Posted 2016-06-03T19:16:28.730

Reputation: 17

Windows PowerShell Tip of the Week - Formatting Dates and Times – DavidPostill – 2016-06-03T19:22:12.980

Answers

1

What's going on is that the date/time stamps being returned from WMI are returned as Strings;

$objItem.CreationDate.GetType().FullName returns System.String as it's type.

This is why .ToString(), and other date formatting variations are failing when you try to format them as if they're a date.

So you need to convert it from a String type into the DateTime type, which you can then convert back into a (formatted) String...

Handily, the WMI object itself ($objItem in your ForEach loop) provides a method to convert the WMI string date/time stamps into actual and System.DateTime:

$objItem.ConvertToDateTime($objItem.CreationDate)

You can then convert this (back) to a formatted string using ToString. E.g.:

Write-host "Creation Date: " $objItem.ConvertToDateTime($objItem.CreationDate).ToString('MM\/dd\/yyyy')

Ensure you escape any forward slashes in the date format string, or else Windows will not include them in the string returned.

Ƭᴇcʜιᴇ007

Posted 2016-06-03T19:16:28.730

Reputation: 103 763

That's perfect! And an explanation of WHY it was acting "so strangely". Thank you very much, that's just what I was looking for! – JCauble – 2016-06-04T01:50:56.317