In Batch-Script speichern

Palladin007

assimiliert
Ich hab mir mal überlegt, dass es besser wäre, wenn ein Batch-Script Informationen in Form von Variablen abspeichern kann.

Nicht als extra Datei, sondern in sich selber.

Im Internet hieß es immer, das geht nicht, oder ich hab keine Lösung online gefunden.

Und da hab ich selber versucht, das Problem zu lösen und bin nach einigem Probieren auf folgendes Programm gekommen:

Code:
@echo off

set marke=speicherstände

find "::%marke%" "Batch.bat" > nul

if not errorlevel 1 set gospeicher=j
if errorlevel 1 set gospeicher=n

goto %gospeicher%

:weiter
echo Nun wird das Programm beendet.
pause
exit


:n
echo Es sind keine Speicherstände gespeichert.
echo. >> "Batch.bat"
echo ::%marke% >> "Batch.bat"
echo :j  >> "Batch.bat"
echo echo Es wurden Speicherstände gespeichert. >> "Batch.bat"
echo goto weiter >> "Batch.bat"
goto weiter

Das ist noch ziemlich einfach, aber es testet meine Speicher-Idee

Es sucht nach einer Zeilen ::Speicherstände, die im Script selber keine Auswirkung hat.
Wenn sie gefunden wird, springt es per Sprungmarke darunter, sodass die gespeicherten Informationen abgerufen werden.
Und am Ende springt es dann dort hin, wo sie benötigt werden. Je nachdem, wie das Programm funktionieren soll.

Meine Version tut hier folgendes:
Wenn keine Speicherstände gefunden werden, dann schreibt es welche in die Datei.
Bei dem nächsten Start sind si dann da und werden bestätigt.


Das Programm ist an sich ziemlich einfach, man muss nur zwei Dinge genau beachten:
Die Zeile, die den Speicherstand markiert, darf nirgendwo zu finden sein. Aber Variablen sind erlaubt.
Deswegen hab ich es so gemacht:
Code:
set marke=speicherstände
find "::%marke%"

Auf diese Wiese wird nach ::speicherstände gesucht, es steht aber selber nicht im Programm.


Als zweites muss beachtet werden, dass IMMER mindestens eine lehre Zeile am Ende des Programmes steht. Sonst wird die erste Zeile vom Speicherstand hinter den letzten Befehl von vorher geschrieben und das gibt einen Fehler.






So, ich hoffe, ich kann mit meinem kleinen Programm helfen.

Damit könnte man z.B. einfache Spiele speichern lassen, Passwörter abspeichern und beim einloggen verwenden, oder ähnliche Dinge.


Gruß
Palladin007
 
Der Bereich, wo diese Variablen im Speicher abgelegt werden, nennt sich Environment (Umgebungsbereich) und die Variablen dementsprechend auch Environmentvariablen (Umgebungsvariablen). Mit dem Kommando set ohne Parameter in der Eingabeaufforderung wird der komplette Inhalt dieses Bereichs gelistet, den man auch uneingeschränkt für eigene Zwecke nutzen kann.

Parameter von set:
Code:
C:\>set /?
Anzeigen, Erzeugen, Ändern oder Löschen einer Umgebungsvariablen.

SET [/A /D /E /O /P /R Dateiname... /S /U /V /X] [Name[=][Wert ]]
        Datei  Eine oder mehrere Dateien enthalten Definitionen von Variablen
        /A(rithmetisch)                 /S(ystem Variablen)
        /D(efault Variablen)            /U(ser - Benutzervariablen)
        /E(nv - Umgebungsvariablen)     /V(olatile - Nicht beständige Variabl.)
        /R(ead - von Datei lesen)       /X (Variablenausschluß übersteuern)
        /P(ause)
Dabei gilt zu beachten, dass es mehrere solche Bereiche gibt:
  • das sog. Master-Environment, welches beim Start des Betriebssystems initialisiert wird,
  • und die Kopien davon, von denen jedem gestarteten Prozess/Programm eine mitgegeben wird.
Werden nun Variablen von oder in so einem Prozess (z.B. in der Eingabeaufforderung bzw. cmd.exe) gesetzt, geändert oder gelöscht, hat das nur Auswirkung auf das lokale Environment des jeweiligen Prozesses. Andere oder gar das Master-Environment werden davon nicht beeinflusst, was zur Folge hat, dass Änderungen nach der Beendigung des Prozesses wieder weg sind. Ist das unerwünscht und sollen diese Daten auch anderen Prozessen oder nach einem Neustart zur Verfügung stehen, muss man sie wiederum entweder in einer Datei oder der Registry ablegen.

Mit speziellen Kommandoprozessoren, wie z.B. Take Command (Console/LE), die die cmd.exe ersetzen und erweiterte Befehlssätze mitbringen, lassen sich u.a. auch die Variablen im Master-Environment bearbeiten.

Im Web findet man noch massenhaft gute Seiten zur Batch-Programmierung, hier nur ein kleiner Auszug:
Im Internet hieß es immer, das geht nicht, oder ich hab keine Lösung online gefunden.
Im den Links wird u.a. auch genau dies mit den Umgebungsvariablen beschrieben.


HTH und Gruß,
Norbert
 
Zuletzt bearbeitet:
Wenn ich die Variablen auf meinem PC speichere, dann sind sie ja an den PC gebunden.

Wenn ich das Programm dann also wo anders verwenden möchte, sind sie wieder weg.
Auf diese Art bleiben sie in der Datei erhalten und können jederzeit von überall und von allen Datein abgerufen werden.
Man muss mit call dann nur an die entsprechende Stelle springen und kann sie abrufen.
Mit einem kleinen Umweg mit Variablen könnt man dann auch verhindern, dass das Programm, wo die Daten gespeichert sind, wieder an den Anfang springt, da hinter jeder Daten-Gruppe ja ein goto-Befehl steht.


Und wenn das, was ich versucht habe, hier einzubauen, auch mit einam Programm geht, was cmd ersetzt, kann ich das Programm wieder nicht auf anderen PCs nutzen.


Ich möchte meine Programm alle so haben, dass sie völlig unabhängig von der Windows-Version arbeiten können.

Das gelingt mir nicht immer, besonders da es zu viele Unterschiede gibt, aber ich vermeide es deswegen, mir noch weitere Unterschiede, wie eben dein Programm Take Command (Console/LE) zu schaffen.
Denn sobald ich ein Programm mit diesen veränderten Bedingungen schreibe, wird es schwieriger, Fehler auf anderen Computern zu verhindern.
 
Das stimmt, zwar kannst du durchaus einen anderen Kommandoprozessor nutzen, darfst aber dann wegen der Kompatibilität nur die Standardbefehle und -parameter verwenden, zumindest für diejenigen Batchdateien, welche auf andere Rechner übertragen werden sollen. Der als Beispiel genannte Kommandoprozessor ist aber 100%ig abwärtskompatibel zur cmd.exe, sodass es da keine Probleme gibt, wenn man darauf achtet.

In den gezeigten Links über die Batch-Programmierung wird nur auf das eingegangen, was cmd.exe auch kann. Schau dir den Inhalt mal an, da ist das gut erklärt und es sind auch recht schöne und praktische Beispiele dabei.
 
Und damit ich keine Fehler mache und ein Programm zwar bei mir funktioniert und nicht wo anders, gewöhne ich mich gar nicht erst um, sondern knobel lieber an Fragen, wie man etwas umgehen kann.
Mir macht swas Spaß, anderen vieleicht nicht^^
Und ich weis noch, wie verzweifelt ich nach so einer Möglichkeit gesucht habe und niemand helfen konnte. Und für die Leute, die dann auch sowas suchen, hab ich das hier online gestellt.



Was die Links angeht:
Danke, aber die dort gezeigten Befehle kenn ich eigendlich schon.
Das, was ich gerne mal nicht hinbekomme, sind for-Schleifen und DInge, die ich nur selten brauche und deswegen noch nicht so gut kenne


Mein Problem ist hauptsächlich, dass es mir an Erfahrung mangelt. Ich hab das alles regelrecht im Sturm gelernt und Tag ein Tag aus irgendwelche Programm-Ideen geschrieben, egal, ob ich das überhaupt schon kannte, oder nicht^^
 
Oben