Как удалить атрибут ReadOnly в файле с помощью PowerShell?

Ответы:

146

Вы можете использовать Set-ItemProperty:

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

или короче:

sp file.txt IsReadOnly $false
Джоуи
источник
3
Set-Property - единственный встроенный способ сделать это чисто в конвейере с использованием подстановочных знаков: {sp * .txt IsReadOnly $ false} ИЛИ {ls. -recurse -include * .cs | sp -name IsReadOnly -value $ false}
Джайкул
Используя PowerShell v2, я вижу трудные в использовании привязки CmdLet для sp. PSCX Set-Writable и Set-ReadOnly не имеют этих проблем. Я буду писать в блоге о проблемах, которые вижу, и ссылаться на них позже. Я рекомендую ответ Кита для PowerShell v2 (современный PowerShell).
yzorg
3
@yzorg: Так что именно ты мне здесь рассказываешь? Что касается ответа Кита, он использует PSCX. Не у всех они установлены, и это не совсем тот случай, когда PowerShell v1 и 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    
}  

Приведенный выше фрагмент кода взят из этой статьи.

ОБНОВЛЕНИЕ Используя реализацию Кейта Хилла из комментариев (я тестировал это, и он работает), это становится:

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

if ($file.IsReadOnly -eq $true)  
{  
  $file.IsReadOnly = $false   
}  
MagicAndi
источник
6
Реализация проще: $ file.IsReadOnly = $ false
Кейт Хилл
15

Несмотря на то, что это не Native PowerShell, все еще можно использовать простую Атриб команду для этого:

attrib -R file.txt
Скотт Саад
источник
Спасибо! У меня это сработало: dir. -r * .cs | % {$ _. fullname} | % {attrib -r $ _}
Кэмерон Таггарт,
1
Мог пропустить шаг: реж. -r * .cs | % {attrib -r $ _. FullName}
Натан Хартли
9

или вы можете просто использовать:

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

Это будет работать для всех файлов .cs в поддереве текущей папки. Если вам нужны другие типы, просто настройте "* .cs" под свои нужды.

Мариуш Горзох
источник
3
Настройте команду (добавить -File), чтобы она работала только с файлами. Справочники не имеют собственности.
Бобби Кэннон,
7

Если вы используете расширения сообщества PowerShell :

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

Вы можете сделать обратное вот так:

PS> dir . -r *.cs | Set-ReadOnly
# Using alias sro
PS> dir . -r *.cs | sro
Кейт Хилл
источник
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)

спасибо всем, кто помогает решить какую-то проблему ... и помогает этому коду

этот код работает для меня ... чтобы поделиться папкой с каждым, у кого есть права на чтение и запись, вы можете использовать это в .net

Redz
источник