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