Para eliminar todas bin
las 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 PAUSE
al 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
@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.exe
con 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
}