Comment supprimer l'attribut ReadOnly sur un fichier à l'aide de PowerShell?

99

Comment puis-je supprimer l'attribut ReadOnly sur un fichier à l'aide d'un script PowerShell (version 1.0)?

MagicAndi
la source

Réponses:

146

Vous pouvez utiliser Set-ItemProperty:

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

ou plus court:

sp file.txt IsReadOnly $false
Joey
la source
3
Set-Property est le seul moyen intégré de le faire proprement sur le pipeline, et en utilisant des caractères génériques: {sp * .txt IsReadOnly $ false} OR {ls. -recurse -include * .cs | sp -name IsReadOnly -value $ false}
Jaykul
En utilisant PowerShell v2, je vois des bindngs CmdLet difficiles à utiliser pour sp. PSCX Set-Writable et Set-ReadOnly n'ont pas ces problèmes. Je vais bloguer les problèmes que je vois et y faire un lien plus tard Je recommande la réponse de Keith pour PowerShell v2 (PowerShell moderne).
yzorg
3
@yzorg: Alors qu'est-ce que tu me dis exactement ici? Quant à la réponse de Keith, il utilise PSCX. Tout le monde ne les a pas installés et ce n'est pas vraiment un cas 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    
}  

L'extrait de code ci-dessus est tiré de cet article

MISE À JOUR En utilisant l' implémentation de Keith Hill à partir des commentaires (j'ai testé ceci, et cela fonctionne), cela devient:

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

if ($file.IsReadOnly -eq $true)  
{  
  $file.IsReadOnly = $false   
}  
MagicAndi
la source
6
L'implémentation est plus simple que cela: $ file.IsReadOnly = $ false
Keith Hill
15

Même s'il ne s'agit pas de PowerShell natif , on peut toujours utiliser la simple commande Attrib pour cela:

attrib -R file.txt
Scott Saad
la source
Merci! Cela a fonctionné pour moi: dir. -r * .cs | % {$ _. nom complet} | % {attrib -r $ _}
Cameron Taggart
1
Aurait pu sauter une étape: dir. -r * .cs | % {attrib -r $ _. FullName}
Nathan Hartley
9

ou vous pouvez simplement utiliser:

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

Ci-dessus fonctionnera pour tous les fichiers .cs dans la sous-arborescence du dossier actuel. Si vous avez besoin d'autres types inclus, ajustez simplement "* .cs" selon vos besoins.

Mariusz Gorzoch
la source
3
Ajustez la commande (ajoutez -File) pour ne travailler qu'avec des fichiers. Les répertoires n'ont pas la propriété.
Bobby Cannon
7

Si vous utilisez les extensions de communauté PowerShell :

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

Vous pouvez faire le contraire comme ceci:

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

merci à tous ceux qui aident à résoudre un problème ... et aident ce code

ce code fonctionne pour moi .. pour partager un dossier avec tout le monde avec l'autorisation de lecture et d'écriture, vous pouvez l'utiliser dans .net

redz
la source