Скрипт для удаления папок и подпапок из определенной папки, полной подпапок

Скрипт для удаления папок и подпапок из определенной папки, полной подпапок

У меня есть папка (Users), полная папок пользователей, которые мы используем для временного переноса между пользователями. Я хочу иметь возможность запланировать скрипт для очистки содержимого папок пользователей без удаления папок пользователей или изменения разрешений.

Есть ли способ сделать это через пакетный файл? Я изначально думал, что можно использовать что-то вроде:

del /F \Пользователи**.*

Но это не сработало.

Пожалуйста помоги!

И благодарю вас!!

решение1

Вы используете Server 2012... у вас нет практически никаких причин использовать пакетную обработку.

Вот вам немного Powershell:

Foreach($_ In Get-ChildItem C:\Users -Recurse) 
{ 
    If(!$_.PSIsContainer) { Remove-Item $_.Fullname } 
}

Это приведет к удалению всех файлов в дереве каталогов C:\Users и под ним, но все каталоги останутся нетронутыми.

Редактировать:

Как насчет этого:

Foreach($_ In Get-ChildItem C:\Users)
{
    If($_.PSIsContainer)
    {
        Get-ChildItem $_.FullName -Recurse | Remove-Item
    }   
}

Итак, теперь мы получаем список каталогов «первого уровня» в C:\Users, а затем рекурсивно очищаем содержимое каждой из этих папок, так что в итоге останется только C:\Users и первый уровень подкаталогов в нем.

Редактировать:Поскольку вы упомянули, что хотели бы лучше разобраться в этом, но являетесь новичком в Powershell, я объясню приведенный выше скрипт немного подробнее.

Get-ChildItem C:\Usersв принципе как и C:\> dir C:\Usersв DOS, но Powershell обрабатывает и возвращает все в видеобъекты, а не просто вывод консоли. Так что по первой строке чтения

Foreach($_ In Get-ChildItem C:\Users)

Это значит, что мы собираемся пройти цикл для каждого "объекта", который существует в C:\Users. Поскольку мынетПри использовании -Recurseэтого параметра Powershell вернет только список каталогов первого уровня C:\Users и не будет углубляться в подкаталоги.

If($_.PSIsContainer)— это оператор If, который означает «если свойство «PSIsContainer» текущего объекта установлено в значение True», что является просто замысловатым способом сказать «если это каталог», то перейти к этому циклу if.

Итак, для каждого подкаталога в C:\Users, мы введем цикл If. Допустим, C:\Usersв нем есть три подкаталога: C:\Users\joe, C:\Users\kate, и C:\Users\bill. Эти подкаталоги могут иметь любое количество файлов и подкаталогов в них.

Итак, мы войдем в цикл If 3 раза, и каждый раз это будет выглядеть примерно так:

Get-ChildItem <C:\Users\joe> -Recurse | Remove-Item

Get-ChildItem <C:\Users\kate> -Recurse | Remove-Item

Get-ChildItem <C:\Users\bill> -Recurse | Remove-Item

Эта строка получает содержимое этого подкаталога, а переключатель -Recurseуказан таким образом, чтобы он детализировал все подкаталоги joe, kateи bill.

Затем он берет все эти дочерние объекты итрубыих в Remove-Item, и вы можете думать о нем Remove-Itemкак о причудливом псевдониме для del. Он удаляет все вещи.

Имеете ли вы смысл?

Связанный контент