¿Cómo eliminar el atributo de solo lectura en un archivo usando PowerShell?

Respuestas:

146

Puede utilizar Set-ItemProperty:

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

o más corto:

sp file.txt IsReadOnly $false
Joey
fuente
3
Set-Property es la única forma incorporada en la que puede hacerlo limpiamente en la canalización y utilizando comodines: {sp * .txt IsReadOnly $ false} OR {ls. -recurse -include * .cs | sp -name IsReadOnly -value $ false}
Jaykul
Al usar PowerShell v2, veo bindngs CmdLet difíciles de usar para sp. PSCX Set-Writable y Set-ReadOnly no tienen esos problemas. Escribiré en un blog los problemas que veo y los vincularé más tarde. Recomiendo la respuesta de Keith para PowerShell v2 (PowerShell moderno).
yzorg
3
@yzorg: Entonces, ¿qué me estás diciendo exactamente aquí? En cuanto a la respuesta de Keith, está usando PSCX. No todos los tienen instalados y ese no es realmente un caso de PowerShell v1 frente a 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    
}  

El fragmento de código anterior se tomó de este artículo.

ACTUALIZAR Usando la implementación de Keith Hill de los comentarios (he probado esto y funciona), esto se convierte en:

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

if ($file.IsReadOnly -eq $true)  
{  
  $file.IsReadOnly = $false   
}  
MagicAndi
fuente
6
La implementación es más simple que eso: $ file.IsReadOnly = $ false
Keith Hill
15

Aunque no es Native PowerShell, todavía se puede usar el comando Attrib simple para esto:

attrib -R file.txt
Scott Saad
fuente
¡Gracias! Esto funcionó para mí: dir. -r * .cs | % {$ _. fullname} | % {attrib -r $ _}
Cameron Taggart
1
Podría haberse saltado un paso: dir. -r * .cs | % {attrib -r $ _. FullName}
Nathan Hartley
9

o simplemente puede usar:

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

Arriba funcionará para todos los archivos .cs en el subárbol de la carpeta actual. Si necesita otros tipos incluidos, simplemente ajuste "* .cs" a sus necesidades.

Mariusz Gorzoch
fuente
3
Ajuste el comando (agregar -Archivo) para que solo funcione con archivos. Los directorios no tienen la propiedad.
Bobby Cannon
7

Si está utilizando las extensiones de la comunidad de PowerShell :

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

Puedes hacer lo contrario así:

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

gracias por todos los que están ayudando a resolver algún problema ... y ayudando a este código

este código me funciona ... para compartir una carpeta con cada uno con permiso de lectura y escritura, puede usar esto en .net

redz
fuente