¿Eliminar todas las subcarpetas usando un archivo por lotes?

¿Eliminar todas las subcarpetas usando un archivo por lotes?

Para eliminar todas binlas carpetas que se encuentran en cualquier subcarpeta de la ruta actual, tengo el siguiente script, esto es lo que he probado (hasta donde tengo conocimiento sobre scripts por lotes):

setlocal enabledelayedexpansion
for /f %%i in ('dir /a:d /s /b *') 
do 
(
  set d=!i!\bin 
  if exist !d! rd !d!
)
endlocal

no funciona y parece que incluso hay algún error de sintaxis. Pero es doloroso descubrir qué es. Cuando ejecuto el archivo por lotes desde cmd, dice algo como esto:

/s was unexpected at this time.

Tenga en cuenta que para que se ejecute ese archivo por lotes cmd, tengo que cambiarlo %%a %; de lo contrario, se queja

The syntax of the command is incorrect.

Entonces, ¿es ridículo que si queremos ejecutar el archivo por lotes desde cmd, tengamos que reemplazarlo todo %%primero %? De verdad :D Si ejecuta el archivo por lotes directamente (haciendo doble clic en él), la ventana de la consola se cierra inmediatamente sin darme ninguna oportunidad de ver qué está mal. Incluso intenté poner un PAUSEal final para que pueda pausarse, pero tampoco funciona (sé que hubo algún error antes de eso, lo que hizo que la pausa no funcionara también).

Vuelva a mi problema original, porque no tengo ni idea de qué está mal aquí (con el mensaje informado por cmd). Estoy realmente estancado en esto. Espero que puedan encontrar algún problema en mi script y ayudarme a solucionarlo.

Respuesta1

Puedes probar:
@echo off 

cd/d "%~dp0"

for /f delims^= %%i in (
  'dir /a:d/s/b ^| findstr /eil "\bin \obj"'
  )do echo; rd "%%~i"


  • Obs.: 1Su sintaxis tiende a servir a otros lenguajes, pero no al script bat/cmd, este bucle no funciona de esa manera...

    for /f %%i in ('loop command') 
    do 
    (
       // dynamic variable %%i can be expanded, that 
       // doesn't mean it will be treated/expanded 
       // like a regular variable %i% at runtime !i!
    )
    

    La sintaxis del comando es incorrecta.


  • Obs.: 2El código da como resultado una lista en su pantalla, para ejecutar/eliminar su carpeta elimine echo;si el resultado parece correcto

Recursos adicionales:

Respuesta2

Utilice PowerShell, ya que es mucho más potente que cmd.

Necesitas instalarPowerShell 7, entonces es posible que también quieras instalarTerminal de Windows, si no sabes cómo instalarlos y abrirlos, hay toneladas de tutoriales en línea que explican el proceso mejor que yo, así que no los repetiré aquí.

Ejecutar pwsh.execon derechos de administrador:

Win+ R-> tipo pwsh.exe-> Ctrl+ Shift+Enter

Luego, en la consola, para obtener todos los elementos dentro de "Ruta\a\carpeta":

Get-ChildItem -Path "Path\to\folder" -Force -Recurse

Solo enumera los subdirectorios:

Get-ChildItem -Path "Path\to\folder" -Force -Recurse -Directory

Filtre la salida del primer comando según el patrón:

Get-ChildItem -Path "Path\to\folder" -Force -Recurse | Where-Object {$_.Name -match 'bin|obj' }

Eliminar todos los elementos filtrados por el eslabón anterior de la cadena:

Get-ChildItem -Path "Path\to\folder" -Force -Recurse | Where-Object {$_.Name -match 'bin|obj' } | Remove-Item -Recurse -Force -Confirm:$false

Lo anterior hace lo que desea, ruta\a\carpeta es un marcador de posición, cámbielo a la ruta real (absoluta), por ejemplo, si la ruta es "D:\MiCarpeta", cámbiela a "D:\MiCarpeta", 'bin|obj' es una expresión regular, si necesita otros patrones, reemplácelo con el patrón que necesita, para construir el patrón, simplemente una las opciones usando tuberías verticales. Encierre los caminos y patrones entre comillas.

Advertencia: Lo anterior elimina automáticamente todo lo especificado correctamente sin mensaje de confirmación; si no está preparado, no lo ejecute.

Ahora para abreviar todo:

gci "Path\to\folder" -Fo -R | % {$_.Name -match 'bin|obj' } | ri -R -Fo -Con:$false

Adjunte el código en una función para aumentar la reutilización:

function remove-filtered ($path, $pattern) {
    Get-ChildItem -Path $path -Force -Recurse | Where-Object {$_.Name -match $pattern } | Remove-Item -Recurse -Force -Confirm:$false
}

información relacionada