Summary: Learn how to use Windows PowerShell to modify file creation and modification, and to access time stamps.
Hey, Scripting Guy! There are times that I would love to be able to manipulate file time stamps. I am talking about when they are created, changed, and accessed. I used to have a utility that did this for me on another operating system, but I have not been able to find something that will work with Windows PowerShell. Do you know of anything?
—TK
Hello TK,
Microsoft Scripting Guy, Ed Wilson, is here. When I was writing all of the scripts for the Windows 7 Resource Kit, just before I uploaded everything to Mitch Tulloch, I would change the time stamps on all of the scripts. In this way, they all had the same time stamp, and it made for a simple type of version control. It was a simple command, and therefore, I did not write a script or function to do this.
Changing file attributes
The key to changing file attributes is two-fold. First, you must have permissions, and second, you need to realize that the attributes themselves are Read/Write. This second part is easy. Use the Get-Member cmdlet as shown here.
PS C:\> Get-Item C:\Changed\a.ps1 | gm -Name *time
TypeName: System.IO.FileInfo
Name MemberType Definition
---- ---------- ----------
CreationTime Property System.DateTime CreationTime {get;set;}
LastAccessTime Property System.DateTime LastAccessTime {get;set;}
LastWriteTime Property System.DateTime LastWriteTime {get;set;}
As shown here, three properties end with the word Time. In addition, all three properties appear as get;set, meaning that the values are both retrievable and settable. To assign a new value to an attribute, you only need to a straightforward value assignment. In the code that is shown here, I use the Get-Item cmdlet to retrieve basic information about a text file named a.txt.
PS C:\> Get-Item C:\fso\a.txt
Directory: C:\fso
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 6/12/2007 1:55 PM 3502 a.txt
One way to change the LastWriteTime property is to store the FileInfo object in a variable, and then use the equals operator to assign a new value to the property. In the code that follows, the Get-Item cmdlet retireves the FileInfo object for the a.txt text file. Then I assign a new value to the LastWriteTime property. The new value is the current date and time retrieved via the Get-Date cmdlet. Finally, the basic properties of the file display.
PS C:\> $a = Get-Item C:\fso\a.txt
PS C:\> $a.LastWriteTime = (get-date)
PS C:\> Get-Item c:\fso\a.txt
Directory: C:\fso
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 5/31/2012 10:14 AM 3502 a.txt
Creating a function
To simplify the process of setting file time stamps, I created the following function. It accepts an array of file paths, and uses the current date and time for the new values. The Path parameter is a mandatory parameter. This portion of the function is shown here:
Param (
[Parameter(mandatory=$true)]
[string[]]$path,
[datetime]$date = (Get-Date))
The main portion of the function uses the Get-ChildItem cmdlet to retrieve all files and folders in the current path. It does not use the Recurse switched parameter, but if you want to add it, you could. For my purposes, I do not want it to Recurse, so I left the switch off. Next, the objects pass to the Foreach-Object cmdlet, and the three time stamp properties change to the new value. Because the new date uses the [datetime] constraint, any value that Windows PowerShell interprets as a date/time value is acceptable. For example, the following command works on my system because Windows PowerShell is able to create a date from 7/1/11.
Set-FileTimeStamps -path C:\Ref -date 7/1/11
The complete Set-FileTimeStamps function is shown here:
Set-FileTimeStamps function
Function Set-FileTimeStamps
{
Param (
[Parameter(mandatory=$true)]
[string[]]$path,
[datetime]$date = (Get-Date))
Get-ChildItem -Path $path |
ForEach-Object {
$_.CreationTime = $date
$_.LastAccessTime = $date
$_.LastWriteTime = $date }
} #end function Set-FileTimeStamps
TK, that is all there is to using Windows PowerShell to modify time stamps on files. Join me tomorrow when we have a guest blog from Mike Robbins that talks about using Windows PowerShell with backups. It is a cool blog.
I invite you to follow me on Twitter and Facebook. If you have any questions, send email to me at scripter@microsoft.com, or post your questions on the Official Scripting Guys Forum. See you tomorrow. Until then, peace.
Ed Wilson, Microsoft Scripting Guy