Prof. Powershell
File Attributes in PowerShell
Fun with file and folder attributes, via PowerShell and the DIR command.
- By Jeffery Hicks
- 03/20/2012
In PowerShell, when you run the DIR command, you are really running the Get-ChildItem cmdlet. This cmdlet returns file and folder objects; specifically System.IO.FileSystem and System.IO.DirectoryInfo respectively. When you run a command the output includes a mode column:
PS C:\work> dir *.txt
Directory: C:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2/10/2012 8:21 AM 322158 a.txt
-a--- 10/5/2011 8:37 PM 322174 a2.txt
-a--- 2/15/2011 7:36 AM 5444 add-perm.txt
Mode is actually showing the collection of file or folder attributes. But you can also get these attributes directly:
PS C:\work> dir a*.txt | select Name,Attributes
Name Attributes
---- ----------
a.txt Archive
a2.txt Archive
...
The attributes are actually a special type of object. I'm going to get a hidden folder, which is why I'm using -Force:
PS C:\work> $file=get-item hideme.txt -Force
PS C:\work> $file.attributes.GetType().Name
FileAttributes
PS C:\work> $file.attributes
ReadOnly, Hidden, Archive
If you want to filter on one of these properties, use the -Match operator:
PS C:\work> dir -force | where {$_.attributes -match "ReadOnly"}
Directory: C:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
d-r-- 10/13/2011 7:04 PM MyBriefCase
-arh- 2/24/2012 1:04 PM 40 hideme.txt
-ar-- 8/25/2011 3:52 PM 32 hl.txt
--r-- 8/4/2011 10:35 PM 191 ipdata.csv
You can also easily change a file or folder attribute. I'm going to create a new folder and then make it hidden:
PS C:\work> $h=mkdir SecretSauce
PS C:\work> $h.attributes
Directory
PS C:\work> $h.attributes="Hidden"
PS C:\work> $h.attributes
Hidden, Directory
In this particular case all I needed was to add the new attribute. But now it is hidden:
PS C:\work> get-item .\SecretSauce -force
Directory: C:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
d--h- 2/24/2012 1:14 PM SecretSauce
I can also easily modify attributes on files. Here's a hidden file:
PS C:\work> $f=get-item .\hideme.txt -Force
PS C:\work> $f
Directory: C:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-arh- 2/24/2012 1:04 PM 40 hideme.txt
Now I'll unhide it:
PS C:\work> $f.Attributes="Archive","ReadOnly"
PS C:\work> $f
Directory: C:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar-- 2/24/2012 1:04 PM 40 hideme.txt
If you want to modify a group of files, you'll need to use a ForEach construct, but it is pretty simple.
PS C:\work> dir p*.zip
Directory: C:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 5/12/2011 4:18 PM 823853 prs3.zip
-a--- 5/12/2011 6:43 PM 1211529 prs4.zip
-a--- 5/12/2011 4:06 PM 418140 psr-demo.zip
-a--- 5/12/2011 4:09 PM 945556 psr2.zip
-a--- 5/12/2011 6:02 PM 67793 psr5.zip
-a--- 5/12/2011 6:07 PM 136189 psr6.zip
PS C:\work> dir p*.zip | foreach {$_.Attributes="Archive","ReadOnly"}
PS C:\work> dir p*.zip
Directory: C:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar-- 5/12/2011 4:18 PM 823853 prs3.zip
-ar-- 5/12/2011 6:43 PM 1211529 prs4.zip
-ar-- 5/12/2011 4:06 PM 418140 psr-demo.zip
-ar-- 5/12/2011 4:09 PM 945556 psr2.zip
-ar-- 5/12/2011 6:02 PM 67793 psr5.zip
Just remember to set attributes to a comma-separated list. If you aren't sure what the right values are, you can ask PowerShell:
PS C:\work> [enum]::GetNames("system.io.fileattributes")
ReadOnly
Hidden
System
Directory
Archive
Device
Normal
Temporary
SparseFile
ReparsePoint
Compressed
Offline
NotContentIndexed
Encrypted
However some of these, like Compressed, are only set after something has been done to the file.
So if you find yourself fighting a backup problem, turn to PowerShell and make sure you're aA's are in order.
About the Author
Jeffery Hicks is an IT veteran with over 25 years of experience, much of it spent as an IT infrastructure consultant specializing in Microsoft server technologies with an emphasis in automation and efficiency. He is a multi-year recipient of the Microsoft MVP Award in Windows PowerShell. He works today as an independent author, trainer and consultant. Jeff has written for numerous online sites and print publications, is a contributing editor at Petri.com, and a frequent speaker at technology conferences and user groups.