Tengo una carpeta (Usuarios) llena de carpetas de usuarios que usamos para transferencias temporales entre usuarios. Quiero poder programar una secuencia de comandos para vaciar el contenido de las carpetas de los usuarios sin eliminar las carpetas de los usuarios ni cambiar los permisos.
¿Hay alguna manera de hacer esto mediante un archivo por lotes? Originalmente pensé que podría usar algo como:
del /F \Usuarios**.*
Pero eso no funcionó.
¡Por favor ayuda!
¡¡Y gracias!!
Respuesta1
Estás en Server 2012... tienes aproximadamente 0 motivos para usar lotes.
Aquí, ten algo de Powershell:
Foreach($_ In Get-ChildItem C:\Users -Recurse)
{
If(!$_.PSIsContainer) { Remove-Item $_.Fullname }
}
Eso eliminará todos los archivos dentro y debajo del árbol de directorios C:\Users, pero dejará todos los directorios intactos.
Editar:
Qué tal esto:
Foreach($_ In Get-ChildItem C:\Users)
{
If($_.PSIsContainer)
{
Get-ChildItem $_.FullName -Recurse | Remove-Item
}
}
Entonces, ahora lo que estamos haciendo es obtener una lista de directorios de "primer nivel" en C:\Users, y luego borrar recursivamente el contenido de cada una de esas carpetas, de modo que al final lo único que quedará será C. :\Users y el primer nivel de subdirectorios bajo él.
Editar:Como mencionaste que te gustaría entender esto mejor, pero eres nuevo en Powershell, explicaré el script anterior con un poco más de detalle.
Get-ChildItem C:\Users
es básicamente como C:\> dir C:\Users
en DOS, pero Powershell se ocupa y devuelve todo en forma deobjetos, no solo una simple salida de consola. Así que en la primera línea se lee
Foreach($_ In Get-ChildItem C:\Users)
Significa que vamos a pasar por un bucle para cada "objeto" que existe en C:\Users. ya que estamosnoAl usar el -Recurse
parámetro aquí, Powershell solo devolverá la lista del directorio de primer nivel de C:\Users y no profundizará en los subdirectorios.
If($_.PSIsContainer)
es una declaración If que significa "si la propiedad "PSIsContainer" de este objeto actual está establecida en True, que es simplemente una forma elegante de decir "si esto es un directorio", entonces ingrese a este bucle if.
Entonces, para cada subdirectorio debajo de C:\Users
, ingresaremos el bucle If. Entonces digamos que C:\Users
tiene tres subdirectorios debajo: C:\Users\joe
, C:\Users\kate
y C:\Users\bill
. Esos subdirectorios pueden tener cualquier cantidad de archivos y subdirectorios debajo de ellos.
Entonces ingresaremos al bucle If 3 veces, por lo que cada vez se verá así:
Get-ChildItem <C:\Users\joe> -Recurse | Remove-Item
Get-ChildItem <C:\Users\kate> -Recurse | Remove-Item
Get-ChildItem <C:\Users\bill> -Recurse | Remove-Item
Lo que hace esta línea es obtener el contenido de ese subdirectorio y el -Recurse
modificador se especifica para que profundice en todos los subdirectorios de joe
, kate
y bill
.
Luego, toma todos esos objetos secundarios ytuberíaellos a Remove-Item
, y puedes considerarlo Remove-Item
como un alias elegante para del
. Elimina todas las cosas.
¿Tener sentido?