Como remover o atributo ReadOnly no arquivo usando o PowerShell?

99

Como posso remover o atributo ReadOnly em um arquivo, usando um script do PowerShell (versão 1.0)?

MagicAndi
fonte

Respostas:

146

Você pode usar Set-ItemProperty:

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

ou mais curto:

sp file.txt IsReadOnly $false
Joey
fonte
3
Set-Property é a única maneira integrada de fazer isso de forma limpa no pipeline e usando curingas: {sp * .txt IsReadOnly $ false} OR {ls. -recurse -include * .cs | sp -name IsReadOnly -value $ false}
Jaykul
Usando o PowerShell v2, estou vendo ligações de CmdLet difíceis de usar para sp. PSCX Set-Writable e Set-ReadOnly não têm esses problemas. Vou postar os problemas que estou vendo e fazer um link para ele mais tarde. Eu recomendo a resposta de Keith para PowerShell v2 (PowerShell moderno).
yzorg
3
@yzorg: O que exatamente você está me dizendo aqui? Quanto à resposta de Keith, ele está usando PSCX. Nem todo mundo tem isso instalado e isso não é realmente um caso de 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    
}  

O snippet de código acima foi retirado deste artigo

ATUALIZAÇÃO Usando a implementação de Keith Hill a partir dos comentários (eu testei isso e funciona), isso se torna:

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

if ($file.IsReadOnly -eq $true)  
{  
  $file.IsReadOnly = $false   
}  
MagicAndi
fonte
6
A implementação é mais simples do que isso: $ file.IsReadOnly = $ false
Keith Hill
15

Mesmo que não seja Native PowerShell, ainda é possível usar o comando Attrib simples para isso:

attrib -R file.txt
Scott Saad
fonte
Obrigado! Isso funcionou para mim: dir. -r * .cs | % {$ _. fullname} | % {attribute -r $ _}
Cameron Taggart
1
Pode ter pulado uma etapa: dir. -r * .cs | % {attribute -r $ _. FullName}
Nathan Hartley
9

ou você pode simplesmente usar:

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

Acima funcionará para todos os arquivos .cs na subárvore da pasta atual. Se precisar de outros tipos incluídos, basta ajustar "* .cs" às suas necessidades.

Mariusz Gorzoch
fonte
3
Ajuste o comando (add -File) para trabalhar apenas com arquivos. Os diretórios não têm a propriedade.
Bobby Cannon
7

Se você estiver usando as extensões da comunidade do PowerShell :

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

Você pode fazer o oposto assim:

PS> dir . -r *.cs | Set-ReadOnly
# Using alias sro
PS> dir . -r *.cs | sro
Keith Hill
fonte
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)

obrigado por todos que estão ajudando a resolver algum problema ... e ajudando este código

este código está funcionando para mim .. para compartilhar uma pasta para todos com permissão de leitura e gravação, você pode usar isso em .net

redz
fonte