У меня есть папка (Пользователи), полная пользовательских папок, которые мы используем для временной передачи между пользователями. Я хочу иметь возможность запланировать сценарий для очистки содержимого папок пользователей без удаления папок пользователя или изменения разрешений.
Есть ли способ сделать это с помощью командного файла? Сначала я думал, что могу использовать что-то вроде:
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
. Он удаляет все.
Есть смысл?