Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: emjott

emjott (Level 2) - Jetzt verbinden

19.10.2009 um 14:56 Uhr, 20004 Aufrufe, 25 Kommentare, 1 Danke

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
Mitglied: ITIL-Harry
19.10.2009 um 15:24 Uhr
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
Bitte warten ..
Mitglied: Biber
19.10.2009 um 16:36 Uhr
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
Bitte warten ..
Mitglied: ITIL-Harry
19.10.2009 um 16:50 Uhr
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
Bitte warten ..
Mitglied: emjott
19.10.2009 um 16:51 Uhr
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
Bitte warten ..
Mitglied: manuel-r
19.10.2009 um 17:48 Uhr
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
Bitte warten ..
Mitglied: 5t8d1e
19.10.2009 um 18:56 Uhr
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
Bitte warten ..
Mitglied: o0Julia0o
13.02.2015 um 21:17 Uhr
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?
Bitte warten ..
Mitglied: 5t8d1e
18.02.2015 um 19:28 Uhr
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
Bitte warten ..
Mitglied: o0Julia0o
18.02.2015 um 23:17 Uhr
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
Bitte warten ..
Mitglied: Dani
19.02.2015, aktualisiert um 01:03 Uhr
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:
01.
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:
01.
Set-ExecutionPolicy Unrestricted
Danach kannst du das Skript ausführen.


Gruß,
Dani
Bitte warten ..
Mitglied: o0Julia0o
28.02.2015, aktualisiert um 19:01 Uhr
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.
Bitte warten ..
Mitglied: Dani
28.02.2015 um 19:17 Uhr
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
Bitte warten ..
Mitglied: o0Julia0o
28.02.2015 um 19:39 Uhr
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"
Bitte warten ..
Mitglied: Dani
01.03.2015 um 09:06 Uhr
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
01.
write-host "Hello World" 
02.
pause
4) Rechtklick auf .ps1 und "Mit Powershell ausführen" auswählen


Gruß,
Dani
Bitte warten ..
Mitglied: 114757
01.03.2015, aktualisiert 14.03.2015
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
01.
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:
http://www.administrator.de/frage/batch-überprüfen-windows-ex ...
Bitte warten ..
Mitglied: rubberman
01.03.2015 um 12:18 Uhr
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
01.
pushd "relativer\pfad" 
02.
for /f "delims=" %%i in ('dir /ad /b ^| findstr /vix "OrdnerA OrdnerB"') do rd /s /q "%%i" 
03.
del /f /q *.* 
04.
popd
Grüße
rubberman
Bitte warten ..
Mitglied: Dani
01.03.2015 um 16:24 Uhr
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
Bitte warten ..
Mitglied: o0Julia0o
14.03.2015, aktualisiert um 16:34 Uhr
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"):
Bitte warten ..
Mitglied: 114757
14.03.2015, aktualisiert um 16:35 Uhr
Du hast das -Recurse bei Remove-item -Recurse -Force -EA SilentlyContinue vergessen
Bitte warten ..
Mitglied: o0Julia0o
14.03.2015, aktualisiert um 16:37 Uhr
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!
Bitte warten ..
Mitglied: 114757
14.03.2015, aktualisiert um 17:13 Uhr
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}"
Bitte warten ..
Mitglied: o0Julia0o
14.03.2015, aktualisiert um 16:48 Uhr
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
Bitte warten ..
Mitglied: 114757
14.03.2015, aktualisiert um 17:19 Uhr
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
01.
@echo off 
02.
powershell -Executionpolicy ByPass -Command "&{gci '.\Ordner' -Exclude 'OrdnerA','OrdnerB' | Remove-item -Recurse -Force -EA SilentlyContinue}" 
03.
pause
Bitte warten ..
Mitglied: o0Julia0o
14.03.2015 um 23:26 Uhr
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...
Bitte warten ..
Mitglied: 114757
15.03.2015, aktualisiert um 08:40 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...