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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 127436
Url: https://administrator.de/contentid/127436
Ausgedruckt am: 22.11.2024 um 01:11 Uhr
25 Kommentare
Neuester Kommentar
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
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
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.
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
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
Sollte noch einfacher gehen:
Manuel
- 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
Ahoi Julia,
nach 6 Jahre noch eine Antwort ist auch nicht schlecht.
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
nach 6 Jahre noch eine Antwort ist auch nicht schlecht.
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
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
ahoi
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
ahoi
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:
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:
Danach kannst du das Skript ausführen.
Gruß,
Dani
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
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
Gruß,
Dani
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.
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.
dankeschön. wie kann ich meinen aktuellen ExecutionPolicy-Stand ansehen?
Get-ExecutionPolicyt 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
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
4) Rechtklick auf .ps1 und "Mit Powershell ausführen" auswählen
Gruß,
Dani
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
Gruß,
Dani
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,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"
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}"
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
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.
Grüße
rubberman
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
Moin rubberman,
In diesem Fall ist es Toleranz.
Gruß,
Dani
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
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"):
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"):
Du hast das -Recurse bei
Remove-item -Recurse -Force -EA SilentlyContinue
vergessenaber 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}"
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
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
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
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...
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...
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: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?
gci '.\Ordner' -Exclude 'OrdnerA','OrdnerB' | Remove-item -Recurse -Force -EA SilentlyContinue
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.