The PowerShell scripts below can be used to get, set or remove file attributes.
In PowerShell the constant values for all the various file attributes are available via [io.fileattributes]
for example[int][io.fileattributes]::ReadOnly will return 1.
The scripts below use these constants and perform some binary arithmetic to add or remove each attribute from a file system object.
They retrieve the files using Get-ChildItem -force which ensures they will work even if the file is hidden.
[set-attrib.ps1]
param ( [string]$FilePath = $(throw "-FilePath is required."), [switch]$Archive = $false, [switch]$ReadOnly = $false, [switch]$Hidden = $false, [switch]$System = $false ) $ARCHIVE_ATTRIB = [io.fileattributes]::archive #32 $READONLY_ATTRIB = [io.fileattributes]::ReadOnly #1 $HIDDEN_ATTRIB = [io.fileattributes]::Hidden #2 $SYSTEM_ATTRIB = [io.fileattributes]::System #4 $files = Get-ChildItem -Path $FilePath -Recurse -force Foreach($file in $files) { If ($Archive){ Set-ItemProperty -Path $file.fullname -Name attributes ` -Value ((Get-ItemProperty $file.fullname).attributes -BOR $ARCHIVE_ATTRIB) } If ($ReadOnly){ Set-ItemProperty -Path $file.fullname -Name attributes ` -Value ((Get-ItemProperty $file.fullname).attributes -BOR $READONLY_ATTRIB) } If ($Hidden){ Set-ItemProperty -Path $file.fullname -Name attributes ` -Value ((Get-ItemProperty $file.fullname).attributes -BOR $HIDDEN_ATTRIB) } If ($System){ Set-ItemProperty -Path $file.fullname -Name attributes ` -Value ((Get-ItemProperty $file.fullname).attributes -BOR $SYSTEM_ATTRIB) } } #end Foreach
[remove-attrib.ps1]
param ( [string]$FilePath = $(throw "-FilePath is required."), [switch]$Archive = $false, [switch]$ReadOnly = $false, [switch]$Hidden = $false, [switch]$System = $false ) $ARCHIVE_ATTRIB = [io.fileattributes]::archive #32 $READONLY_ATTRIB = [io.fileattributes]::ReadOnly #1 $HIDDEN_ATTRIB = [io.fileattributes]::Hidden #2 $SYSTEM_ATTRIB = [io.fileattributes]::System #4 $files = Get-ChildItem -Path $FilePath -Recurse -force Foreach($file in $files) { If ($Archive -and ((Get-ItemProperty -Path $file.fullname).attributes -band $ARCHIVE_ATTRIB)) { Set-ItemProperty -Path $file.fullname -Name attributes ` -Value ((Get-ItemProperty $file.fullname).attributes -BXOR $ARCHIVE_ATTRIB) } If ($ReadOnly -and ((Get-ItemProperty -Path $file.fullname).attributes -band $READONLY_ATTRIB)) { Set-ItemProperty -Path $file.fullname -Name attributes ` -Value ((Get-ItemProperty $file.fullname).attributes -BXOR $READONLY_ATTRIB) } If ($Hidden -and ((Get-ItemProperty -Path $file.fullname).attributes -band $HIDDEN_ATTRIB)) { Set-ItemProperty -Path $file.fullname -Name attributes ` -Value ((Get-ItemProperty $file.fullname).attributes -BXOR $HIDDEN_ATTRIB) } If ($System -and ((Get-ItemProperty -Path $file.fullname).attributes -band $SYSTEM_ATTRIB)) { Set-ItemProperty -Path $file.fullname -Name attributes ` -Value ((Get-ItemProperty $file.fullname).attributes -BXOR $SYSTEM_ATTRIB) } } #end Foreach
[get-attrib.ps1]
param ( [string]$FilePath = $(throw "-FilePath is required.") ) # Pass either a single filename or a wildcard # get-attrib C:\demo\*.txt $ARCHIVE_ATTRIB = [io.fileattributes]::archive #32 $READONLY_ATTRIB = [io.fileattributes]::ReadOnly #1 $HIDDEN_ATTRIB = [io.fileattributes]::Hidden #2 $SYSTEM_ATTRIB = [io.fileattributes]::System #4 $files = Get-Item -Path $FilePath -force if ($files.count -gt 1) { $files = Get-ChildItem -Path $FilePath -Recurse -force } Foreach($file in $files) { $attribs = "" If (((Get-ItemProperty -Path $file.fullname).attributes -band $ARCHIVE_ATTRIB) -eq $ARCHIVE_ATTRIB){ $attribs = "| Archive" } If (((Get-ItemProperty -Path $file.fullname).attributes -band $READONLY_ATTRIB) -eq 1){ $attribs = "$attribs | Read-only" } If (((Get-ItemProperty -Path $file.fullname).attributes -band $HIDDEN_ATTRIB) -eq 2){ $attribs = "$attribs | Hidden" } If (((Get-ItemProperty -Path $file.fullname).attributes -band $SYSTEM_ATTRIB) -eq 4){ $attribs = "$attribs | System" } if ($attribs -eq ""){$attribs = "| Normal"} "$file $attribs" } #end Foreach
Add the ReadOnly and Hidden attributes on the file 'C:\logs\monday.csv'
PS C:\demo> ./set-attrib.ps1 "C:\logs\monday.csv" -readonly -hidden
Add the Archive attributes on all the .TXT files in the C:\logs\ folder:
PS C:\demo> ./set-attrib.ps1 "C:\logs\*.txt" -archive
Remove the Archive, ReadOnly and Hidden attributes on all files in the C:\logs\ folder:
PS C:\demo> ./remove-attrib.ps1 "C:\logs\*.*" -archive -readonly -hidden
“We often dismiss controversies or concerns by waving our hands and saying something like, “Oh, that’s merely symbolic,” as if the meaning we give to symbols is somehow irrelevant compared with more tangible things. But symbolism — the way we reduce broad concerns, agendas, and visions to images or rituals — has played a defining role in human life since there have been humans. Try burning a flag or a cross in front of the wrong audience and then tell me symbolism is nothing” ~ Jonah Goldberg
ATTRIB - Display or change file attributes.