我有一个文件夹(用户),里面装满了用户文件夹,我们用它来在用户之间进行临时传输。我希望能够安排一个脚本来清空用户文件夹的内容,而无需删除用户文件夹或更改权限。
有没有办法通过批处理文件执行此操作?我原本以为我可以使用类似以下方法:
删除/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
。它会删除所有内容。
合理?