Batch para eliminar carpetas con un nombre específico

adgm1 Mensajes publicados 306 Estado Miembro -  
adgm1 Mensajes publicados 306 Estado Miembro -

Hola

Estoy buscando eliminar carpetas que tienen un nombre específico. Quisiera buscar en primer lugar todas las carpetas que se llaman "toto", "bibi"... y luego eliminarlas.

Mi idea es usar la función IF EXIST, pero no sé cómo indicar que también hay que buscar en las subcarpetas. Porque la carpeta toto puede encontrarse en diferentes lugares dentro del directorio objetivo.

Por ejemplo, if exist "contact" rmdir "contact", if exist "liens" rmdir "liens", etc...

El objetivo es eliminar ciertas carpetas innecesarias en los perfiles de usuario. Luego lo ejecutaré como una tarea programada cada x días para que en cada nuevo perfil las carpetas innecesarias como contact, partes guardadas, favoritos... desaparezcan.

Gracias

12 respuestas

  1. PierrotLeFou
     

    Tienes una forma de conocer todos los "objetos" en el directorio actual.
    ¿Sabes cómo averiguar si el objeto es una carpeta / directorio?
    Si es una carpeta, verificas si es el o los nombres buscados.
    Si es así, lo eliminas (y sus subcarpetas de forma recursiva).
    Si no es uno de los nombres buscados, vuelves a llamar a tu script de forma recursiva pasando el parámetro correcto o haciendo el  cd  apropiado.

    0
  2. PierrotLeFou
     

    Creo que el comando find podría hacer lo que deseas:
    find . -name toto -or -name bibi ... -type d -exec rm -rf {}\;

    El '.' significa el directorio actual. Se reemplaza por el nombre del directorio deseado.

    Si hay espacios o caracteres especiales en el nombre, se encierran con " ", como "Partes registradas".

    Si solo deseas eliminar directorios vacíos, podrías agregar la opción -empty y reemplazar "rm -rf" por "rmdir".

    El \ antes del ; al final es necesario.

    0
  3. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929
     

    Hola,

    ¿Podrías hacer algo así como:

    dir /b /s /ad "directorio objetivo" > "%TMP%\lista_diretorios.txt" for /f "delims=" %%A in ('findstr /i "toto bibi" "%TMP%\lista_diretorios.txt"') do ( rmdir /s /q "%%~A" )

    0
  4. PierrotLeFou
     

    No me había dado cuenta de que se trata de autoit, el rmdir me engañó.
    De hecho, rmdir no existe en cmd.
    @barnabe0057:
    Este script podría, sin duda, eliminar carpetas como "toto" en el directorio actual, pero probablemente no en uno de sus subdirectorios?

    He encontrado esto:

    https://forum.hardware.fr/hfr/Programmation/Shell-Batch/dos-for-imbriquees-sujet_92855_1.htm

    pero como se menciona, la expansión retardada de variables es complicada.

    Sería menos complicado escribir otro script que verifique si el nombre está en la lista y devuelva un estado acorde.

    Por ejemplo:

    for /f "tokens=*" %%p in ('dir /ad /b') do (
        ; llamada a otro script que devuelve estado si el archivo está en una lista
        ; si estado 0 (
            rd /S /Q %%p
        ) else (
            ; llamada recursiva
        )
    )

    0
    1. brucine Mensajes publicados 25320 Fecha de registro   Estado Miembro Última intervención   4 193
       

      Hola,

      No se sabe si se trata de Autoit o de Batch, aunque por lo general es este último donde el comando RMDIR existe, aunque a menudo se resume en RD.

      El modificador /s en DIR indica que debe buscar en los subdirectorios de "Directorio Objetivo"; nada impide que este último sea la raíz de una partición, excepto que la búsqueda va a durar una eternidad.

      Las "sutilezas" de la expansión retardada y de la anidación FOR a menudo pueden ser eludidas mediante la llamada a una subrutina CALL, menos elegante pero más fácil de escribir.

      0
  5. adgm1 Mensajes publicados 306 Estado Miembro 10
     

    Hola, gracias por tus respuestas.

    Con el script de barnabe0057, logro eliminar todo excepto "groups", que me dice acceso denegado. En las propiedades y seguridad de la carpeta, se indica "debe tener permiso de acceso de solo lectura para ver las propiedades...".

    He intentado agregar a mi script el siguiente comando para otorgar permisos elevados, pero no funciona:

    takeown /f "D:\...\groups" /a /r /d o
    icacls "D:\...\groups" /setowner "Administradores" /T /C

    ¿Alguna idea para permitir la eliminación de la carpeta groups?

    0
    1. brucine Mensajes publicados 25320 Fecha de registro   Estado Miembro Última intervención   4 193
       

      Hola,

      Lo ejecutas como administrador, tu script, y ¿a quién "pertenece" esta carpeta?

      Respecto a la sintaxis, ¿estás seguro de que la sintaxis de takeown es O y no Y? Las comillas no son útiles a menos que haya un carácter especial en la ruta, ¿por qué /a en lugar de atribuirte los derechos a ti mismo?

      Sobre icacls, el usuario no lleva comillas y, de nuevo, ¿por qué querer apropiarte en lugar de concederte derechos a través de /grant? Ten cuidado en todos los casos con la aplicación efectiva de los permisos (en la carpeta misma y en las subcarpetas), consulta ahí las 2 primeras líneas de ejemplos:

      https://ss64.com/nt/icacls.html

      0
  6. adgm1 Mensajes publicados 306 Estado Miembro 10
     

    es un archivo compartido entre varios usuarios. El script lo ejecuto desde el controlador de dominio, así que a priori sí, es administrador. En cualquier caso, no hay problema en este nivel para eliminar todos los otros archivos.

    Para takeown, está bien O para Sí y no y para Yes. No estoy seguro de si el /a tiene un interés, pero debería poder hacer que mi script se ejecute correctamente a intervalos regulares, así que diría que es necesario ser system o administrador del dominio.

    Aquí está lo que tengo cuando intento los comandos para aumentar los derechos:

    takeown /f "D:\...\groups" /a /r /d o
    Error: el usuario actualmente conectado
    no tiene privilegios de administrador.

    icacls "D:\...\groups" /setowner Administradores /T /C
    D:\...\groups: Acceso denegado.
    D:\...\groups\*: Acceso denegado.
    0 archivos procesados correctamente; fallo en el procesamiento de 2 archivos.

    icacls "D:\...\groups" /grant:r Administradores:(OI)(CI)F /T
    D:\...\groups: Acceso denegado.
    0 archivos procesados correctamente; fallo en el procesamiento de 1 archivo.

    0
    1. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929
       

      ¿Ejecutas el script a través de una GPO de máquina o de una GPO de usuario?

      0
      1. adgm1 Mensajes publicados 306 Estado Miembro 10 > barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención  
         

        No he hecho aún la prueba de la GPO, por el momento solo estoy probando los archivos por lotes en ejecución manual. Pero, de hecho, una vez que ejecuto cmd como administrador, el comando icacls funciona bien. ¿Una GPO necesariamente utilizará el privilegio más alto?

        0
      2. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929 > adgm1 Mensajes publicados 306 Estado Miembro
         

        una GPO de máquina sí, no una GPO de usuario

        0
  7. adgm1 Mensajes publicados 306 Estado Miembro 10
     

    Está bien, al final, al iniciarse a través de la tarea programada, los comandos se ejecutan correctamente. Por lo tanto, se debe aplicar un permiso superior en comparación con la ejecución manual.

    Sin embargo, el folder de escritorio sigue regresando sin parar cuando la sesión del usuario está conectada, probablemente porque el lugar del escritorio debe encontrarse en algún lugar. Voy a intentar trasladarlo a un disco compartido.

    0
    1. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929
       

      Al principio hablabas de eliminar carpetas innecesarias, el escritorio no es lo que podemos llamar una carpeta innecesaria.

      Podrías eliminar el contenido del escritorio en lugar de eliminar la carpeta en sí.

      0
  8. PierrotLeFou
     

    En principio, en Windows, siempre hay una carpeta Desktop asociada a cada usuario:
    C:\Users\<identificador_del_usuario>\Desktop
    Esto es cierto para quien emite el comando y para aquellos para quienes estás limpiando.

    0
  9. adgm1 Mensajes publicados 306 Estado Miembro 10
     

    La idea es más bien limpiar el explorador de archivos para dejar solo lo esencial. Y el escritorio no debe ser manipulado por los usuarios en nuestro caso. Es el administrador quien impone tal acceso directo en los escritorios. Por lo tanto, si el escritorio es accesible, se pierde el aspecto no personalizable del mismo.

    0
  10. adgm1 Mensajes publicados 306 Estado Miembro 10
     

    De hecho, para el problema del escritorio, expliqué mi idea en otro post que no ha obtenido respuesta aquí.

    Pero me parece viable usar GPO para trasladar los escritorios de los usuarios a una unidad compartida para que el administrador sea el único que manipule los íconos del escritorio.

    0
  11. PierrotLeFou
     

    No sé si esto es lo que buscas:
    https://www.pcastuces.com/pratique/windows/autorisations_fichier/page2.htm

    o en modo comando:

    https://www.malekal.com/comment-utiliser-icacls-pour-voir-et-modifier-les-autorisations-de-fichiers-et-dossiers/

    0
  12. adgm1 Mensajes publicados 306 Estado Miembro 10
     

    En un segundo tiempo, sí, tal vez tenga que modificar los permisos de escritura/lectura para que nadie pueda modificar el escritorio. Pero también planeo ocultar la unidad mapeada que agruparía los accesos directos del escritorio.

    Ya me voy a ocupar de la deportación de la carpeta del escritorio de cada usuario hacia esta unidad.

    0