Wie entferne ich das ReadOnly-Attribut in einer Datei mit PowerShell?

99

Wie kann ich das ReadOnly-Attribut in einer Datei mithilfe eines PowerShell-Skripts (Version 1.0) entfernen?

MagicAndi
quelle

Antworten:

146

Sie können verwenden Set-ItemProperty:

Set-ItemProperty file.txt -name IsReadOnly -value $false

oder kürzer:

sp file.txt IsReadOnly $false
Joey
quelle
3
Set-Property ist die einzige integrierte Methode, mit der Sie dies sauber in der Pipeline und unter Verwendung von Platzhaltern tun können: {sp * .txt IsReadOnly $ false} OR {ls. -recurse -include * .cs | sp-name IsReadOnly -value $ false}
Jaykul
Bei Verwendung von PowerShell v2 werden schwer zu verwendende CmdLet-Bindungen für sp. PSCX Set-Writable und Set-ReadOnly haben diese Probleme nicht. Ich werde die Probleme, die ich sehe, bloggen und später darauf verlinken. Ich empfehle die Antwort von Keith für PowerShell v2 (moderne PowerShell).
Yzorg
3
@yzorg: Also, was genau erzählst du mir hier? Keith antwortet mit PSCX. Nicht jeder hat diese installiert und das ist nicht wirklich ein Fall von PowerShell v1 vs. v2.
Joey
16
$file = Get-Item "C:\Temp\Test.txt"

if ($file.attributes -band [system.IO.FileAttributes]::ReadOnly)  
{  
  $file.attributes = $file.attributes -bxor [system.IO.FileAttributes]::ReadOnly    
}  

Das obige Code-Snippet stammt aus diesem Artikel

UPDATE Unter Verwendung der Implementierung von Keith Hill aus den Kommentaren (ich habe dies getestet und es funktioniert) wird Folgendes:

$file = Get-Item "C:\Temp\Test.txt"

if ($file.IsReadOnly -eq $true)  
{  
  $file.IsReadOnly = $false   
}  
MagicAndi
quelle
6
Die Implementierung ist einfacher als das: $ file.IsReadOnly = $ false
Keith Hill
15

Auch wenn es sich nicht um native PowerShell handelt, können Sie dennoch den einfachen Attribut- Befehl verwenden:

attrib -R file.txt
Scott Saad
quelle
Vielen Dank! Das hat bei mir funktioniert: dir. -r * .cs | % {$ _. fullname} | % {attrib -r $ _}
Cameron Taggart
1
Hätte einen Schritt überspringen können: dir. -r * .cs | % {attrib -r $ _. FullName}
Nathan Hartley
9

oder Sie können einfach verwenden:

get-childitem *.cs -Recurse -File | % { $_.IsReadOnly=$false }

Oben funktioniert für alle CS-Dateien im Unterbaum des aktuellen Ordners. Wenn Sie andere Typen benötigen, passen Sie einfach "* .cs" an Ihre Bedürfnisse an.

Mariusz Gorzoch
quelle
3
Passen Sie den Befehl (add -File) so an, dass nur mit Dateien gearbeitet wird. Verzeichnisse haben die Eigenschaft nicht.
Bobby Cannon
7

Wenn Sie zufällig die PowerShell-Community-Erweiterungen verwenden :

PS> Set-Writable test.txt
PS> dir . -r *.cs | Set-Writable
# Using alias swr
PS> dir . -r *.cs | swr

Sie können das Gegenteil so tun:

PS> dir . -r *.cs | Set-ReadOnly
# Using alias sro
PS> dir . -r *.cs | sro
Keith Hill
quelle
2
Shell("net share sharefolder=c:\sharefolder/GRANT:Everyone,FULL")
Shell("net share sharefolder= c:\sharefolder/G:Everyone:F /SPEC B")
Shell("Icacls C:\sharefolder/grant Everyone:F /inheritance:e /T")
Shell("attrib -r +s C:\\sharefolder\*.* /s /d", AppWinStyle.Hide)

Vielen Dank für alle, die helfen, ein Problem zu lösen ... und diesem Code helfen

Dieser Code funktioniert für mich. Um einen Ordner für jeden mit Lese- und Schreibberechtigung freizugeben, können Sie diesen in .net verwenden

redz
quelle