Forum Discussion
Parsing a file name and comparing a string to file creation date
$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_ElmendorfMar 10, 2023Brass ContributorThank 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_GhildiyalMar 13, 2023Iron 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
- Fred_ElmendorfMar 13, 2023Brass Contributor
Yes. Now the comparison is correct.
The only remaining issue is that I need to do the date comparison for every event*.pqd file, not just the most recent one in each folder. I'm not sure how to move the comparison to the right location in the code to get that result.