Сделать все подпапки с именем «abc» и их содержимое доступными для записи - Windows - PullRequest
0 голосов
/ 08 января 2019

Описание:

В Windows, если щелкнуть правой кнопкой мыши папку / файл, есть флажок только для чтения, Мне нужна команда для удаления этого флажка.

Немного сложнее:

Я хочу команду , чтобы получить все подпапки в папке (A) с именем abc и снять с них галочку «только для чтения» и все их содержимое

Я обнаружил кое-что из этого в других вопросах, но без какой-либо удачи успешно их объединить

Пример структуры:

+---A
|   +---B
|   |   +---abc
|   |   |   |   file1.txt <-- apply here ---
|   |   |   |   file2.txt <-- apply here ---
|   |   |   |   file3.txt <-- apply here ---
|   |   |   |   file4.txt <-- apply here ---
|   |   |   |   file4.txt <-- apply here ---
|   |   |   +---d
|   |   |   |   |   file1.txt <-- apply here ---
|   |   |   |   |   file2.txt <-- apply here ---
|   +---e
|   |   +---f
|   |   +---abc
|   |   |   |   file1.txt <-- apply here ---
|   |   |   |   file2.txt <-- apply here ---
|   |   |   |   file3.txt <-- apply here ---
|   |   |   |   file4.txt <-- apply here ---

etc

Ответы [ 4 ]

0 голосов
/ 08 января 2019

Я согласен, что PowerShell - это хороший путь. Это не значит, что старые способы перестают работать.

FOR /F "delims=" %d IN ('DIR /S /B /A:D "C:\test" 2^>NUL') DO (
    IF /I "%~nxd" == "abc" (ATTRIB -R "%~d" & ATTRIB -R "%~d\*")
)
0 голосов
/ 08 января 2019

Вы можете использовать это, чтобы найти все файлы в каталоге:

function GetFiles($path = $pwd, [string[]]$exclude) 
{ 
    foreach ($item in Get-ChildItem $path)
    {
        if ($exclude | Where {$item -like $_}) { continue }

        if (Test-Path $item.FullName -PathType Container) 
        {
            $item 
            GetFiles $item.FullName $exclude
        } 
        else 
        { 
            $item 
        }
    } 
}

И отключить значение isReadOnly для файла, когда он находится в родительском каталоге с именем, равным (-eq) 'abc'

Так вы можете написать возможную функцию, подобную этой:

function GetFiles($path = $pwd, [string[]]$exclude) 
{ 
    foreach ($item in Get-ChildItem $path)
    {
        if ($exclude | Where {$item -like $_}) { continue }

        if (Test-Path $item.FullName -PathType Container) 
        {
            # directory
            $item 
            GetFiles $item.FullName $exclude
        } 
        else 
        { 
            # file 
            if($item.Parent.Name -eq "abc"){
                # parent directory was named abc 
                # change isReadOnly value to false
                # $item.isreadonly = $false;
                Set-ItemProperty $item.FullName -name IsReadOnly -value $false
            }
            $item
        }
    } 
}
0 голосов
/ 08 января 2019

Вы можете использовать пакетный файл Windows (см. Все пояснительные замечания rem):

@echo off
rem /* Find sub-directories named `abc` and loop through them;
rem    the root directory, hence the current one, is expected not to match: */
for /F "delims= eol=|" %%D in ('dir /B /S /A:D "abc"') do (
    rem // Return all files in the currently iterated sub-directory:
    for /F "delims= eol=|" %%F in ('dir /B /S /A:-D "%%D\*.*"') do (
        rem // Do the attribute change at this point:
        attrib -R "%%F"
    )
)

Чтобы использовать этот код в командной строке Windows напрямую, вы должны изменить его (без замечаний):

for /F "delims= eol=|" %D in ('dir /B /S /A:D "abc"') do @for /F "delims= eol=|" %F in ('dir /B /S /A:-D "%D\*.*"') do @attrib -R "%%F"
0 голосов
/ 08 января 2019

Это сделало бы это.

$folder = 'c:\test'
$MatchingSubfolders = Get-ChildItem -Path $folder -Directory 'abc' -Recurse
    Foreach ($item in $MatchingSubfolders) {
        Get-ChildItem -Path $item.FullName -File -Recurse | % {Set-ItemProperty $_.FullName -name IsReadOnly -value $false}
    }

Set-ItemProperty

Описание

Командлет Set-ItemProperty изменяет значение свойства указанный пункт. Вы можете использовать командлет для установки или изменения свойства предметов. Например, вы можете использовать Set-ItemProperty для установки значение свойства IsReadOnly для файлового объекта $True.

Вы также используете Set-ItemProperty для создания и изменения значений реестра и данные. Например, вы можете добавить новую запись реестра в ключ и установить или изменить его значение.

Set-ItemProperty -Path C:\GroupFiles\final.doc -Name IsReadOnly -Value $true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...