Назад | Перейти на главную страницу

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

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

Есть ли способ сделать это с помощью командного файла? Сначала я думал, что могу использовать что-то вроде:

del / F \ Users **. *

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

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

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

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

Здесь есть 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. Он удаляет все.

Есть смысл?