Jak usunąć atrybut ReadOnly w pliku za pomocą PowerShell?

99

Jak mogę usunąć atrybut ReadOnly z pliku przy użyciu skryptu programu PowerShell (wersja 1.0)?

MagicAndi
źródło

Odpowiedzi:

146

Możesz użyć Set-ItemProperty:

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

lub krócej:

sp file.txt IsReadOnly $false
Joey
źródło
3
Set-Property to jedyny wbudowany sposób, w jaki można to zrobić w czysty sposób w potoku i używając symboli wieloznacznych: {sp * .txt IsReadOnly $ false} OR {ls. -recurse -include * .cs | sp -name IsReadOnly -value $ false}
Jaykul
Korzystając z programu PowerShell v2, widzę trudne w użyciu powiązania CmdLet dla sp. PSCX Set-Writable i Set-ReadOnly nie mają tych problemów. Zaprezentuję problemy, które widzę na blogu, a później podam do nich link. Polecam odpowiedź Keitha na PowerShell v2 (nowoczesny PowerShell).
yzorg
3
@yzorg: Więc co dokładnie mi tu mówisz? Jeśli chodzi o odpowiedź Keitha, używa PSCX. Nie każdy ma te zainstalowane i tak naprawdę nie jest to przypadek 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    
}  

Powyższy fragment kodu pochodzi z tego artykułu

AKTUALIZACJA Używając implementacji Keitha Hilla z komentarzy (przetestowałem to i działa), wygląda to następująco:

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

if ($file.IsReadOnly -eq $true)  
{  
  $file.IsReadOnly = $false   
}  
MagicAndi
źródło
6
Implementacja jest prostsza: $ file.IsReadOnly = $ false
Keith Hill
15

Mimo że nie jest to Native PowerShell, nadal można do tego użyć prostego polecenia Attrib :

attrib -R file.txt
Scott Saad
źródło
Dzięki! U mnie to zadziałało: reż. -r * .cs | % {$ _. fullname} | % {attribute -r $ _}
Cameron Taggart
1
Mógł pominąć krok: reż. -r * .cs | % {attribute -r $ _. FullName}
Nathan Hartley
9

lub możesz po prostu użyć:

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

Powyższe będzie działać dla wszystkich plików .cs w drzewie podrzędnym bieżącego folderu. Jeśli potrzebujesz innych typów, po prostu dostosuj plik „* .cs” do swoich potrzeb.

Mariusz Gorzoch
źródło
3
Dostosuj polecenie (dodaj -File), aby działało tylko z plikami. Katalogi nie mają tej właściwości.
Bobby Cannon
7

Jeśli używasz rozszerzeń społeczności programu PowerShell :

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

Możesz zrobić odwrotnie:

PS> dir . -r *.cs | Set-ReadOnly
# Using alias sro
PS> dir . -r *.cs | sro
Keith Hill
źródło
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)

dziękuję każdemu, kto pomaga rozwiązać jakiś problem ... i pomaga w tym kodzie

ten kod działa dla mnie ... aby udostępnić folder każdemu z uprawnieniami do odczytu i zapisu, możesz użyć tego w .net

redz
źródło