Forum Discussion

Fred_Elmendorf's avatar
Fred_Elmendorf
Brass Contributor
Mar 10, 2023

Parsing a file name and comparing a string to file creation date

I'm still a novice in PowerShell, but I have continuing problems to solve.

 

I have automatically created file names of this form:

event-20220630T1420405650000.pqd

Where event- is constant, the next 8 characters represent yyyymmdd, T is a constant, and the remaining 13 characters represent an incrementing time, possibly in seconds since some starting date.

My challenge is to compare the yyyymmdd in the file name to the yyyymmdd in the file creation date and determine if the date in the file name is in the future when compared to the creation date.

 

Any assistance will be greatly appreciated!

 

Thanks,

Fred

  • try this code and let know if this will solve your problem

    $file_name = "event-20220630T1420405650000.pqd"
    $date_str = $file_name.Substring(6, 😎
    $date_obj = [datetime]::ParseExact($date_str, "yyyyMMdd", $null)

    $file_path = "C:\path\to\event-20220630T1420405650000.pqd"
    $creation_time = (Get-ItemProperty -Path $file_path).CreationTime
    $creation_date = $creation_time.Date

    if ($date_obj -gt $creation_date) {
    Write-Output "Date in file name is in the future."
    } else {
    Write-Output "Date in file name is not in the future."
    }
    • Fred_Elmendorf's avatar
      Fred_Elmendorf
      Brass Contributor
      Thank you for your quick reply. I've been trying to incorporate your code into an existing script that I'm using to recurse a directory structure and extract specific information including the latest file name, size, and creation time, along with the parent folder name and the total file count in the folder and direct the output to a .csv file. That original script is functioning properly. My goal is to incorporate your code in such a way that as the folders are recursed, any file name date pattern that is in the future compared to the creation date of that specific file will be flagged as "Date in file name is in the future". So far, things are working with one exception. The $creation_date is the creation date of the parent folder, not the file. Here's the ugly code I have put together so far, and a sample of the output. Any additional assistance will be greatly appreciated.

      $dirs = Get-ChildItem "\\fileshare\level1\level2\level3\parentdirectory" -Directory
      $csvLog = "\\fileshare\toplevel\myprofile\myfolders\Documents\PowerShellOutput\Ion Future Events.csv"

      foreach ($dir in $dirs) {

      $recentFile = $null
      $folder = $dir.Name
      $directory = $dir.FullName

      echo "Directory" $directory

      $filesCount = (Get-ChildItem $directory -Filter "event*.pqd" -Recurse).Count
      $recentFile = Get-ChildItem $directory -Filter "event*.pqd" -Recurse | Sort-Object LastWriteTime -Descending| Select-Object -First 1
      $recentFileName = $recentFile.Name
      $recentFileLength = $recentFile.Length
      $recentFileWriteTime = $recentFile.LastWriteTime

      if ($recentFile) {

      $file_name = $recentFileName
      $date_str = $file_name.Substring(6, 😎

      echo "Date_str" $date_str

      $date_obj = [datetime]::ParseExact($date_str, "yyyyMMdd", $null)

      echo "Date Obj" $date_obj

      $file_path = "\\fileshare\level1\level2\level3\parentdirectory"
      $creation_time = (Get-ItemProperty -Path $file_path).CreationTime

      echo "Creation Time" $creation_time

      $creation_date = $creation_time.Date

      echo "Creation Date" $Creation_date

      if ($date_obj -gt $creation_date) {
      Write-Output "Date in file name is in the future."
      } else {
      Write-Output "Date in file name is not in the future."
      }

      $object = New-Object -TypeName psobject
      $object | Add-Member -MemberType NoteProperty -Name "Site" -Value $folder
      $object | Add-Member -MemberType NoteProperty -Name "File Name" -Value $recentFileName
      $object | Add-Member -MemberType NoteProperty -Name "File Size" -Value $recentFileLength
      $object | Add-Member -MemberType NoteProperty -Name "Date Time" -Value $recentFileWriteTime
      $object | Add-Member -MemberType NoteProperty -Name "File Count" -Value $filesCount
      $object | Export-Csv $csvLog -Encoding ASCII -Append -NoTypeInformation

      }

      }

      Directory
      \\fileshare\level1\level2\level3\parentdirectory
      Date_str
      20230310
      Date Obj

      Friday, March 10, 2023 12:00:00 AM
      Creation Time
      Wednesday, January 5, 2022 2:13:48 PM
      Creation Date
      Wednesday, January 5, 2022 12:00:00 AM
      Date in file name is in the future.

      • Varun_Ghildiyal's avatar
        Varun_Ghildiyal
        Brass Contributor

        Based on your code, it seems that you're retrieving the creation date of the parent folder instead of the creation date of the file. To get the creation date of the file, you need to use the CreationTime property of the file object, which you already have stored in the $recentFile variable. Here's the modified code that retrieves the creation date of the file and compares it with the date in the file name:

         

        $dirs = Get-ChildItem "\\fileshare\level1\level2\level3\parentdirectory" -Directory
        $csvLog = "\\fileshare\toplevel\myprofile\myfolders\Documents\PowerShellOutput\Ion Future Events.csv"
        
        foreach ($dir in $dirs) {
            $recentFile = $null
            $folder = $dir.Name
            $directory = $dir.FullName
            echo "Directory" $directory
        
            $filesCount = (Get-ChildItem $directory -Filter "event*.pqd" -Recurse).Count
            $recentFile = Get-ChildItem $directory -Filter "event*.pqd" -Recurse | Sort-Object LastWriteTime -Descending| Select-Object -First 1
            $recentFileName = $recentFile.Name
            $recentFileLength = $recentFile.Length
            $recentFileWriteTime = $recentFile.LastWriteTime
        
            if ($recentFile) {
                $date_str = $recentFileName.Substring(6, 8)
                echo "Date_str" $date_str
                $date_obj = [datetime]::ParseExact($date_str, "yyyyMMdd", $null)
                echo "Date Obj" $date_obj
                $creation_date = $recentFile.CreationTime.Date
                echo "Creation Date" $creation_date
        
                if ($date_obj -gt $creation_date) {
                    Write-Output "Date in file name is in the future."
                } else {
                    Write-Output "Date in file name is not in the future."
                }
        
                $object = New-Object -TypeName psobject
                $object | Add-Member -MemberType NoteProperty -Name "Site" -Value $folder
                $object | Add-Member -MemberType NoteProperty -Name "File Name" -Value $recentFileName
                $object | Add-Member -MemberType NoteProperty -Name "File Size" -Value $recentFileLength
                $object | Add-Member -MemberType NoteProperty -Name "Date Time" -Value $recentFileWriteTime
                $object | Add-Member -MemberType NoteProperty -Name "File Count" -Value $filesCount
                $object | Export-Csv $csvLog -Encoding ASCII -Append -NoTypeInformation
            }
        }

        With this modification, the code should now compare the date in the file name with the creation date of the file

Resources