What are the possible 'Mode' values returned by PowerShell's Get-ChildItem cmdlet?

Powershell

Powershell Problem Overview


When I run PowerShell's Get-ChildItem on a directory (or any cmdlet that returns file system items), it shows a column called Mode, like this:

    Directory: C:\MyDirectory


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----          2/8/2011  10:55 AM            Directory1
d----          2/8/2011  10:54 AM            Directory2
d----          2/8/2011  10:54 AM            Directory3
-ar--          2/8/2011  10:54 AM        454 File1.txt
-ar--          2/8/2011  10:54 AM       4342 File2.txt

I searched and searched Google and my local PowerShell book, but I could not find any documentation on the meaning of the Mode column.

What are the possible values of the Mode column and what does each one mean?

Powershell Solutions


Solution 1 - Powershell

Note that the mode you see is just a string representation of a bitfield enum that hides in the Attributes property. You can figure out what the individual letters mean by simply showing both side by side:

PS> gci|select mode,attributes -u

Mode                Attributes
----                ----------
d-----               Directory
d-r---     ReadOnly, Directory
d----l Directory, ReparsePoint
-a----                 Archive

In any case, the full list is:

d - Directory
a - Archive
r - Read-only
h - Hidden
s - System
l - Reparse point, symlink, etc.

Solution 2 - Powershell

IMHO, the most explanatory is the code itself:

if (instance == null)
{
    return string.Empty;
}
FileSystemInfo baseObject = (FileSystemInfo) instance.BaseObject;
if (baseObject == null)
{
    return string.Empty;
}
string str = "";
if ((baseObject.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
{
    str = str + "d";
}
else
{
    str = str + "-";
}
if ((baseObject.Attributes & FileAttributes.Archive) == FileAttributes.Archive)
{
    str = str + "a";
}
else
{
    str = str + "-";
}
if ((baseObject.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{
    str = str + "r";
}
else
{
    str = str + "-";
}
if ((baseObject.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
{
    str = str + "h";
}
else
{
    str = str + "-";
}
if ((baseObject.Attributes & FileAttributes.System) == FileAttributes.System)
{
    return (str + "s");
}
return (str + "-");

Solution 3 - Powershell

These are all the file attribute names and there meanings can be found here:

PS C:\> [enum]::GetNames("system.io.fileattributes")
ReadOnly
Hidden
System
Directory
Archive
Device
Normal
Temporary
SparseFile
ReparsePoint
Compressed
Offline
NotContentIndexed
Encrypted

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAaron JensenView Question on Stackoverflow
Solution 1 - PowershellJoeyView Answer on Stackoverflow
Solution 2 - PowershellstejView Answer on Stackoverflow
Solution 3 - PowershellJthorpeView Answer on Stackoverflow