alle Unterordner per Batchdatei löschen?

alle Unterordner per Batchdatei löschen?

Um alle binOrdner zu löschen, die aus allen Unterordnern des aktuellen Pfads stammen, habe ich das folgende Skript. Folgendes habe ich ausprobiert (soweit ich über Batch-Skripte Bescheid weiß):

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

es funktioniert nicht und es sieht so aus, als ob es sogar einen Syntaxfehler gibt. Aber es ist mühsam, herauszufinden, was es ist. Wenn ich die Batchdatei von ausführe cmd, steht da ungefähr Folgendes:

/s was unexpected at this time.

Beachten Sie, dass ich für die Ausführung dieser Batchdatei das in cmdändern muss , sonst beschwert es sich%%%

The syntax of the command is incorrect.

Es ist also lächerlich, dass wir, wenn wir die Batchdatei von ausführen möchten , all durch first cmdersetzen müssen ? Wirklich :D Wenn ich die Batchdatei direkt ausführe (durch Doppelklicken), schließt sich das Konsolenfenster sofort, ohne dass ich die Chance habe, zu sehen, was falsch ist. Ich habe sogar versucht, am Ende ein einzufügen, damit es angehalten werden kann, aber das funktioniert auch nicht (ich weiß, dass vorher ein Fehler auftritt, der dafür sorgt, dass die Pause auch nicht funktioniert).%%%PAUSE

Kommen wir zu meinem ursprünglichen Problem zurück, denn ich habe keine Ahnung, was hier falsch ist (mit der Meldung, die vom gemeldet wurde cmd). Ich komme wirklich nicht weiter. Ich hoffe, ihr könnt einen Fehler in meinem Skript finden und mir helfen, ihn zu beheben.

Antwort1

Du kannst es versuchen:
@echo off 

cd/d "%~dp0"

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


  • Beob.: 1Seine Syntax ist eher für andere Sprachen gedacht, aber nicht für Bat-/Cmd-Skripte. Diese Schleife funktioniert nicht auf diese Weise ...

    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!
    )
    

    Die Syntax des Befehls ist falsch.


  • Obs.: 2Der Code führt zu einer Auflistung auf Ihrem Bildschirm. Um Ihren Ordner auszuführen/zu löschen, entfernen Sie ihn, echo;wenn die Ausgabe korrekt aussieht.

Zusätzliche Ressourcen:

Antwort2

Verwenden Sie PowerShell, da es viel leistungsfähiger als cmd ist.

Sie müssen installierenPowerShell 7, dann möchten Sie vielleicht auch installierenWindows-TerminalWenn Sie nicht wissen, wie man sie installiert und öffnet, gibt es unzählige Online-Tutorials, die den Vorgang besser erklären als ich. Deshalb werde ich sie hier nicht wiederholen.

pwsh.exeMit Administratorrechten ausführen :

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

Um dann in der Konsole alle Elemente innerhalb von „Pfad\zum\Ordner“ abzurufen:

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

Nur Unterverzeichnisse auflisten:

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

Filtern Sie die Ausgabe des ersten Befehls nach Muster:

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

Entfernen Sie alle Elemente, die durch das vorherige Glied in der Kette gefiltert wurden:

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

Das Obige macht, was Sie wollen. Pfad\zum\Ordner ist ein Platzhalter. Ändern Sie ihn in den tatsächlichen (absoluten) Pfad. Wenn der Pfad beispielsweise „D:\MeinOrdner“ ist, ändern Sie ihn in „D:\MeinOrdner“. „bin|obj“ ist ein regulärer Ausdruck. Wenn Sie andere Muster benötigen, ersetzen Sie es durch das gewünschte Muster. Um das Muster zu erstellen, verbinden Sie die Optionen einfach mit vertikalen Pipes. Setzen Sie die Pfade und Muster in Anführungszeichen.

Achtung: Das Obige löscht automatisch alles korrekt Angegebene ohne Bestätigungsaufforderung. Wenn Sie nicht vorbereitet sind, führen Sie es nicht aus.

Um das Ganze nun abzukürzen:

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

Um die Wiederverwendbarkeit zu erhöhen, schließen Sie den Code in eine Funktion ein:

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

verwandte Informationen