clragon
Goto Top

Grosses Variablen Problem ( Batch)

Hey Leute.

Ich bin auf ein doofes problem gestossen als ich durch variablen loopen wollte, da ich mir die 20x schreibweise des gleichen codes und nicht variabel nicht antun wollte.
ich kann keine Wörter welche in einer Variable gespeichert sind als Variable benutzen, d.h. keine Variable zusammenstellen und diese Zusammenstellung als variable benutzen.

Beispiel code

Danke im vorraus,

- clragon

Content-Key: 319157

Url: https://administrator.de/contentid/319157

Ausgedruckt am: 02.10.2022 um 05:10 Uhr

Mitglied: 131301
131301 26.10.2016 aktualisiert um 13:13:01 Uhr
Goto Top
DelayedExpansion oder call set sind deine Freunde face-wink

Gruß
Mitglied: clragon
clragon 26.10.2016 aktualisiert um 13:09:39 Uhr
Goto Top
Danke, bringt mir aber nichts. Dies würde zwar VariableX1 ausgeben aber nicht ihren Inhalt.

Das echo der !worker! variable ist dann einfach "VariableX1"

Ich möchte aber den Inhalt der VariableX1 benutzen also müsste das Echo "bla" ausgeben
Mitglied: 131301
Lösung 131301 26.10.2016 aktualisiert um 13:12:22 Uhr
Goto Top
Nein, das löst sehr wohl zum Inhalt auf! Deswegen heißt es ja delayed expansion (verzögerte erweiterung!)

Siehst du hier

Beispiel:
Mitglied: rubberman
Lösung rubberman 26.10.2016 um 13:10:49 Uhr
Goto Top
Hallo clragon.

oder
Den ganzen anderen Hilfsvariablenkram brauchst du nicht.

Grüße
rubberman
Mitglied: clragon
clragon 26.10.2016 um 13:20:44 Uhr
Goto Top
oh, okey. Tut mir leid mein Fehler, Ich habe zuvor im Mainscript wohl etwas geändert und die variablen nicht angepasst, funktioniert Wunderbar!
Danke.
Mitglied: clragon
clragon 26.10.2016 um 13:23:02 Uhr
Goto Top
Aus Irgendeinem Grund hat bei mir nur die 2te Lösung funktioniert, aber das ist egal, das script ist grösser und hat enabledelayedexpansions immer standardmässig drin.
Danke auch dir für die Antwort
Mitglied: rubberman
rubberman 26.10.2016 um 13:49:43 Uhr
Goto Top
enabledelayedexpansions immer standardmässig drin
Wundere dich nicht über Clashes bei Stringliteralen mit Ausrufezeichen. Faustregel: Zuweisung einer Variablen mit ausgeschalteter verzögerter Erweiterung, Verarbeitung der Variablen mit eingeschalteter verzögerter Erweiterung. Nur bei Variablen mit numerischem Inhalt spielt das keine Rolle ...

Batch ist krank face-wink Versuch's mit einer anderen Sprache.

Grüße
rubberman
Mitglied: Endoro
Endoro 26.10.2016 um 13:53:18 Uhr
Goto Top
Hey,
Beispiel:

Gruß, Endoro
Mitglied: clragon
clragon 26.10.2016 aktualisiert um 14:01:51 Uhr
Goto Top
Batch ist krank Versuch's mit einer anderen Sprache.

Ich merks, leider. Edit: Egal! CHALLANGE!!11!!!111!!1

In was programmierst du denn so? hab ein bisschen C# schon angelernt, müsste nur endlich das Buch fertig lesen und dann könnte ich damit vieleicht auch mal beginnen.
Mitglied: rubberman
rubberman 26.10.2016 um 14:02:15 Uhr
Goto Top
Hallo Endoro,

ich weiß ja schon wo die Reise hingeht (Dave's colorPrint).
Die Zeichen werden allerdings falsch dargestellt. Hab noch nicht ergründet warum ...

Grüße
rubberman (aka aGerman)
Mitglied: rubberman
rubberman 26.10.2016 um 14:06:08 Uhr
Goto Top
Da mir Spiele, bunt und Grafik völlig egal sind (ich brauch nur die Funktionalität mit vernünftigem Zugriff auf die WinAPI und gute Performance), ist es C und ein bisschen C++.

Grüße
rubberman
Mitglied: Endoro
Endoro 26.10.2016 aktualisiert um 14:16:19 Uhr
Goto Top
Hallo @rubberman,
kann ich grad nicht testen auf dem iPhone. Batch ist natürlich nicht krank, sondern eine der letzten Herausforderungen in unserer langweiligen Zeit, in der Programmiersprachen (fast) immer das tun, was man erwartet face-smile

Gruß, Endoro
Mitglied: clragon
clragon 26.10.2016 aktualisiert um 14:20:13 Uhr
Goto Top
Nicht schlecht. Ehrlich. nur leider ist es immer noch zu langsam, um damit eine wirkliche Map darzustellen, da diese sich im bereich von etwa ~1 oder weniger neu schrieben müsste um ein gescheites movement darzustellen, um noch genauer zu sein, mit der aktuellen engine, im bereich von 56 code loops mit etwa 6 zeilen unkompliziertem file überprüfungs- code. Jedoch schon ein guter Ansatz, auch wenn die Zeichen weshalb auch immer, abgemurkts sind, mann Könnte dann noch einfach die max lines variable einbauen, und verschiedene Maps aus TXT's auslesen. Allerdings könnte es auch sein das man mit Graphics.exe den "Spieler" auf der X/Y achse bewegen kann und das Zeichen mittendrin überschreiben kann ohne alles neuzuschreiben, also ohne die Map neu zeichnen zu müssen, ich habs mir noch nicht angeschaut. Meine idee den code noch mehr zu optimieren wäre ein counter welche die g und b's stack, so das gleich ein ganzer stapel auf einmal geschrieben werden kann, was dann halt bei komplexeren map-teilen länger dauern würde aber einfachere Teile sehr viel einfacher und schneller darstellen könnte.
Mein aktueller Code: http://pastebin.com/jn0dJ9Nk
Mitglied: rubberman
rubberman 26.10.2016 um 14:32:18 Uhr
Goto Top
@Endoro
eine der letzten Herausforderungen
Joa, unter Missbrauch von Commands für Dinge für die sie nie gedacht waren und Ausnutzung jedwedem undefinierten Verhaltens. So lange das nur Spielerei ist, ist es OK ...

@clragon
nur leider ist es immer noch zu langsam
Wird auch nicht schneller.
Funktionsweise kurz erklärt:
FINDSTR ist keine Built-In Funktion der cmd.exe, sondern ein externes Tool (findstr.exe). Bei jedem Aufruf der Funktion muss also dieser externe Prozess geladen werden. Das dauert nun mal Äonen bei Hunderten von Aufrufen.
Es gibt allerdings etwa elfundneunzigeinhalb 3rd Party Tools für diesen Zweck im Net, weil jeder Zweite der eine Programmiersprache auf Windows lernt, sich irgendwann mal so ein Progrämmchen zusammengeschraubt hat.

Grüße
rubberman
Mitglied: clragon
clragon 26.10.2016 um 14:39:28 Uhr
Goto Top
optimieren wäre ein counter welche die g und b's stackt, so das gleich ein ganzer stapel auf einmal geschrieben werden kann

das würde weniger aufrufe erzeugen.

Und eventuell könnte man die color engine noch mehr spezifizieren das es schneller läuft...
Mitglied: rubberman
rubberman 26.10.2016 um 15:01:07 Uhr
Goto Top
das würde weniger aufrufe erzeugen.
Klar. Prüfe doch einfach in deiner Schleife, ob ein anderes Zeichen auftaucht.

Und eventuell könnte man die color engine noch mehr spezifizieren das es schneller läuft...
Nö. Wie oben schon geschrieben, ist es der Aufruf von findstr.exe, der dich ausbremst. Brauchst du aber, denn dessen Option /a malt deine Farben. Zum Verständnis hatte ich dir noch die paar Zeilen gepostet. Kannst dich gerne selbst daran versuchen. Wenn du meinst, dass der eine oder andere Spezialfall (\/". im String) nicht vorkommt, brauchst du ihn auch nicht zu behandeln.

Grüße
rubberman
Mitglied: clragon
clragon 26.10.2016 um 15:49:15 Uhr
Goto Top
Da mein Videospiel sowieso Zusatztools benutzen muss/wird, habe ich mir mal gedacht wie es denn damit Aussehen würde.
Nicht unbedingt zu schnell. aber wenn ich die map nicht bei jedem Movement neuschreiben muss, sondern den Cursor aka den player Farbpunkt bewegen kann, dann hab ich soeben die Ladezeit erheblich verkürzt.


ctext.exe <
Mitglied: rubberman
rubberman 26.10.2016 um 16:16:04 Uhr
Goto Top
Damit hast du aber noch keinen Fortschritt gemacht. Du rufst nach wie vor für jedes Zeichen einen neuen Prozess auf. Ich kenne das Tool, damit kannst du auch sinnvoller arbeiten.
ctext.exe "{1a}a b c {3a}d e f{\n}{1a}g h i {3a}j k l{07}{\n}"

Grüße
rubberman
Mitglied: clragon
clragon 26.10.2016 aktualisiert um 17:03:03 Uhr
Goto Top
Edit: Hups, ins englische verfallen.

Ich hab versucht eine Stack funktion einzuführen. Leider ist der output momentant durch ein Fehler einfach gar nichts.

Hab für debugzwecke die ganze map deaktiviert und nur ein paar einzelne zeichen ausgeben lassen.
Könntest du es dir mal anschauen?

PS: der letzte charakter wird nicht genommen, warum auch immer.

Mitglied: rubberman
rubberman 26.10.2016 um 17:44:37 Uhr
Goto Top
Du versuchst ja immer noch jedes Zeichen einzeln zu "kolorieren".
Bastel dir doch einfach das Argument für den ctext Aufruf zusammen und rufe das ding nur einmal pro Zeile auf
Mitglied: clragon
clragon 26.10.2016 aktualisiert um 17:54:33 Uhr
Goto Top
Ist cool, funkt aber nicht, da ctext.exe den Charakter nicht richtig anzeigt, weshalb man dieses mit echo oder auf Umwegen ausgeben muss...
Sowie brauche ich \n niemals, da ich die ganze Map auf einmal printen muss, da es sonst diese komischen Abstände zwischen den einzelnen Achsen gibt. Aber intressant wie unheimlich schnell das printen der ganzen Zeile auf einmal geht... O.o
Mitglied: rubberman
Lösung rubberman 26.10.2016 um 18:27:07 Uhr
Goto Top
da ctext.exe den Charakter nicht richtig anzeigt
Jaja, so sind die "Kommandozeilentoolentwickler". Schaffen es nicht ihre Programme vernünftig zu schreiben face-sad

Sowie brauche ich \n niemals
Dann schmeiß es raus face-wink
Mitglied: clragon
clragon 26.10.2016 um 18:36:21 Uhr
Goto Top
Dann schmeiß es raus
Hab ich schon.

Wow es funkt, auch wenn ich keine Ahnung habe wie du das hingekriegt hast und es mich echt intressieren würde aber,

Danke man!!! Du hast mir soeben erfolgreich geholfen einen schnellen und effizienten echten Batch Map drawer mit Farben zu erstellen.
Wer hätte gedacht das es so etwas jemals geben wird abgesehen von mir!

Ähm, Jetzt muss ich es nur noch hinkriegen, das es die Maps aus TXTs ausliest, das wird einfach, und dann ein Videospiel programmieren. Wenn ich irgendwie hinkomm damit, werde ich es dir auf jedenfall senden! face-wink

Nochmals Danke
Mitglied: rubberman
rubberman 26.10.2016 aktualisiert um 20:06:49 Uhr
Goto Top
und es mich echt intressieren würde
Darüber könnte man Bücher schreiben ^^
www.c-plusplus.net/forum/161855-full
Kurz: Da der Entwickler des Tools (der auch noch Microsoft MVP ist) nicht ändern kann, wie Windows mit Zeichen umgeht, hätte er es berücksichtigen müssen. Weil er es nicht getan hat, hab ich es gemacht, indem ich mit der Änderung der Codepage (CHCP) die Interpretation der ASCII Werte der Zeichen verändert habe.
Mitglied: clragon
clragon 27.10.2016 um 19:01:37 Uhr
Goto Top
Ich hab noch etwas weiter programmiert und bin dazu gekommen:


Es ist zwar jetzt wieder langsamer aber es Unterstützt jetzt einen Hintergrund sowie striped special characters.
Wenn du ne Idee hättest es nochmal zu Optimieren, wäre mir es eine Freude diese genauer anzuschauen.
Mitglied: rubberman
rubberman 27.10.2016 um 19:57:06 Uhr
Goto Top
Es ist zwar jetzt wieder langsamer
Dann schmeiße diese GOTO Loops raus und arbeite mit FOR /L. Die Zeilenlänge ist ja eh konstant. Und bis zu einer Länge von x (8191 Zeichen für die gesamte Kommandozeile) kannst du das Argument auch komplett für alle Zeilen zusammen basteln, bevor du ctext aufrufst.
Grüße
rubberman
Mitglied: clragon
clragon 27.10.2016 um 20:29:17 Uhr
Goto Top
Cool, ich wusste doch das mir das was bringen würde, nur...


Das ist die normale Map size. Offenbar überlastet es aber ctext.exe und es stürzt ab. Eine Idee wie man das verhindern könnte?
Mitglied: rubberman
rubberman 27.10.2016 um 21:11:08 Uhr
Goto Top
Dann musst du zumindest auf zeilenweise Aufrufe zurück rudern.
Mitglied: clragon
clragon 27.10.2016 um 21:18:01 Uhr
Goto Top
Also hätte ich ne Firma, würd ich dich sofort einstellen.

Unfassbar! Also Das mit dem ganzen Auf einmal war schon himmlisch schnell. Aber das hier geht genauso gut!

Wenn ich nicht so ein Emotionsloser Klotz wäre könnte ich dir jetzt noch mehr von Herzen danken. ähm.

Danke. Funktioniert g̶u̶t̶ Wundervoll.
Mitglied: rubberman
rubberman 27.10.2016 um 21:48:03 Uhr
Goto Top
Also hätte ich ne Firma, würd ich dich sofort einstellen.
*lach* Ich hab meine Karriere schon gemacht. Wenn du mal eine Firma hast, die sich mit der Verarbeitung hochpolymerer Werkstoffe befasst, sag bescheid face-wink

Selbst wenn mir jemand 'ne Tasse Kaffee für diese Batchspielchen angeboten hat, hab ich das bislang immer abgelehnt. Ich meine, es ist Batch ... da ist das einfach ungerechtfertigt. In Zeiten von PowerShell & Co. umso mehr ^^