emjott
Goto Top

Batch - alle Datei außer ... löschen - DEL negieren

Hallo,

ich grübel nun schon seit einiger Zeit an dem folgenden Problem:

Ich habe eine Ordner in dem mehrere bkf-Dateien und mehrer Unterordner drin sind. Per Batch, welche vor dem Sicherungsjob aufgerufen wird, möchte ich nun alle Datei und Ordner außer die "cfg"-Dateien löschen. Hat jemand von euch eine Idee, wie ich den DEL-Befehl von Win.2003 so negieren kann?

Vielen dank im Voraus und schöne Grüße

Content-Key: 127436

Url: https://administrator.de/contentid/127436

Ausgedruckt am: 29.03.2024 um 02:03 Uhr

Mitglied: ITIL-Harry
ITIL-Harry 19.10.2009 um 15:24:36 Uhr
Goto Top
Ansatz - noch nicht zuendegedacht, aber vielleicht kommst ja damit weiter:

erstell Dir mit

DIR |find /V "*.cfg" > DELETELIST.txt

eine Datei, die alle Dateinamen ausser der .cfg Dateien beinhaltet

Lösche die Dateien mittels einer Schleife:

FOR /F %%i in ("DELETELIST.txt") do
(
del %%i
)

Nur die Unterverzeichnisse hab ich noch keine Idee

Gruß
ITIL-Harry
Mitglied: Biber
Biber 19.10.2009 um 16:36:35 Uhr
Goto Top
Moin emjott, Moin ITIL-Harry,

Im Ansatz würde (und wird) natürlich ITIL-Harrys selbiger zum Ziel führen, aber nicht sehr effektiv.
Da es unter dem CMD/im Batch keine Mimik für "Dateiangaben mit Wildcards außer.." gibt,
die Wildcard-Befehle aber ungleich schneller sind als als das Anfassen/Löschen EINZELNER Dateien, würde ich eine andere Strategie wählen.

  • Schritt 1: Alle *.cfg-Dateien in allen Verzeichnissen unterhalb "Sicherungs-Root" mit XCopy incl. Verzeichnisstruktur irgendwohin kopieren (nach "%temp%\cfgsich\")
  • Schritt 2: dann "Sicherungs-Root" und alles darin mit einem schnellen RD /s /Q "Sicherungs-Root" wegknallen
  • Schritt 3: die *.cfg-Dateien wieder vom Temp-Verzeichnis zurückkopieren.

Für Schritt 1 und 3 wäre statt XCopy natürlich auch das Zippen in eine AlleCFgs.zip und das Entzippen dieser AlleCfgs.zip realisierbar.

Grüße
Biber
Mitglied: ITIL-Harry
ITIL-Harry 19.10.2009 um 16:50:39 Uhr
Goto Top
Hi Biber,

man muss wieder lernen, einfach zu denken ...
Du hast vollkommen Recht - zumal diese Lösung das Defizit der
Unterverzeichnisse meiner Lösung mitz erschlägt.

Gruß
ITIL-Harry
Mitglied: emjott
emjott 19.10.2009 um 16:51:44 Uhr
Goto Top
Hallo Biber,

ja deine Idee ist gar nicht mal so schlecht. Das läßt sich auch besser umsetzen... ich werde dass nachher mal probieren. Vielen Dank erstmal an euch beide
Mitglied: manuel-r
manuel-r 19.10.2009 um 17:48:27 Uhr
Goto Top
Sollte noch einfacher gehen:
  • alle .cfg Dateien per attrib +h +r c:\order\*.cfg /s unsichtbar machen oder meinetwegen auch schreibschützen
  • alle Dateien in der Ordnerstruktur mit del c:\ordner\*.* /s löschen
  • die .cfg Dateien wieder per attrib -h -r c:\ordner\*.cfg /s schreib- und sichtbar machen also entsperren.

Manuel
Mitglied: 5t8d1e
5t8d1e 19.10.2009 um 18:56:44 Uhr
Goto Top
Hallo,

wie wärs mit diesen Einzeiler
(echo irgendwann mal entfernen damit es läuft)

for /r %cd% %a in (*) do if not %~xa==.cfg echo del /q %a

in der Batch wäre es

for /r %cd% %%a in (*) do if not %%~xa==.cfg echo del /q %%a
Mitglied: o0Julia0o
o0Julia0o 13.02.2015 um 21:17:51 Uhr
Goto Top
Ich habe ein ähnliches Problem. Ich möchte alle Datein & auch alle Ordner löschen in einem Verzeichnis relativ zum Ort der Batch. Außerdem möchte ich 2 bestimmte bekannte Ordner nicht löschen, also z.B. OrdnerA und OrdnerB. Aber ohne Umkopieraktion.

Geht das?
Mitglied: 5t8d1e
5t8d1e 18.02.2015 um 19:28:21 Uhr
Goto Top
Ahoi Julia,

nach 6 Jahre noch eine Antwort ist auch nicht schlecht. face-smile
Aber heutezutage würde ich da lieber zur Powershell greifen.
Schau die mal das cmdlet Remove-Item an. Die hat das den Parameter -exclude da evtentuell die Ordner mitgeben.
Zur Zeit habe ich keine Windowsrechner griffbereit um mal quick und dirty was zu schicken.
Hier noch eine kleiner Link als Hilfe.
https://technet.microsoft.com/de-de/library/ee176938.aspx
Mitglied: o0Julia0o
o0Julia0o 18.02.2015 um 23:17:34 Uhr
Goto Top
danke Dir, 5t8d1e - geht das nicht einfach per Batch? Ich habe mir gerade mal Powershell angesehen, aber zumindest von der Bedienung her sehr schlecht.

Habe eine Batch erstellt:
@echo off
PowerShell -ExecutionPolicy Bypass &'remove.ps1'
exit

Und im gleichen Verzeichnis eine remove.ps1 mit folgendem Inhalt:
"hello world"

..angezeigt wird nix, stattdessen öffnet sich ein CMD-Fenster ;) Also Batch wäre mir deutlich lieber face-smile

ahoi
Mitglied: Dani
Dani 19.02.2015 aktualisiert um 01:03:36 Uhr
Goto Top
Guten Abend Julia,
Batch wird früher oder später sterben. Du wirst um die Powershell nicht drumrum kommen... auch wenn es viele nicht glauben (können).

Dein Wunsch lässt sich wie folgt umsetzen:
Get-ChildItem -Path  'temp/*' -Recurse -Exclude OrdnerA, OrdnerB | Select -ExpandProperty Name | Remove-Item -force   
Speicherst du in eine Datei "remove.ps1".

Um Powershellskripte ausführen zu können muss die ExecutionPolicy angepasst werden.
Dazu die Powershell als Admin starten und folgeden Befehl eingeben:
Set-ExecutionPolicy Unrestricted
Danach kannst du das Skript ausführen.


Gruß,
Dani
Mitglied: o0Julia0o
o0Julia0o 28.02.2015 aktualisiert um 19:01:47 Uhr
Goto Top
dankeschön. wie kann ich meinen aktuellen ExecutionPolicy-Stand ansehen? Denn ein paar Sachen funktionieren schon mit powershell.. glaube ich.

Bei Batch-Dateien muss man das nicht setzen.. ist das nicht ziemelich lästig, für die Nutzer? Hat das etwas mit "Trotzdem ausführen" zu tun?


Jedoch nützt mir deine Version nichts. Denn ich kann noch nicht einmal eine eigene Powershell-Datei ausführen(siehe oben "Hello World"). Was habe ich da falsch gemacht? Ich möchte einfach nur "Hellor World" ausgeben lassen.
Mitglied: Dani
Dani 28.02.2015 um 19:17:51 Uhr
Goto Top
dankeschön. wie kann ich meinen aktuellen ExecutionPolicy-Stand ansehen?
Get-ExecutionPolicy

t das nicht ziemelich lästig, für die Nutzer? Hat das etwas mit "Trotzdem ausführen" zu tun?
Ist eine Sicherheitsfunktion. Nomalerweiße werden Powershelleskripte in Firmenumgebungen signiert. Aber im privaten Bereich kann man schon Unrestricted nutzen.

Wie hast du das Powershellskript gestartet?


Gruß,
DAni
Mitglied: o0Julia0o
o0Julia0o 28.02.2015 um 19:39:13 Uhr
Goto Top
Ich habe es so versucht:

1. Eine Batch-Datei erstellt:
echo off
PowerShell -ExecutionPolicy Bypass &'remove.ps1'
exit

Und im gleichen Verzeichnis eine remove.ps1 mit folgendem Inhalt:
"hello world"
Mitglied: Dani
Dani 01.03.2015 um 09:06:46 Uhr
Goto Top
So habe ich es noch nie versucht.
Ich habe auf meinen privaten Notebook folgendes gemacht:

1) Powershell über das Startmenü geöffnet (Rechtsklick -> Als Administrator starten)
2) Set-ExecutionPolicy auf Unrestricted
3) Inhalt in eine .ps1 Datei gespeichert
write-host "Hello World"  
pause
4) Rechtklick auf .ps1 und "Mit Powershell ausführen" auswählen


Gruß,
Dani
Mitglied: 114757
114757 01.03.2015, aktualisiert am 14.03.2015 um 17:13:30 Uhr
Goto Top
Zitat von @o0Julia0o:
Ich habe es so versucht:

1. Eine Batch-Datei erstellt:
echo off
PowerShell -ExecutionPolicy Bypass &'remove.ps1'
exit

Und im gleichen Verzeichnis eine remove.ps1 mit folgendem Inhalt:
"hello world"
Moin,
dat geht so auch nich weil du den Parameter -command nicht angibst ...machs so, dann brauchst du noch nicht mal eine extra PS1 Datei
powershell -Executionpolicy ByPass -Command "&{gci '.\Ordner' -Exclude 'OrdnerA','OrdnerB' | Remove-item -Recurse -Force -EA SilentlyContinue}"  
Gruß jodel32

p.s. @colinardo hat das in folgendem Thread schön zusammengefasst wie man Powershell-Scripte aus einer Batch heraus starten kann:
Batch soll überprüfen, ob Windows-Explorer gestartet ist
Mitglied: rubberman
rubberman 01.03.2015 um 12:18:02 Uhr
Goto Top
Hallo Julia,

Threadleichen wieder auszugraben macht keinen Sinn. Wenn du Glück hast, stolpert mal jemand drüber, anderenfalls bleibt es ungesehen. Ich kann mich an Zeiten erinnern, wo solche Threads in diesen Fällen geschlossen wurden, @Dani scheint hier deutlich toleranter zu sein.

Ich möchte alle Datein & auch alle Ordner löschen in einem Verzeichnis relativ zum Ort der Batch. Außerdem möchte ich 2 bestimmte bekannte Ordner nicht löschen
pushd "relativer\pfad"  
for /f "delims=" %%i in ('dir /ad /b ^| findstr /vix "OrdnerA OrdnerB"') do rd /s /q "%%i"  
del /f /q *.*
popd

Grüße
rubberman
Mitglied: Dani
Dani 01.03.2015 um 16:24:21 Uhr
Goto Top
Moin rubberman,
Ich kann mich an Zeiten erinnern, wo solche Threads in diesen Fällen geschlossen wurden, @Dani scheint hier deutlich toleranter zu sein.
Das ist nach wie vor so. Ich habe Julia in zwei anderen Threads auf die Regeln hingewiesen.
In diesem Fall ist es Toleranz.


Gruß,
Dani
Mitglied: o0Julia0o
o0Julia0o 14.03.2015 aktualisiert um 16:34:32 Uhr
Goto Top
Also so klappt das jetzt mit dem Start per Batch:
test.bat:
echo off
powershell.exe -ExecutionPolicy RemoteSigned -File ".\test.ps1"
exit

test.ps1:
write-host "Hello World"
Command "&{gci '.\Ordner\*' -Exclude 'OrdnerA','OrdnerB' -recurse | Remove-item -Force -EA SilentlyContinue}"
pause


Aber das mit dem Ordner löschen geht nicht:

test.ps1
Command "&{gci '.\Ordner\*' -Exclude 'OrdnerA','OrdnerB' -recurse | Remove-item -Force -EA SilentlyContinue}"

aber auch:
"&{gci '.\Ordner\*' -Exclude 'OrdnerA','OrdnerB' -recurse | Remove-item -Force -EA SilentlyContinue}"

geht nicht.

Es wird kein Ordner gelöscht. Die ps1-Datei befindet sich in dem gleichen Ordner wie die test.bat. Und die Ordner(einige Testordner, auch welche Namens OrdnerA und OrdnerB) in einem Unterordner namens "Ordner". Aber auch direkt im Verzeichnis der batch wird kein Ordner gelöscht.

Per reiner Batch:
powershell -Executionpolicy ByPass -Command "&{gci '.\Ordner\*' -Exclude 'OrdnerA','OrdnerB' -recurse | Remove-item -Force -EA SilentlyContinue}"

macht er zwar etwas, aber nicht das richtige. Er löscht alle Ordner & Dateien(inklusive Unterordner samt Dateien) von OrdnerA, OrdnerB & OrdnerC. Außerdem kommt für jeden Ordner eine Nachfrage:

E:\PS>powershell -Executionpolicy ByPass -Command "&{gci '.\Ordner\*' -Exclude '
OrdnerA','OrdnerB' -recurse | Remove-item -Force -EA SilentlyContinue}"

Bestätigung
Das Element unter
"Microsoft.PowerShell.Core\FileSystem::E:\PS\Ordner\OrdnerA\UnterrodnerA"
verfügt über untergeordnete Elemente, und der Recurse-Parameter wurde nicht
angegeben. Wenn Sie fortfahren, werden mit dem Element auch alle
untergeordneten Elemente entfernt. Möchten Sie den Vorgang wirklich fortsetzen?
[J] Ja [A] Ja, alle [N] Nein [K] Nein, keine [H] Anhalten [?] Hilfe
(Standard ist "J"):
Mitglied: 114757
114757 14.03.2015 aktualisiert um 16:35:07 Uhr
Goto Top
Du hast das -Recurse bei Remove-item -Recurse -Force -EA SilentlyContinue vergessen
Mitglied: o0Julia0o
o0Julia0o 14.03.2015 aktualisiert um 16:37:52 Uhr
Goto Top
danke, also so sieht die test.ps1 aus(habe herauskopiert):
powershell -Executionpolicy ByPass -Command "&{gci '.\Ordner\*' -Exclude 'OrdnerA','OrdnerB' -recurse | Remove-item -Force -EA SilentlyContinue}"


Da steht ja -recurse sowie SilentlyContinue & Force und EA mit drin!
Mitglied: 114757
114757 14.03.2015 aktualisiert um 17:13:14 Uhr
Goto Top
Zitat von @o0Julia0o:

Da steht ja -recurse sowie SilentlyContinue mit drin!

aber nicht im remove-item Cmdlet!!! Und genau da muss es hin Mädel, siehe meinen Code oben ...
powershell -Executionpolicy ByPass -Command "&{gci '.\Ordner' -Exclude 'OrdnerA','OrdnerB' | Remove-item -Recurse -Force -EA SilentlyContinue}"
Mitglied: o0Julia0o
o0Julia0o 14.03.2015 aktualisiert um 16:48:10 Uhr
Goto Top
ah o.k., danke. Also per Batch(ohne ps1) macht er dann auch etwas - auch ohne Nachfrage. Aber immer noch das falsche. So siet meine Batch aus:

powershell -Executionpolicy ByPass -Command "&{gci '.\Ordner\*' -Exclude 'OrdnerA','OrdnerB' -recurse | Remove-item -Recurse -Force -EA SilentlyContinue}"


Er löscht alle Ordner & Dateien(inklusive Unterordner samt Dateien) von OrdnerA, OrdnerB & OrdnerC.
Es sollen aber alle Ornder & Dateien(inklusive Unterordner samt Dateien) AUßer OrdnerA & OrdnerB gelöscht werden. OrdnerA & OrdnerB sollen also verschont bleiben.

Hier mal meine Testumgebung: http://www.file-upload.net/download-10418671/PS.zip.html
Mitglied: 114757
114757 14.03.2015 aktualisiert um 17:19:12 Uhr
Goto Top
Hier mal meine Testumgebung
Du hast mich komplett falsch verstanden !! Die obige Zeile kommt ohne extra PS1 Datei aus, und kann in der Art direkt in die Batch geschrieben werden !
Also nochmal, so gehört das dann klappt dat auch 100% für deine Umgebung
@echo off
powershell -Executionpolicy ByPass -Command "&{gci '.\Ordner' -Exclude 'OrdnerA','OrdnerB' | Remove-item -Recurse -Force -EA SilentlyContinue}"  
pause
Mitglied: o0Julia0o
o0Julia0o 14.03.2015 um 23:26:12 Uhr
Goto Top
wow das funktioniert. Danke. Kennt Jemand zufällig eine Seite, wo ich so etwas auf deutsch nachlesen kann, wie ich das hätte selbst programmieren können?

Und warum funktioniert jetzt:
"&{gci '.\Ordner' -Exclude 'OrdnerA','OrdnerB' | Remove-item -Recurse -Force -EA SilentlyContinue}"

nicht als ps1-Datei? Zumal ich ja in der Batch per -ExecutionPolicy RemoteSigned mir die Rechte zum Ausführen zusichere...
Mitglied: 114757
114757 15.03.2015 aktualisiert um 08:40:20 Uhr
Goto Top
Zitat von @o0Julia0o:

wow das funktioniert. Danke. Kennt Jemand zufällig eine Seite, wo ich so etwas auf deutsch nachlesen kann, wie ich das
hätte selbst programmieren können?

Und warum funktioniert jetzt:
"&{gci '.\Ordner' -Exclude 'OrdnerA','OrdnerB' | Remove-item -Recurse -Force -EA
SilentlyContinue}"

nicht als ps1-Datei?
Das geht schon aber da kannst du einige Dinge weglassen die via direkter Ausführung in der Batch nicht erforderlich sind, in der PS1 würde dann ausreichen:
gci '.\Ordner' -Exclude 'OrdnerA','OrdnerB' | Remove-item -Recurse -Force -EA SilentlyContinue
Du lässt also die Anführungszeichen, das & und die geschweiften Klammern (welche einen Scriptblock kennzeichnen weg, die sind nur Best-Practice bei Verwendung direkt in einer Batch-Kommandozeile.

Powershell-Tutorials findest du zu Hauf im Netz, ein guter Anfang ist z.B
http://powershellpraxis.de/

Gruß jodel32

p.s. und jetzt lassen wir bitte den Thread hier ruhen. Danke.