Um alle bin
Ordner 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 cmd
ersetzen 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
@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.exe
Mit 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
}