KI 3 Batch wider dem Vergessen

Einleitung

Nachtrag 26.01.2012: Die Batch wurde erheblich verbessert und ausgebaut. Die Abhandlungen der Sternenhimmelstuermerseite werden nicht gelöscht - Sie sind die Logbücher des Sternenhimmelstuermers. Die neue Batch ist erheblich besser und hier zu finden.

Diese Abhandlung ist einer Umfrage geschuldet, bei der das nächste Thema ausgesucht werden konnte. Da das Ergebnis paritätisch ausfiel und die Abhandlung über die Depression mit 30 Seiten Umfang Priorität hatte, jetzt eher eine kurze Batch mit Abhandlung zum Thema Vergessen, die es natürlich wieder in sich hat.

Sinn der Batch ist es, Dateien nach Erstellungsdatum bzw. in ein anderes Verzeichnis zu kopieren. Dabei können beliebige Dateien von JPG über PDF zu doc bzw. docx nach Jahren sortiert werden. Alles mit einer kleinen Batch, obwohl die Funktion Bilder nach Jahrgängen zu sortieren ihnen schon sicherlich von Bildbearbeitungsprogrammen wie Picasa bekannt sein dürfte.

Die Datei ist wieder rudimentär mit allen wichtigen Befehlen und voll lauffähig. Nach dem Vorwort kommt das Inhaltsverzeichnis und die Batch. Die wird dann wieder erklärt...

Vorwort

Wie immer zur Einstimmung eine kleine Overtüre, ein Alleinstellungsmerkmal der Sternenhimmelstuermerseite: Zur KI gehört auch das Vergessen. Nur allzu gern vergisst das Betriebssystem Dateien, die dann als Müll in diversen Verzeichnissen herumliegen. Dabei ist das nicht nötig, da seit Windowsurzeiten jede Datei einen Zeitstempel erhält, den Sie dann z. B. in Windows in den Eigenschaften nachlesen können. Genau diese Fähigkeit kann sich der Computer aber zu Nutze machen. Ab einen bestimmten Zeitpunkt kann die Datei archiviert oder gelöscht werden.

Für die Vergessenslehre ist also ein rudimentäres Kriterium vorhanden. Auf einer höheren Ebene müsste KI dann noch die Entscheidung treffen, ob die Datei so wichtig ist, dass der Computer Sie behält oder nicht. Da auch Roboter in der Zukunft nur einen beschränkten Platz auf ihrer Festplatte haben, ist ein kontrolliertes Löschen der Daten wichtig, weil sonst das Sprichwort, ein Computer ist wie ein Elefant, er vergisst nie etwas, gelten würde.

Der Beitrag zur Vergessenslehre ist in diesem Fall eine Batch, die bestimmte Dateien sortiert oder auch löschen kann. Das hilft dem User, einen Überblick über die Dateien zu behalten. Einem Computer ist es hingegen egal, wo die Datei abgelegt wurde - Gibt man ihm das rudimentäre Suchkriterium Erstellungsdatum, so listet er es auf....


Inhaltsverzeichnis
KI Vergessen.Batch und kurze Erklärung für den Laien
Erklärung Zeile für Zeile




KI Vergessen.Batch und kurze Erklärung für den Laien

Zur Erstellung einer Batch (*.bat) brauchen Sie nur bordeigene Mittel (Texteditor)

1. Als Voraussetzung müssen Sie sich bekannte Dateiendungen anzeigen lassen: beliebigen Ordner öffnen: Organisieren - Layout - Menüleiste auswählen. In der Menüleiste: Extras - Ordneroptionen - Reiterkarte Ansicht: Dort Häkchen entfernen bei: Erweiterungen bei bekannten Dateitypen ausblenden.

2. Nun auf dem Desktop oder in einem Ordner mit rechter Maustaste auf freie Fläche drücken und neu - Textdokument auswählen.

3. Neues Textdokument öffnen (linker Doppelmausklick) und folgenden Code durch kopieren über die Zwischenablage einfügen:

set /p ende=Geben Sie die Dateiendung ohne Punkt ein!
set /p quelle=Geben Sie den Pfad des Quellverzeichnisses ein!
chcp 28591 > NUL
for %%f in ("%quelle%\*.%ende%") do @echo %%f %%~ntf  >>atest.txt
set /p ziel=Geben Sie den Pfad für des Zielverzeichnis ein!
set /p zeit=Geben Sie das Jahr vierstellig ein!
chcp 28591 > NUL
FOR /F "Tokens=1,2,3,4" %%i in (atest.txt) do echo copy %%i %ziel%  >>%%l_%%j.log
del atest.txt
chcp 28591 > NUL
xcopy %ziel%\*_**.**.%zeit%.log %ziel%\*.txt
chcp 28591 > NUL
for /f "TOKENS=*" %%a in ('dir *.txt /b') do type "%%a" >> ergebnis.bat
del *.log
del *.txt


4. Danach schließen. Abfrage mit Speichern mit ja beantworten.
5. Danach beliebigen Namen vergeben - nur die Endung .bat ist vorgeschrieben sortieren.bat, genial.bat...
6. Danach empfiehlt es sich die Batch in den leeren Zielordner zu verschieben. Sollten Textdokumente oder Log-Dateien in diesem Ordner sein so werden sie unwiederbringlich zerstört!
6. Mit rechter Maustaste "als Administrator ausführen". Geht auch mit normalen Doppelklick...

Danach folgen Sie den Anweisungen der Batch, geben Sie auf Anfrage die Dateiendung (pdf, docx, doc, ?) ein.
Danach kopieren Sie sich den Quellpfad des Quellverzeichnis aus dem Explorer und geben diesen ein.

Als nächstes geben Sie mit derselben Methode das Zielverzeichnis ein, wo die Datei mal hin soll.

Zu guter letzt das Jahr vierstellig, also z. B. 1999, 2001....

Danach wird automatisch im  selben Ordner, wo die Ursprungsbatch liegt, eine weitere Batch erstellt. Diese neue Batch mit Doppelklick aktivieren, dann werden sämtliche Dateien mit der Dateiendung eines Jahres wie von Geisterhand in das Zielverzeichnis kopiert.

Unterordner werden in dieser Variation nicht berücksichtigt. Die können Sie dann als Zugabe im Kapitel Perfekte Batch mit Unterverzeichnissen ohne Erklärung kopieren und damit spielen..

Nichts verstanden, dann jetz mal Zeile für Zeile - genauso denkt eine Batch....

Erklärung Zeile für Zeile

set /p ende=Geben Sie die Dateiendung ohne Punkt ein!

Absolut genialer Befehl. Mit set /p erstellen Sie eine Variable Namens ende. Der Text hinter dem Gleichheitszeichen bleibt der dichterischen Freiheit überlassen und sollte kurz, präzise und Zielführend sein! Dasselbe gilt natürlich auch für den Variablennamen. Die Batch bekommt den Inhalt der Variablen ende durch eine Eingabe des Users - z. B. pdf. Diese Abfrage findet also an selber Stelle statt.

set /p quelle=Geben Sie den Pfad des Quellverzeichnisses ein!

 
Wir definieren eine zweite Variable Namens quelle - hier muss der User den Pfad zum Ordner eingeben, z. B. C:\Users\Benutzername\Desktop\test
führt in den Ordner test auf dem Desktop! Vorsicht - ihr Benutzername ist natürlich anders und bei Benutzern mit Doppelnamen gilt noch eine Ausnahmeregel bei Ordnern auf dem Desktop:

--------------

Einschub

Der Desktop ist bekanntlich ein Unterverzeichnis vom Benutzerkonto mit dem Pfad (für Doppelnamen des Benutzerkontos): 
 
            C:\Users\zweistelliger Benutzerkontoname\Desktop

Die Variable %userprofile% entspricht diesem Pfad. Bei der Eingabe von dem  Pfad C:\Users\Manfred xxxxxx\Desktop\test\xxx.pdf bei der Abfrage erhalten Sie die Fehlermeldung: Der Pfad "C:\Users\Manfred xxxxxx\Desktop\vers\xxx.pdf wurde nicht gefunden" beim Versuch der Speicherung  eines Pfades zum PDF.

Lösung

Der Sternenhimmelstuermer bietet hier eine universelle Lösung an:  Gehen Sie im Explorer zu  c:users (Laufwerk C: - Benutzer). Dort öffnen Sie die Kommandozeile, in dem Sie auf leerer Fläche im Fenster mit rechter Maustaste bei gleichzeitigen Drücken der Großschreibtaste das Eigenschaftsmenü öffnen. Dort wählen Sie aus: Kommandozeile hier öffnen.

In die Kommandozeile geben Sie dir /x ein

Nun können Sie in der Auflistung sehen, welcher Name des Ordners auf DOS-Ebene vergeben wurde. Beim Sternenhimmelstuermer z. B. MANFRE~1.
Das steht für den Doppelnamen Manfred xxxxxx.

Das Schema ist eigentlich immer dasselbe: Sechs Zeichen und Tildezeichen und 1. Das kann natürlich leicht varieren, wenn z. B. zweimal Ordner existieren , die mehr als sechs Zeichen haben und gleich sind oder die Leerzeichen schon nach drei Buchstaben gesetzt sind. Deshalb immer zur Sicherheit nochmal nachfragen.

Danach können Sie dann den Pfad bei der Angabe des Pfades anpassen, also hier als Beispiel: C:\Users\MANFRE~1\Desktop\test\xxx.pdf
bei der Aufforderung zur Eingabe für ein PDF-Dokument.

Einschubende
------------

chcp 28591 > NUL

Dateinamen können ein ä, ü oder ö enthalten. Vor der Ausführung eines Abarbeitungsbefehls der Stapelverarbeitung empfiehlt sich dieser Befehl

for %%f in ("%quelle%\*.%ende%") do @echo %%f %%~ntf  >>atest.txt

Das ist ein Stapelverarbeitungsbefehl. Diese Zeile ist selbst für Profis interessant, gibt Sie doch sämtliche Angaben über die Datei Preis:
Dateipfad mit Name, Erstelldatum, Erstellzeit und Dateiname
Beispiel:

D:\Uni\Diplomarbeit\Dipl.pdf 21.12.2003 02:25 Dipl

Alles mit Leerzeichen sauber getrennt!!!

Doch fangen wir mal beim For %%F an. Dieses leitet eine Stapelverarbeitung ein. Was %%f ist, ist sogar der Stapelverarbeitungszeile zu diesem Zeitpunkt unbekannt - eben eine Variable.

Die befindet sich in dem Pfad, den wir als Variable übergeben haben und in einer Batch mit zwei Prozentzeichen umgeben haben %quelle%. Erinnern Sie sich an den set /p Befehl ? - richtig dieser Pfad wird nun verwendet.

Nach dem Backslash \ kommt als Wildcard ein Stern *. Der steht auch nur als Variable für alle Dateinamen, die die Endung .%ende% haben.

In unserem Beispielfall gaben wir pdf ein. Also würde im Beispielfall ein kompletter Pfad für die Batch stehen:

C:\Users\Benutzername\Desktop\test\*.pdf


Die Kommandozeile (cmd), die die Batch ausliest, weiß nun, was %%f  ist, nämlich alle PDF-Dateien im Quellverzeichnis.

Was soll Sie nun damit tun (do)? einfach alle %%f  ausgeben in der Form des Pfades %%f mit %%~ntf

Da ergibt sich die Frage, was dieses mysteriöse %%~ntf überhaupt bedeutet. Keine Sorge, dass weiß so richtig niemand im Internet, wie eine Recherche des Sternenhimmelstuermers ergab. Ist aber saueinfach!
 
%~n: expandiert den Dateinamen einer Datei
%~t: Datum und Zeit
%~f: zu einem vollständigen Dateinamen

Das Ganze können Sie auch beim Befehl call /? in der Hilfe nachlesen -:). Ja, das funktioniert auch mit echo in einer Stapelverarbeitungsdatei, was nichts weiter heißt, dass diese Angaben ausgegeben werden - und zwar in atest.txt. Das ist ein Textdokument, dass wir uns hilfsweise im selben Ordner, wo die Batch liegt, erstellen.

Alle Batchschreiber dürften indes dem Sternenhimmelstuermer megadankbar sein. Mit diesem Themenkomplex ist eine Abarbeitung sämtlicher Batchaufgaben möglich. Der Anfänger wird in den nächsten Zeilen verstehen...

Zwischenstand: Wir haben ein Textdokument mit sämtlichen Angaben von allen PDF`s (in unserem Beispiel) in einem Ordner erzeugt.

set /p ziel=Geben Sie den Pfad für des Zielverzeichnis ein!

Zur Entspannung eine neue Variable. Warum so abgehackt mitten in der Datei? Wir haben mit der Erstellung des Dokumentes erstmal alle Variablen angewendet. Jetzt geht es darum ein Zielverzeichnis zu finden und der Batch mitzuteilen, wohin die Dateien kopiert werden sollen!
Das wurde alles im Einzelnen schon erklärt - daher keine weiteren Ausführungen

set /p zeit=Geben Sie das Jahr vierstellig ein!

Dasselbe, nur als Ergänzung: vierstellig!

chcp 28591 > NUL

Wieder ä, ü oder ö sichern - für Deutsche ein muss!

FOR /F "Tokens=1,2,3,4" %%i in (atest.txt) do echo copy %%i %ziel%  >>%%l_%%j.log

Anhand dieser For - Stapelverarbeitung kann der Sternenhimmelstuermer nun demonstrieren, warum die Vorschleife mit %%~ntf so genial ist. Sie haben nun auf diese Daten nämlich mit weiteren For - Befehlen unbeschränkten Zugriff!

For /F. Schauen Sie doch mal in der Hilfe der cmd unter For /? nach. Das ist eine gute Gelegenheit dazu.

 "Tokens=1,2,3,4"steht auch in der Hilfe, wird hier aber ausgeführt. For hat eine Unmenge Optionen - eine heißt tokens. Jede Zeile in (atest.txt) wird in tokens eingeteilt.

In unserem Fall Tokens 1= kompletter Dateipfad Trennung (delims/Trennzeichen ist automatisch ein Leerzeichen, es sei denn es wird durch die Option delims ein anderes bestimmt, aber das ist eine andere Geschichte...) 2=Datum 3=Uhrzeit und 4= Dateiname.

Was wird jetzt mit den tokens gemacht?

Sie werden do echo - will sagen gib aus: copy %%i %ziel% Sie erkennen es richtig: copy ist an dieser Stelle kein Befehl, sondern wird als Text interpretiert, zusammen mit dem Zielpfad, der zuvor über den set /p Befehl vom User kopiert wurde. Dazu kommt %%i. Das ist von den vier tokens unser erster Dateipfad.

Das ganze wird als log-Datei ausgegeben mit dem Dateinemen L als dritter tokens und einen Unterstrich_mit dem Erstelldatum. Richtig, die tokens sind alphabetisch geordnet : %%i ist unser erster tokens, %%j der zweite tokens, %%k der dritte tokens und %%L der vierte tokens. Zwei Prozentzeichen, weil in einer Batchdatei eine Verdopplung besteht. Die können Sie nun an beliebiger Stelle verbraten, aber genauso gut den tokens 3 %%k eben weglassen. Die Variablen sind mit dem Abschnitt in jeder Zeile Verbunden. %%k würde in der zu erstellenden neuen Datei also immer die Uhrzeit sein, die wir aber nicht brauchen!

Das Ganze wird mit jeder Zeile von atest.txt gemacht, so dass eine Unmenge von Log-Dateien entstehen - Vielleicht mal wieder ein Beispiel:

Wir haben die Datei atest.txt, wo unbestritten vier Angaben einer Dokumentenart aus einem Ordner stehen. In diesem Beispielfall nehmen wir an, die Batch hätte nur eine Datei im Quellverzeichnis gefunden: D:\Uni\Diplomarbeit\Dipl.pdf 21.12.2003 02:25 Dipl 

Das ist jetzt ein wenig irreführend, da wir zuvor die Datei im Testordner auf dem Desktop verwendeten. Das war gut zur Erklärung der Doppelnamenproblematik, ist jetzt aber kürzer und zur Erklärung einfacher, dass wir annehmen, dass sei die Eingabe des Users für den Quellpfad und die Dateiendung ist pdf - wir sind doch flexibel...

In atest.txt würde unsere For /f  Stapelverarbeitungsdatei dementsprechend nur eine Zeile vorfinden - das reicht aus um daraus vier Abschnitte (tokens) zu machen.

Nach der Bearbeitung würde also eine Datei Namens Dipl_21.12.2003.log erstellt werden - mit folgendem Inhalt:

copy D:\Uni\Diplomarbeit\Dipl.pdf  und der von ihnen eingegebene Zielpfad.

Wir haben im Prinzip den Code einer Batchdatei erstellt, lagern ihn aber in einer Log-Datei mit Dateinamen und Datumsangabe aus. Der ausgeführte Code würde normalerweise das eine PDF kopieren.

Problem: Wir haben jetzt sämtliche PDF-Dateien ohne Berücksichtigung des Jahrgangs aus atest.txt und dementsprechend auch für alle PDF-Dateien eines jeden Jahrganges Log-Dateien mit dem o. a. Codeschnipsel. Die Selektion nach dem Jahrgang erfolgt aus didatischen Gründen später...

Vielleicht jetzt schon als Hinweis: im Beispiel würde die Datei  Dipl_21.12.2003.log heißen. Das Datum im Dateinamen kann nun prima verglichen werden. Würden wir hingegen die Datei nur mit dem Datum als Überschrift erstellen, besteht die Gefahr, dass mehrere Dateien dasselbe Erstelldatum haben, obwohl als Folge dann eigentlich nur derselbe Codeschnitzel unter dieser Datumszeile verbucht werden dürfte. Beim Sternenhimmelstuermer kam es da zu Unstimmigkeiten - er entschied sich für diese Variante.

del atest.txt

Erstmal ein wenig aufräumen. Wir brauchen atest.txt nicht mehr und löschen ihn deshalb. Das ist auch notwendig, weil wir im nächsten Schritt Textdokumente erstellen...

chcp 28591 > NUL

Kennen wir, wird nicht mehr erklärt.

xcopy %ziel%\*_**.**.%zeit%.log %ziel%\*.txt

Ziemlich einfacher Befehl. Xcopy kennt jeder - Syntax: Xcopy Quelle Ziel

Der Sternenhimmelstuermer macht daraus eine Stapelverarbeitungsdatei de luxe.

Xcopy
heißt: Kopiere die Datei mit dem Pfad, die der User als Variable für Ziel mit set /p eingab, aber eben nur Log-Dateien, die mit der Endung *_**.**.%zeit%.log  übereinstimmen.

Der erste Stern steht für einen beliebigen Namen. Der zweite und dritte Stern für den Monat und jetzt kommt der Hammer -  %zeit% steht für die vierstellige Jahreszahl, die der User eingab.

Jede Log-Datei eines Jahres wird also im Zielordner in ein Textdokument umgewandelt. Damit fand die Selektion der Dokumente eines Jahrgangs statt. Im Ordner liegen also unmengen an Log und Textdokumenten.

chcp 28591 > NUL


Das übliche...

for /f "TOKENS=*" %%a in ('dir *.txt /b') do type "%%a" >> ergebnis.bat


Das würde mit Copy natürlich auch gehen, aber der Sternenhimmelstuermer bleibt bei derselben Befehlsstruktur und führt den Befehl type ein...

 for /f "TOKENS=*" Diesmal setzen wir für Token den *, die cmd weiß, dass * irgendwie bearbeitet werden muss, also diesmal alle tokens... in sämtlichen Zeilen des Dokumentes.

%%a in ('dir *.txt /b') Aha, die Variable klein %%a  ist in allen aufgelisteten Textdokumenten (('dir *.txt /b')) im Ordner der Batch, der durch den Parameter dir /b  von allen Textdokumenten  ausgegeben wird wird. Der Parameter /b ist für die Ausgabe der reinen Auflistung der Dateien zuständig. *.txt  ist also wieder der Inhalt der Tokens... eben der gesamte *.

do type ist für die Übernahme des Inhaltes (%%a) zuständig - mit Zwischenzeilen. >>ergebnis.bat  >>: doppelt ,weil ansonsten sämtliche Inhalte überschrieben werden.

Das Ziel ist damit erreicht. Es wurde eine Batch mit Namen ergebnis.bat erstellt, die sich aus Textdateien generierte, die eine Selektion von allen Log-Dateien war, die aus einem zuvor gelöschten Textdokument (atest.txt) stammten, dass mit Hilfe einer Stapelverabreitungsdatei erstellt wurde, die auf Eingaben des Users beruhten.

Das Ganze läßt sich also in einem Satz erklären...kann also nicht so kompliziert sein...

Ach ja, Profis werden es erkannt haben, ein einfacher copy oder xcopy - Befehl hätte auch gereicht, um die Befehlssätze in den Textdateien in eine Batch zu bringen - lasst den Sternenhimmelstuermer mal auch seinen Spaß!

In der Ergebinsbatch sind dann die einzelnen Codeschnipsel für das Kopieren - in jeder Zeile die Kopieraktion für ein Dokument, also in unserem Beispiel die Zeile copy D:\Uni\Diplomarbeit\Dipl.pdf  und der von ihnen eingegebene Zielpfad,

nach der altbekannten Syntax copy Quellverzeichnis Zielverzeichnis

Nur eben bei Ihnen ein paar Zeilen mehr, je nach Größe des Quellverzeichnisses. Ob Sie dann durch Doppelklick die Datei ausführen, bleibt Ihnen überlassen. Bisher wurde noch keine Datei irgendwie verschoben.

Dasselbe Spiel kann man nun mit Befehlen wie move oder del machen, aber da der Sternenhimmelstuermer da so seine bedenken hat, hier eine harmlose Variante.

del *.log

Danach ein wenig aufräumen. Die Logdateien werden sämtlich gelöscht...Der Stern steht für alle *.log Dateien

del *.txt

genau wie die Textdateien

Die Sternenhimmelstuermerhomepage arbeitet wie gesagt auf der Metaebene, der Weg ist das Ziel. Durch Anpassung des Codes sind mal wieder unzählige Varianten möglich. Deshalb wurden auch jede Menge Variablen erzeugt. Spielen Sie mit dem Code.

Für den Sternenhimmelstuermer ist damit diese Abhandlung abgeschlossen.

Fazit:

Das war eine schwierige Abhandlung mit neuen Erkenntnissen und die Kombiation %%f %%~ntf  ist mal wieder ziemlich selten - im Netz scheinbar noch nicht bekannt. Damit hat der Sternenhimmelstuermer sein Versprechen mehr als gehalten. War wirklich diesmal eine schwere Geburt...


Diese Abhandlungen könnten Sie auch interessieren;

KI 1 - switchbatch

KI 2 - Lernbatch


Impressum
Datenschutz