Mit Batch gewünschte Bilder im gewünschten Unterordner löschen
Hallo ich bin`s wieder mal ,
brauch wieder mal euren Fachwissen um eine Batch Aufgabe zu lösen. Wie es schon im Titel steht, bräuchte ich einen Skript, mit dem ich einige Bilder in gewisse Unterordner löschen kann.
Ich vermute , dass es nicht so ganz klappt, wie ich es mir vorstelle.
Hauptverzeichnis: C:\ Ordner XYZ
Unterverzeichnis C:\Ordner XYZ\Ordner A
Unterverzeichnis C:\Ordner XYZ\Ordner B
Unterverzeichnis C:\Ordner XYZ\Ordner C
Weitere Unterverzeichnis : C:\ Ordner XYZ\Ordner A\Ordner AA
Weitere Unterverzeichnis : C:\ Ordner XYZ\Ordner B\Ordner BB
Weitere Unterverzeichnis : C:\ Ordner XYZ\Ordner C\Ordner CC
In den Ordnern (AA,BB,CC) sind mehrere Bilder. Gibt es einen Skript womit ich 1.) Nur die Bilder in AA und CC löschen kann ohne die BB zu berücksichtigen
2.) Beim löschen der Bilder in AA und CC, das Erste und das Letzte Bild zu behalten, also nicht zu löschen.
(Alles dazwischen zu löschen)
Über ein Umweg vielleicht mit copy?
Danke im Vorraus
MfG
brauch wieder mal euren Fachwissen um eine Batch Aufgabe zu lösen. Wie es schon im Titel steht, bräuchte ich einen Skript, mit dem ich einige Bilder in gewisse Unterordner löschen kann.
Ich vermute , dass es nicht so ganz klappt, wie ich es mir vorstelle.
Hauptverzeichnis: C:\ Ordner XYZ
Unterverzeichnis C:\Ordner XYZ\Ordner A
Unterverzeichnis C:\Ordner XYZ\Ordner B
Unterverzeichnis C:\Ordner XYZ\Ordner C
Weitere Unterverzeichnis : C:\ Ordner XYZ\Ordner A\Ordner AA
Weitere Unterverzeichnis : C:\ Ordner XYZ\Ordner B\Ordner BB
Weitere Unterverzeichnis : C:\ Ordner XYZ\Ordner C\Ordner CC
In den Ordnern (AA,BB,CC) sind mehrere Bilder. Gibt es einen Skript womit ich 1.) Nur die Bilder in AA und CC löschen kann ohne die BB zu berücksichtigen
2.) Beim löschen der Bilder in AA und CC, das Erste und das Letzte Bild zu behalten, also nicht zu löschen.
(Alles dazwischen zu löschen)
Über ein Umweg vielleicht mit copy?
Danke im Vorraus
MfG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 297771
Url: https://administrator.de/contentid/297771
Ausgedruckt am: 20.11.2024 um 07:11 Uhr
46 Kommentare
Neuester Kommentar
das Erste und das Letzte Bild zu behalten, also nicht zu löschen.
Was bedeutet bei dir erstes und letztes Bild ? Ist hier das Datum ausschlaggebend oder die alphabetische Sortierung der Bildernamen?fk
Powershell (PS 3.0):
gci 'c:\ordner\*' -Recurse -Directory -Include "Ordner AA","Ordner BB" | %{
$list = gci "$($_.Fullname)\*.*" -File | sort LastWriteTime
$list[1..($list.Length-2)] | remove-item -Force
}
Zitat von @Weezyt:
Ist Powershell auch sowas ähnlichres? Also die Batch Skripte speichere ich alle im Texteditor mit der Endung .bat ab. Ist es da auch der Fall?
X)Ist Powershell auch sowas ähnlichres? Also die Batch Skripte speichere ich alle im Texteditor mit der Endung .bat ab. Ist es da auch der Fall?
https://de.wikipedia.org/wiki/Windows_PowerShell
Zu deinem Skript: Bei gci ' c:\Ordner\* ' kommt das das Hauptverzeichnis rein Also Ordern XYZ?
Ja, sonst hätte ich den Ordner ja anders benannt. X)
Batch ist, außer auf alten System, tot.
Durchsucht den angegebenen Ordner und alle Unterordner (mit Include eingeschränkt)
Also die Batch Skripte speichere ich alle im Texteditor mit der Endung .bat ab. Ist es da auch der Fall?
Die werden als *.ps1 abgespeichert.Zu deinem Skript: Bei gci ' c:\Ordner\* ' kommt das das Hauptverzeichnis rein Also Ordern XYZ?
gci 'c:\ordner\*' -Recurse
Durchsucht den angegebenen Ordner und alle Unterordner (mit Include eingeschränkt)
Erstens hast du nicht meinen aktuellen Code oben kopiert (hatte ich kurz danach korrigiert), zweitens hast du beim Pfad das \* am Ende weggelassen was du in diesem speziellen Fall mit Include nicht vergessen darfst!
Ebenso wird für obigen Code min. PS 3.0 benötigt für 2.0 muss man es etwas umschreiben.
Ebenso wird für obigen Code min. PS 3.0 benötigt für 2.0 muss man es etwas umschreiben.
st die Umschreibung den aufwendig? Ich kenn mich halt überhaupt nicht damit aus.
Nein kein Problem:gci 'c:\ordner\*' -Recurse -Include "Ordner AA","Ordner BB" | ?{$_.PSIsContainer} | %{
$list = gci "$($_.Fullname)\*.*" | ?{!$_.PSIsContainer} | sort LastWriteTime
$list[1..($list.Length-2)] | remove-item -Force
}
Soll uns das sagen, dass das Problem behoben ist?
Wenn ja, bitte noch entsprechend markieren.
Wenn ja, bitte noch entsprechend markieren.
Teste mal nach und nach, wo der Fehler auftritt. Wenn ich das richtig sehe, scheint irgendwo eine der Datei-Übergaben fehlzuschlagen.
Läuft er hierbei schon in den Fehler?
gci 'c:\ordner\*' -Recurse -Include "Ordner AA","Ordner BB" | ?{$_.PSIsContainer} | %{
$list = gci "$($_.Fullname)\*.*" | ?{!$_.PSIsContainer} | sort LastWriteTime
Läuft er hierbei schon in den Fehler?
Zitat von @Weezyt:
ahso das war wegen der fehlenden Klammer, aber so kommt kein Fehler, aber es führt auch nichts aus
Dann bitte bei jedem Mal um eine Pipe '|' kürzen/erweitern, bis du ein Ergebnis bekommst. z.B. mitahso das war wegen der fehlenden Klammer, aber so kommt kein Fehler, aber es führt auch nichts aus
gci 'c:\ordner\*' -Recurse -Include "Ordner AA","Ordner BB"
anfangen.
Also Leute,
erstens bekommst du keine Ausgabe weil das Ergbnis der Variablen $list zugewiesen und nicht ausgegeben wird. Wenn diese leer ist also keine Dateien in dem Ordner in Frage kommen kommt es zu diesem Fehler, weil die Variable dann leer ist und somit auch kein Array ist.
Diese Situation kann man natürlich zusätzlich abfangen
Funktioniert hier so wie du deine Frage zu Anfang geschildert hast einwandfrei.
Der Fehler liegt leider bei dir.
So viel Heckmeck für so was simples ...X)
erstens bekommst du keine Ausgabe weil das Ergbnis der Variablen $list zugewiesen und nicht ausgegeben wird. Wenn diese leer ist also keine Dateien in dem Ordner in Frage kommen kommt es zu diesem Fehler, weil die Variable dann leer ist und somit auch kein Array ist.
Diese Situation kann man natürlich zusätzlich abfangen
gci 'c:\ordner\*' -Recurse -Include "Ordner AA","Ordner BB" | ?{$_.PSIsContainer} | %{
$list = gci "$($_.Fullname)\*.*" -recurse | ?{!$_.PSIsContainer} | sort LastWriteTime
if ($list){
if ($list.length -gt 2){
$list[1..($list.Length-2)] | remove-item -Force
}
}
}
Der Fehler liegt leider bei dir.
So viel Heckmeck für so was simples ...X)
Zitat von @Weezyt:
Ich habe nachgeschaut und, mir ist aufgefallen, dass die Bilder nicht direkt im Ordner AA und BB sind sondern in AA gibt es noch nochmal 2 Ordner Ordner AA\Ordner AAA und das Gleiche auch bei BB.
Ja das muss man schon wissen, die berühmte Glaskugel sagt uns das leider nicht !!!Ich habe nachgeschaut und, mir ist aufgefallen, dass die Bilder nicht direkt im Ordner AA und BB sind sondern in AA gibt es noch nochmal 2 Ordner Ordner AA\Ordner AAA und das Gleiche auch bei BB.
Aber ich denke das ist nicht ausschlaggebend oder, weil es sich eh um eine Rekursiven Durchlauf handelt.
Doch das ist sehr wohl ausschlaggebend. Ist im letzten Skript darauf hin angepasst.Wie gesagt es passiert einfach nichts, nach dem neuen Skript.
Weil du uns dieses Detail leider verschwiegen hast, deswegen!
Hab ich doch gerade schon im Skript meines letzten Posts getan und abgeändert .... !
Bitte mal meine Kommentare richtig lesen. Danke.
Bitte mal meine Kommentare richtig lesen. Danke.
Zitat von @Weezyt:
Es betrachtet die Ordner BBB und BBA als einer und nimmt jeweils den ersten von BBB und den letzten von BBA (nach Datum), deshalb sind in den Ordner nur ein Bild enthalten, nachdem ich das Befehl ausgeführt habe.
Ist ja auch logisch, weil du es oben vollkommen durcheinander gewürfelt hast und keine mehr nachvollziehen konnte was du nun wirklich willst, wenn du nur den einen Ordner berücksichtigen willst nimm ihn oben in die Includes auf und entferne das -recurse in Zeile 2. Schon arm wie wenig sich die Leute hier mit den Codes beschäftigen wenn man ihnen schon eine Steilvorlage liefert. Das ist hier doch kein "mach mir meine Arbeit" Forum. Ein Minimum an Lernbereitschaft setzt man in einem Admin Forum eigentlich voraus Es betrachtet die Ordner BBB und BBA als einer und nimmt jeweils den ersten von BBB und den letzten von BBA (nach Datum), deshalb sind in den Ordner nur ein Bild enthalten, nachdem ich das Befehl ausgeführt habe.
Na dann noch viel Spaß.
Im out a here.
fk
Moin,
man kann bei gci auch Ordnerlevel angeben ab wo bestimmte Ordner gesucht werden....
Gruß jodel
man kann bei gci auch Ordnerlevel angeben ab wo bestimmte Ordner gesucht werden....
gci 'C:\Ordner XYZ\*\*\*' ...............usw. wie oben.
Gruß jodel
Zitat von @Weezyt:
So einfach ist es leider nicht. Sonst müsste ich ja für jeden Ordner einen Skript schreiben. Der Ansatz oben stimmt, aber es fehlt halt irgendwas
Wieso, nö ?? Du musst halt hier mal "unmissverständlich" klar machen was dein Ordner ausmacht und wie er eindeutig erkannt werden kann ... Das wird hier aus deinen tausenden AAs und BBs leider nicht klarer So einfach ist es leider nicht. Sonst müsste ich ja für jeden Ordner einen Skript schreiben. Der Ansatz oben stimmt, aber es fehlt halt irgendwas
Wenn man es vernünftig beschreibt wäre das in ein zwei Antworten schon geklärt gewesen, aber wenn man erst tröpfchenweise mit Details rausrückt wird das nichts.
Habe ja sogar Bilder hochgeladen, um das Ganze zu verdeutlichen
Gut das ist jetzt endlich verständlich, (auf deinen Bildern erkennt man das aber bei weitem nicht ... außerdem bietet das Forum hier einen Bilderupload im Ursprungspost, dann braucht man nicht auf solchen Werbeverseuchten Seiten rumsurfen)Damit geht das hier testweise einwandfrei und löscht auch keine Textdateien wie du gewünscht hast.
gci 'C:\Users\VAT1RT\Desktop\Versuch\*' -Recurse -Include "FPC1a","FPC1b" | ?{$_.PSIsContainer -and $_.FullName -notlike '*\FAL_Tilt*'} | %{
$list = gci $_.Fullname -Exclude *.txt | ?{!$_.PSIsContainer} | sort LastWriteTime
if ($list){
if ($list.length -gt 2){
$list[1..($list.Length-2)] | remove-item -Force
}
}
}
Ach das Ganze regt mich auf
Ruhig bleiben und die Doku lesen, dann ist das kein Hexenwerk Von nüx kommt nüx Zitat von @Weezyt:
Hast du vielleicht eine Seite, wo das Ganze mit Powershell, leicht verständlich erklärt wird.
Hast du vielleicht eine Seite, wo das Ganze mit Powershell, leicht verständlich erklärt wird.
- http://www.powershellpraxis.de/
- http://www.powershellpraxis.de/index.php/dateien-und-ordner
- http://www.msxfaq.de/code/powershell/powershell.htm
- PowerShell for Runaways - Part I
- PowerShell For Runaways - Part II
- http://powershell.com/cs/
- http://powershell.com/cs/media/13/default.aspx
DANKE nochmal
Bidde Zitat von @Weezyt:
Hallo jodel,
funkt PowerShell auch mit IrfanView, sodass ich z.b die Bilder im Ordner FAL_Tilt konventieren kann?
Alles was sich per CMD steuern lässt geht auch mit Powershell.Hallo jodel,
funkt PowerShell auch mit IrfanView, sodass ich z.b die Bilder im Ordner FAL_Tilt konventieren kann?
Aber wenn es um so einfache Sachen wie die Größe oder Format ändern geht, das kann die Powershell nativ auch selber, da sie das komplette NET-Framework nutzen kann.
Guckst du hier: Powershell: Bilder verkleinern oder an bestimmte Größe anpassen
Doch kann man damit auch in dieser Zeile der zweite Parameter:
ändern in
https://msdn.microsoft.com/de-de/library/system.drawing.imaging.imagefor ...
$newImg.Save($newImagePath,$img.RawFormat)
$newImg.Save($newImagePath,[System.Drawing.Imaging.ImageFormat]::Jpeg)
https://msdn.microsoft.com/de-de/library/system.drawing.imaging.imagefor ...
$list | ?{$_.Extension -eq '.bmp'} | Resize-Image -OutPath "D:\Bilder\klein" -NewWidth 800 -NewHeight 600
Les dich doch bitte in Powershell mal ein. Danke.
Zitat von @Weezyt:
Mit Aufruf der Konventierung meinst du ? $newImg.Save($newImagePath,[System.Drawing.Imaging.ImageFormat]::Jpeg)?
Nee, bitte les doch den Beitrag von @colinardo erst mal bitte ... Das ist eine Komplette Funktion in der du die diese Zeile änderst und dann in dein Skript einbaust.Mit Aufruf der Konventierung meinst du ? $newImg.Save($newImagePath,[System.Drawing.Imaging.ImageFormat]::Jpeg)?
Wir können dir hier das Lesen und Lernen nicht abnehmen, ein bisschen musst du auch schon dafür tun.