Script para eliminar carpetas y subcarpetas de una carpeta específica llena de subcarpetas

Script para eliminar carpetas y subcarpetas de una carpeta específica llena de subcarpetas

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:\Userses básicamente como C:\> dir C:\Usersen 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 -Recursepará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:\Userstiene tres subdirectorios debajo: C:\Users\joe, C:\Users\katey 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 -Recursemodificador se especifica para que profundice en todos los subdirectorios de joe, katey bill.

Luego, toma todos esos objetos secundarios ytuberíaellos a Remove-Item, y puedes considerarlo Remove-Itemcomo un alias elegante para del. Elimina todas las cosas.

¿Tener sentido?

información relacionada