У меня есть папка (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
. Он удаляет все вещи.
Имеете ли вы смысл?