Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Trickreiches DOS-Bachfile-Problem...

Mdl / 3 Antworten / Baumansicht Nickles

Angenommen ich habe in DOS eine Env-Variablen a, die auf eine andere Env-Variable verweist.
  
Wie kann ich mir den Inhalt von der Variable anzeigen lassen, auf die a verweist?


Bsp:   
  set a=b
  set b=c  
  echo  a verweist auf die Variable %a%, deren Inhalt ??? ist.

  Ich suche jetzt den entsprechenden Ausdruck für den Platzhalter ???, der für alle Belegungen von a funktioniert

  Die korrekte Ausgabe im obigen Bsp wäre dann:
    a verweist auf die Variable b, deren Inhalt c ist. 
 
    In dem Ausdruck darf als Variable natürlich nur 'a' vorkommen, da erst zur Laufzeit bekannt ist, was 'a' nun wirklich beinhaltet.  
.

Hoffe, ich habe es halbwegs verständlich ausgedrückt...

Viele Grüße,
Mdl

bei Antwort benachrichtigen
Andreas42 Mdl „Trickreiches DOS-Bachfile-Problem...“
Optionen

Hi!

Ich bin der Meinung, dass das so nicht geht, weil der Batchprozessor keine echten Referenzen bzw. Zeigervariablen kennt (und das würdest hier benötigen).

set x=wert

ist gedacht, um der Variablen x einen Wert zu zu weisen. Dabei kann der Wert durch einen Ausdruck festgelegt werden, der selbst wieder Werte von Variablen enthalten kann. Dabei kann man aber keine Referenz auf eine andere Variable übergeben.

IMHO ist der Batchprozessor da nicht sonderlich intelligent: da wird jede aktuelle Zeile in zwei Schritten bearbeitet. Im ersten werden die Variablen durch ihre aktuellen Werte ersetzt. Im zweiten wird wird dann das Ergebnis einfach nur vom Commandoprozessor ausgeführt.

Ist das eine reine Theoriefrage oder hat die Sache einen praktischen Hintergrund?

Falls das für eine batchgesteuerte Parameterübergabe an einen Befehl oder Programm benötigt wird, ist oft die einfachste Lösung, in einem Hauptbatch einen zweiten als Datei zu erzeugen und dann als Unterbatch aufzurufen.

Abhängig von der DOS-Version bzw. des verwendeten Batchprozessors (bei Windows) kann es durchaus auch andere Lösungen geben, wenn da eine Praxisaufgabe dahinter steht.

Bis dann
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
Borlander Mdl „Trickreiches DOS-Bachfile-Problem...“
Optionen

Wie schon von Andreas aufgeführt: Mit mehr Details lässt sich evtl. eine elegantere Lösung finden.

Ansonsten scheint mir folgendes Möglich:
Mit dem Inhalt der Variable a eine zweite Batch-Datei erzeugen. Diese kann dann den Wert der in a referenzierten Variable ausgeben. Diese zweite Batch-Datei muss dann aus der ersten ausgegeben werden.

Richtig schön ist das nicht ;-)

Gruß
Borlander

bei Antwort benachrichtigen
Mdl Borlander „Wie schon von Andreas aufgeführt: Mit mehr Details lässt...“
Optionen

Hallo Andreas42,
Hallo Borlander,

danke für Eure Antworten. 

Habe ein bißchen rumprobiert mit dem Batchfile-Erzeugen - ich hatte gehofft, dass es auch ohne geht - und nach etwas Herumprobieren hab ich diesmal auch wirklich 'ne Lösung gefunden, die rein auf Batchfile und nicht Mitzuhilfenahme anderer Hilfen (wie z.B. einem Exe-File, das dem Bachfile die Lösung bereitstellt).

Hier ist sie:

set a=b
set b=c  

echo >delme.bat set a_ref=%%%a%%%
call delme.bat
del delme.bat

echo a verweist auf die Variable %a%, deren Inhalt %a_ref% ist   

Die Belegungen im ersten Block können natürlich nach Belieben geändert werden.
Der zweite Block erzeugt eine Batchdatei, die dann ausgeführt (und wieder gelöscht wird).
  Dabei fungiert das erste % als Escape-Char für das zweite %.
  Im erzeugten Batchfile steht dann set a_ref=%b%    
Die dritte ist die gewünschte Ausgabe.

Im Grunde ist natürlich nicht eine Textausgabe das Ziel, sondern die Möglichkeit den Inhalt des Inhaltes einer Variablen weiter verwenden zu können. Dies geht dann wie oben gezeigt mit der Definition einer neuen Set-Variablen.    

Noch tiefere Dereferenzierungen sind damit natürlich analog möglich.

 ~~~~~~~~


Ach ja. Die Frage hatte durchaus einen praktischen Bezug. Meine Erfahrung ist aber, dass sobald dieser auch nur ansatzweise erwähnt wird, sich alle Antworten auf diesen beziehen und einem nachher der Kopf nur so schwirrt von den vielen mehr oder weniger hilfreichen Lösungen ;-)

Mir persönlich sind Fragen, die ein Problem auf den Punkt bringen auch lieber...

Habe noch ein/zwei DOS-Kniffelein im Hinterkopf. Wenn ich da wieder darüber stolpere gibt's mehr...


Viele Grüße,
Mdl  


bei Antwort benachrichtigen