Javascript

Für den Anfang mach JavaScript Sinn.

Du brauchst keine Entwicklungsumgebung und jeder Browser ist zum Ausführen geeignet.

Der Umstieg auf C-Sprache und Java ist duch die verwante Syntax eher unproblematisch.

Python mag zwar den Einstieg leicht machen, mit seiner "Fragwürdigen" Syntax dürfte der Umstieg jedoch einige Probleme bereiten.

Ich persönlich kann eine Sprache, denen Funktionalität von der Formatierung des Quellcodes abhängig ist, nicht für Voll nehmen.

In C-Sprachen wird zwar auch eingerückt und hübsch formatiert, aber man darf auch mal "sündigen" ohne ohne dadurch Schleifen ihrer Funktionalität zu berauben.

Der Einstieg über JavaScript ist durch die automatische Typisierung von Variablen sehr einfach. Das kann einem Programmierer beim Umstieg auf C/Java erstmal auf die Füße fallen. Den Unterschied diesbezüglich bekommt man jedoch recht schnell "beigebracht".

...zur Antwort

Der freie Speicherplatz besagt nicht über die Verteilung der Daten auf dem Datenträger. Dies können recht willkürlich und mit großen Lücken dazwischen verteilt sein.

Windowseigene Programme geben in der Regel auf, wenn eine Datei am Ende der Partition liegt. Da könnte eine Defragmentierung vor der Verkleinerung helfen

Tools wie Minitools Partiotion Wizard schaffen sich ggf den nötigen Platz, indem Sie zuvor solche Vagabunden umplatzieren.

https://de.minitool.com/partition-manager/-wizard-startseite.html

...zur Antwort

Ich kenne deine Tomate zwar nicht, aber habe zumindest etwas Basiswissen über Genetik.

Es gibt dominate und rezesive Gene und einige Eigenschaften, welche eine oder mehrere Generationen überspringen können.

Letztere werden nie direkt auf die Kinder übertragen sind aber bei der Enkelgeneration wieder dominant.

Bei getrennten Geschlechtern werden einige Eigenschaften nur in der weiblichen Linie vererbt, andere nur männlich. Wieder andere sind nur beim weiblichen/männlichen Part verankert treten jedoch nur beim Vererbung auf das entgegengesetzte Geschlecht in Erscheinung. (Die Anlage auf Bluterkrankheit wird nur von Frauen auf Frauen vererbt, aber Frauen können nicht an dieser erkranken (rezesiv). Bei männlichen Nachkommen ist das Gen jedoch aktiv dominant und kommt zum Ausbruch. Ein betroffener Mann kann das gen jedoch nicht an Nachkommen weitergeben. )

Genetik ist eine ziemlich verrückte Angelegenheit.

Was Deine Tomatenzucht angeht kommen zur puren Frage, was wie vererbt wird, noch "hygiënische" Aspekte hinzu.

Das soll nicht heisen, dass es bei Dir Schmutzig ist, sondern sondern betrifft die Abschirmung vor unerwünschten Erbgut.

In der Haus- und Gartenzucht werden Pollen ziemlich unkontrolliert übertragen. Da genügt schon eine andere dominante Sorte in der Nachbarschaft und einige "zu" fleißige Insekten und schon geht es bei "Tomatens" ziemlich wüst, durch die Erbmasse...🥰🥰🥰🥰🥰🤔.

Dann gibt es auch noch die Sache mit den F1-Hybriden, welche nicht in jedem Fall jede Eigenschaft weitergegeben.

  • https://www.transgen.de/lexikon/1797.dominant-rezessiv.html
  • https://www.derkleinegarten.de/nutzgarten-kleingarten/saatzucht-und-vermehrung/f1-hybriden-definition.html
  • https://heimbiotop.de/F1-Hybriden.html

Hobbyzucht hat oft mehr etwas von Lotterie, als von zielgerichteter Selektion. Ich habe jahrelang mit Chili und Weinhefen herumgespielt. Die Ergebnisse waren oft überraschend oder abenteuerlich, aber Spannend.

Wenn deine diesjährigen Pflanzen eher schlecht aussahen, so leidest Du mit vielen "nordischen" Gärtnern. Es war klimatisch kein Tomatenjahr (zu kühl,viel zu feucht und zu wenig Licht. Dafür fühlte sich die Tomatenfäule pudelwohl😫😭 ) .

...zur Antwort

Pfade , welche Leer-/Sonderzeichenzeichen enthalten müssen in "Gänsefüßchen" gesetzt werden!

Darüber hinaus sollte für Batch

folgende Syntax verwendet werden:

start "" ProgrammName " "Parameter"

Das "" nach start steht für einen nicht genutzten Fenstertitel.

Wenn die Dateiendung .xlsx standardmäßig mit Exel (oder einer kompatiblen Anwendung wie OpenOffice, etc.)verknüpft ist, brauchst Du den Programmnamen nicht angeben. dann genügt:

start "" "D:\McAffe312\HaushaltsBuch Übersicht\Haushaltsbuch.xlsx"
  • https://ss64.com/nt/start.html
...zur Antwort

Welch Schleifenmonstrum . 😅

Du hast eine Denkfehler. Du musst Dich in der Methode/Funktion nicht um einzelne Elemente des Arrays kümmern.

Das Array-Object verfügt über die Nötigen Eigenschaften und Methoden um alle nötige zu erledigen, ohne auch nur eine Schleife zu benutzen .

Dein Funktion ist unflexibel. Eigentlich muss ihr doch nur übergeben werden, was eine kleine Straße , oder ein Pasch usw. ist .

Dabei ist die Lösung ganz einfach.

  • wir übergeben das Array gewürfelter Werte und das Muster für einer Straße an die Funktion
  • als erstes werden die im Array gespeicherten Werte sortiert (optional)
  • das Array wird zu einem String gejoined (ohne Delimiter)
  • vergleichen unseren String mit dem Muster und übergeben das Ergebnis
    public static bool IstWurfEin(int[] Wurf,string Muster) {
        Array.Sort(Wurf);  //sortiere die Würfel
        string WurfString = string.Join("",Wurf);  //wandle das Array in einen String
        Match m = Regex.Match(WurfString,Muster);  //vergleiche String mit dem Muster
        return (m.Success) ;
    }

Die Funktion muss sich nicht darum Kümmern, wie viele Würfel im Spiel (ginge auch mit 2, wie bei Mäx). Sie muss nur feststellen ob eine Muster im Wurf enthalten ist.

Das ganze in Aktion:

using System;
using System.Text.RegularExpressions;
class Prog{
    
    public static bool IstWurfEin(int[] Wurf,string Muster) {
        Array.Sort(Wurf);  //sortiere die Würfel
        string WurfString = string.Join("",Wurf);  //wandle das Array in einen String
        Match m = Regex.Match(WurfString,Muster);  //vergleiche String mit dem Muster
        return (m.Success) ;
    }
    
    public static void Main(string[] args){
        int[] Wuerfel = new int[6];
        //definiere:
        string KleineStrasse = "1234|2345"; //ein RegExPattern mehrere Variationen werden durch | getrennt
        string Viererpasch = "1111|2222|3333|4444|5555";  //es  gibt dafür einen kürzeren Pattern aber so its  lesbarer 
        //usw.
        
        var rand = new Random();
        for (int i = 0; i < Wuerfel.Length; i++){  //
            Wuerfel[i] = rand.Next(1, 7);
        }
          //zum Testen ohne Zufall
        //Wuerfel = new int[] { 3,3,3,3,5 };
        //Wuerfel = new int[] { 2,3,4,6,5};
        
        Console.WriteLine("unsortiert : {0}",string.Join("  ",Wuerfel));
        Console.WriteLine("Haben wir eine kleine Straße? {0}",IstWurfEin(Wuerfel,KleineStrasse));
        Console.WriteLine("Haben wir ein  Viererpasch  ? {0}",IstWurfEin(Wuerfel,Viererpasch));
        Console.ReadKey();
    }
}

Ein wenig muss auch noch für Dich übrig bleiben...

  • https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/arrays/
  • https://docs.microsoft.com/de-de/dotnet/standard/base-types/regular-expression-language-quick-reference
  • https://docs.microsoft.com/de-de/dotnet/api/system.string.format?view=net-5.0
...zur Antwort

Erstmal solltest Du Dich fragen warum Windows dies tut...🤔

Ja ich bekomme auch gelegentlich eine solche Meldung zu sehen, auch bei Selbst geschriebenen Programmen. Da weiß ich in der Regel auch warum dies so ist. Ich könnte dann eine Ausnahme einrichten. Besser ist es eine saubere Alternative zu finden, welche dieses Manko nicht hat. Es wäre lästig jedem Nutzer zu erklären, das es sich um einen Fehlalarm handelt.

Kommt bei einem fremden Programm eine Blockade, ist das Grund genug es nicht oder nur in der Sandbox zu starten!

...zur Antwort
Nein

Sorry,

Ich hatte mich verklickt, Ich habe Monsterdaumen😅, Hufe...

Natürlich

Ja, ...und auch den Erwachsenen.

Erklärung:

Ich bin in dem von mir standardmäßig genutzten Konto auf meinen Rechnern nicht mal Administrator. Das muss ich auch nicht.

Alle normalen Alltagssachen lassen sich ohne Adminrechte erledigen. Mein Adminkonto ist mit Passwort ausgestattet. Wenn die Anfrage eines Programms nach zusätzlichen Rechten erscheint geht es nicht, einfach hirnlos "ok erlauben" zu klicken. Die Eingabe des Passworts ist lästig und soll es sein , aber fordert vom Hirn Extraaufmerksamkeit um sich bewusst mit dem "warum" braucht dieses Programm Zugriff auf besonders geschütze Bereiche des Systems?

Das Passwort soll nicht meine Daten und Dokumente vor fremden Augen oder Händen schützen (mein Arbeitskonto ist nichtmal Passwortgeschützt). Es soll mein System vor Unüberlegtheiten schützen.

Ich bin Programmierer im Ruhestand und mein Hobby sind Programme und Scripte im Grenzbereich der Machbarkeit. Da kann es durchaus passieren, das etwas nicht wie erwartet läuft und plötzlich ein Zugriff auf Bereiche erfolgt, welche nicht unbedingt verändert werden sollten. Nebenbei mal eine Adminanfrage mit einem Klick zu bestätigen wäre fatal. Aber das Passwort ist (Be)Denkzeit...🧐😖😇

Mit einem Adminkonto für Deine Kinder tust Du Deinem System keinen Gefallen. Die meisten Programme lassen sich heute auch ohne Rechte in einen Nutzerordner installieren.

Richte ein passwortgesichertes Nutzerkonto für alle ein und entziehe allen täglich genutzten Konten die Rechte (auch dem Eigenen) . So kann dem System auch versehentlich nicht passieren selbst wenn der Virenscanner versagt. Technisch gesehen kann keine durchschnittliche Schadsoftware nichts am System verändern. Dies passiert erst wenn man jemand mit Adminrechten achtlos ok klickt.

Überlege mal wie selten Du als ganz normaler Computernutzer um Adminbestädigung gefragt wirst ? Selbst Leute wie ich werden unter normalen Umständen vielleicht 1..2 mal im Monat gefragt.

Admin soll nicht die Kinder "Aussperren", sondern Software welche diese "ausprobieren" daran hintern Schaden anzurichten.

Selbst in Firmen ist das "bequeme" Ich darf überall hin Adminkonto Ursache für Virenbefall. Das meiste Gejammer über Schäden und verschlüsselte Rechner ist selten auf die Klevernes der Viren-Programmierer zurückzuführen, sondern auf Bequemlichkeit gepaart mit Blödheit seitens der Mitarbeiter. (Ich hatte in 35 Jahren nur 2 mal ernsthafte Viren auf meinen Rechnern)

Im übrigen kann man gemeinsam genutzten Ordnern in Eigenschaften >Tab "Sicherheit"> "Benutzer Vollzugriff" gestatten.

...zur Antwort
wenn man mit 2 Fingern auf der PC Maus ist und dann nach runters geholt

ähmmm... Ägypten?

Ich lese Deine Worte, aber deren Sinn entgeht mir...

Ich bin gewöhnlich sogar mit 3 Fingern auf der Maus (ohne irgendwelche Tasten zu drücken) . Meinen Standardmaus kennt keine Funktion, welche mit 2 gedrückten Tasten ausgeführt wird,

Möglicherweise hast Du irgendeine "Supermaus" mit diversen Sonderfunktionen. Deshalb kann es sein das Du auf dem neuen System noch keine Spezialtreiber für diese Funktionalität installiert hast .

Ohne besondere Software sieht Windows auch eine Maus mit 20 Tasten als normale Standardmaus.

Ich nehme mal an, das der Fehler nicht bei Windows 11 liegt , sondern gerade diesen Text liest...😅

...zur Antwort

wenn man die Groß-Klein-schreibung der Variablenamen in deiner Funktion korrigiert, lässt sich die klasse auch compilieren und macht genau das was sie soll. (Namen sind in C# casesensitiv!)

Schau Dir mal Dein Groß-kLein Chaos an


using System;
class Prog{
  public static bool ueberFuenfzig (int Zahl){ 
    return 50<Zahl; 
  }
   
  public static void Main(string[] args){
    int MyZahl=50;
    Console.WriteLine( ueberFuenfzig(MyZahl) );
  }
}

kann es sein, das Dir beim compilieren der klasse ein Fehler unterlaufen ist und Du in dieser zuvor (in einer älteren Version) einen Integer übergeben hast?

Die Funktion kann keine Zahl zurückgeben!

Ich kann mir nur vorstellen, das eine dll-Leiche der Klasse, wegen des Fehlers einen Integer liefert?

...zur Antwort

Als (Ex)Admin verabscheue ich die Dinger und hatte extra Richtlinien einrichten müssen, welche nur den Anschluss eines bestimmten Hardware Vendors als Tastatur erlaubten.

egal....

Da Dein Stick lediglich Keycodes übermittelt, musst Du im Kopf (oder einem kleinen Programm/Script) lediglich die deutschen Tasten in ihre englische Entprechung übersetzen. (y=z , -=/ , *=? usw)

Eigendlich brauchst Du das auch nur für das erste Kommando. Folgender Einzeiler stellt mit Powershell die Tastatur auf English: für die CMD-Console

powershell Set-WinUserLanguageList -l  en-US,de-De,ru -f
  # ...zurück
powershell Set-WinUserLanguageList -l de-De,en-De,ru -f

(das ru habe ich nur drin gelassen weil ich es auf der Tastaturliste habe, wenn Du Schei* vorhast wird dir der Ausschluss irrelevanter Sprachen kein Kopferbrechen bereiten ).

...für Dein Script auf dem "Ducky" bedeutet das, lediglich die deutschen "-" in ihre amerikanische Entsprechung zu ändern: "/"

folgendes muss us englischen "Ducky" an eine deutsche Tastaturschnittstelle gesendet werden:

 powershell Set/WinUserLanguageList /l de/De,en/US,ru /f

Nach dem Umstellen kannst du englisch "senden"

Ich habe bewusst auf Schnickschnak wie das sichern der originalen Sprachliste verzichtet

normal sähe das in Powershell so aus:

$MyLangs=Get-WinUserLanguageList
Set-WinUserLanguageList -l  en-US -f
Read-Host "Gib was mit ,.?ßäöü ein "
  #und wieder auf Original zurück
Set-WinUserLanguageList -l  $MyLangs -f
Read-Host "Gib was mit ,.?ßäöü ein "


...zur Antwort

Jede Form von Rheuma ist erstmal, als "hyperaktives" Immunsystem anzusehen. Genau deshalb bekommst Du MTX und Cimzia (🤮ich habe die "Monsterpens" gehasst). Dieses soll die Aktivität der Immunabwehr senken.

Wie sich das einbringen von Fremdstoffen auf die Aktivität und Abwehrreaktionen ,bei Dir, auswirkt kann niemand vorhersagen. Jeder hat sein eigenes Rheuma. ...und man sollte nicht vergessen, das es sich auch gelegentlich neue Feinde aussucht. Heute ist ein Gelenk, in 10 Jahren vielleicht die Haut mit dem Tattoo oder ein Piercing und Du bekommst auch noch Psoriasis...

Keiner weiß was kommt...

Wäre ab, ob es ein nutzloses Bildchen in der Haut wert ist.

Ich, für meinen Teil, reagiere auf alles, was nicht von Natur aus zu meinem Körper gehört innerhalb weniger Stunden extrem heftig auf jeden "Eindringling". Selbst eine Flexüle entzündet sich innerhalb von 1..3 Stunden. Ein altes Zahnimplantat musste entfernt werden, weil es als "Feind" markiert wurde und mein Rheuma explodieren lies, obwohl der Körper schon Jahre damit friedlich gelebt hatte. Das Ding war raus und die Entzündungswerte gingen runter...

Ich würde Dir empfehlen, es nicht zu tun. Was nicht notwendig in den Körper "eingebaut" werden muss ist das Risiko nicht wert. Niemand weiß was der Rheumatikerkörper "morgen" als Feind ansieht ....

...zur Antwort

Erstmal eine falsche Syntax für set/p:

set /p /A FOLGENNUMM....

...kann nicht gehen. Es wird einen Variable Namens:

 /A FOLGENNUMMER=... angelegt.

...sollte man nicht tun. 😅 set erwartet maximal einen Schalter, /a oder /p aber nie beide nach dem Schalter beginnt die Zuweisung. Der Zuweisungsblock sollte in "Gänsefüßchen" gesetzt werden, das schützt vor unsichtbaren Leerzeichen und Steuerzeichen, welche plötzlich "kein text mehr sind ", im Code.

set "var=blah & Blubbb 2 <= 5 "

... ohne "Quote" Absturtz garantiert!

VariablenNamen als CamelCase sind besser lesbar. Kleingeschriebene Befehle und Schalter erleichtern die Untescheidung zu Variablen.

Dein Codepage geeiere Schaft es auch nicht dien "Let´s" zu schreiben. Windows verwendet einen UTF-8 Zeichensatz. Und kann nicht besonders viel mit den hornalten 8-Bit Zeichensätzen/Codepages anfangen. Und Batch ist auch hornalt... Alle Worarounds, welche im Netz kursieren kannst Du in die Tonne kloppen.

Setze die Codepage 65001 und deine Batch wird einigermaßen kompatibel mit der Moderne. Damit kannst du sogar Russisch schreiben oder eine armenische Datei öffnen.

Speicher Die Batch als UTF8 ohne BOM:

@echo off
 rem Codepage für UTF8
chcp 65001 >nul
set /p "FolgenNummer=Bitte geben sie die Folgennumer ein: "
set /p "FolgenTitel=Bitte geben sie einen Folgentitel ein: "
echo %FolgenTitel% >> "Let´s Play_%FolgenNummer%.mkv.txt"
pause

Ticks.Koma,Ausrufezeichen,Prozent,Dollar und andere unübliche Zeichen in Dateinamen sollte man unterlassen. Diese können recht unangenehm werden. (versuch mal auf eine Datei: 10%Rabat.text in Batch zuzugreifen... das geht, aber kann bei automatischen Abläufen ganz böse Ausgehen.

Bekomm die Datei mal mit eienr Batch weg, wenn Du keien Russische Tastatur hast.

chcp 65001 >nul
echo: >"Мажа.txt"

Stell Dir vor Du solltest mit einer falschen Codepage auf Deine Datei zugreifen Da reicht schon Powershell im normalen ami-Modus...

...zur Antwort

Powershell zeigt die die Informationen an, welche das Dateisystem bereitstellt. Diese Information gehören zu jeder Datei (Erstellt,Geändert, letzter Zugriff,Attribute ,Sicherheitsrichtlinien usw)

Word zeigt Dir wohl zusätzlich Daten, welche in der Worddatei selbst gespeichert sind. Das sind komplett verschiedene Sachen.

Wie diese Einträge manipuliert werden können, kann ich nicht sagen, da ich Word nicht nutze.

Der folgend link dürfte weiterhelfen. https://helpdeskgeek.com/office-tips/viewing-and-inserting-the-date-a-document-was-last-modified-in-a-word-document/

Datumsfelder werden etwa im letzten drittel behandelt.

...zur Antwort

Nein das geht nicht.

Du kannst [start]+x drücken und "Eingabeaufforderung (Admin...) wählen.

....Oder Du schreibst Dir ein kleines JavaScript und legst es wo es Dir gefällt ab. dann brachst Du nur draufklicken.

AdminCMD.js

new ActiveXObject("shell.application").ShellExecute('cmd','','','runas',4); 

das gleiche macht auch eine Batch:

AdminCMD.cmd

@echo off
echo new ActiveXObject^("shell.application"^).ShellExecute^('cmd','','','runas',4^); >"AdminCmd.js"
"AdminCmd.js"
...zur Antwort
Es funktioniert nun Vielen Dank!

naja... aber toll ineffizient

Da ist jemand über die Steuerzeichen von Batch gestolpert.

Batch ist nunmal keinen Sprache zum flexen, die wurde entwickelt um Adminaufgaben zu automatisieren. als die entwickelt wurd, konnte keienr Ahnen das Leute dmit Spaß haben wollen...

Daran liegt's:

In Batch haben die Zeichen |&<> ^ % " und bei delayedExpansion auch ! eine Steuerfunktion.

  • Die Redirection-Symbole <> dienen zur Umleitung eines Textes aus/in Dateien
  • Das Pipe-symbol | reicht die Ausgabe eiens Befehls an einen anderen Befehl weiter.
  • & dient zum Aneinanderreihen mehrerer Befehle in einer Zeile
  • ^ maskiert (escaped) obige Zeichen als Textzeichen
  • %var% %%x und !var! kennzeichnen Variablen

obige können ohne spezielle Maßnahmen (maskieren) nicht mit Echo ausgegeben werden.

  • " " kennzeichnet das was dazwischen steht als normalen String

Folgendes bringt eine Batch zum Absturz , weil diese Zeichen Unsinnige Aktionen auslösen (massiver Syntaxfehler)

echo | <> & blah und blub
">" kann syntaktisch an dieser Stelle nicht verarbeitet werden.

Die Lösungen sind in jedem Fall verzwickt:

Dies kann man verhindern indem man den Text in Quotes setzt.

echo " | <> & blah und blub"

...dann werden aber die "Quotes" mit ausgegeben.🤮

...oder man maskiert jedes dieser Zeichen einzeln:

echo ^| ^<^> ^&  ^^ blah und blub

Bei einzelnen Zeichen hinundwieder ist das ok, aber... viel Spaß bei einem Textlogo 🥵

 rem über einen for/f-Schleife in eien Laufvariable zu übergeben und diese im Schleifenrumpf an echo zu übergeben (Laufvariablen werden erst mit dem Befehl aufgelöst)
 for /f "delims=" %%a in ("ich bin ein Text mit | <> & ^ %% blubb") do (echo %%a)

...ein Haufen Schreibkram für eine Zeile, aber diese Lösung habe ich nicht umsonst gebracht, denn diese Schleife kann auch aus Text Dateien lesen und die Batch ist auch nur eine Textdatei.

In der folgenden Batch habe ich einfach mehrere Logos mit ::::begin logoname.logo und ::::End.logo:::: markiert und an das Ende der Batch angehängt so kann eine kleine Subroutine (:DrawASCIILogo) die Logos am Ende der Datei finden und ausgeben. Im Hauptbereich der Batch wird das gesamte Logo mit eineem Befehl call :DrawASCIILogo "logoname.logo" abgerufen. Keine Einzelnen echo-aufrufe mehr schreiben (einfach Einfügen wie sie der Logogenerator) liefert.

Mehr Effizienz kann man nicht erwarten... und der Laufvariable sind die Sonderzeichen völlig egal.

@echo off
chcp 65001 >nul &rem Umlaute richtig anzeigen

 rem rufe Subroutine auf , welche das Logo zeichent...
:menu
cls
call :DrawASCIILogo "Erzesel.Flower"
echo --------------
echo [G]otisch
echo [R]adioaktiv
echo [A]ufhören
echo --------------
 rem statt set/p besser fur Menüs "choice" verwenden, damit kann der nutzer nur die definierten Buchstaben/Zahlen auswählen !!!
choice /c GRA
if %errorlevel% equ 1 (
  echo:
  call :DrawASCIILogo "Erzesel.Gotic"
   rem darum darf auch kein nacktes & im echo stehen dahinter kommt ein Befehl...
  echo mit beliebiger Taste zurück zum Menü & pause>nul
  goto :menu
)
if %errorlevel% equ 2 (
  call :wasAnderes
  goto :menu
) else (
   rem für die letzte Option muß kein if definiert werden 
  echo ...und Tschüß!!
  timeout 3 >nul
  exit /b
)

exit /b  %=dises exit ist nur zur Sicherheit eigentlich springen alle Entscheidunen vorher weg=%
::hier ist der Hauptteil der Batch garrantiert zu Ende

 :::::: subroutine/bn :::::
:wasAnderes
echo:
 rem dreimal Beeb wärend die Batch weitermacht Missbrauch von choice damit du mal siehst wofür Steuerzeichen gut sind
start "" /b cmd /c "echo aaax|choice /c x>nul"
call :DrawASCIILogo "Radiation"
timeout 5 >nul
exit /b

:DrawASCIILogo
 rem finde die Anfangszeile des Bildes in dieser Batch
set "toSkip="
set "beginMark=::::Begin %~1.logo"
set "endMark=::::End.logo::::"
for /f "skip=2 tokens=1 delims=[]" %%a in ('find /n "%beginMark%" "%~f0"') do (set "toSkip=%%a")
if not defined toSkip (
  echo LogoMarker: "%beginMark%" nicht gefunden!
  exit /b 1
)
for /f "usebackq skip=%toSkip% tokens=* delims=" %%t in ("%~f0") do (
  if /i "%%~t"=="%endMark%" exit /b 0
  echo %%t
)
exit /b

Das was hier kommt gehört Quasi nicht mehr zur Batch. Hinter ein "exit /b" kommt der Interpreter nich ohne ein Goto oder Call 

::Logo(s) nach folgendem Muster kennzeichen:
::::Begin Erzesel.Flower.logo
  .-''-. .-------.   ____..--'  .-''-.   .-'''-.   .-''-.  .---.   
 .'_ _  \ | _ _  \  |    | .'_ _  \  / _   \ .'_ _  \  | ,_|   
 / ( ` )  '| ( ' ) |  |  .-' ' / ( ` )  ' (`' )/`--' / ( ` )  ',-./ )   
. (_ o _) ||(_ o _) /  |.-'.'  /. (_ o _) |(_ o _).  . (_ o _) |\ '_ '`)  
| (_,_)___|| (_,_).' __   /  _/ | (_,_)___| (_,_). '. | (_,_)___| > (_) )  
' \  .---.| |\ \ | | .'._( )_ ' \  .---..---. \ :' \  .---.( . .-'  
 \ `-'  /| | \ `'  /.' (_'o._) \ `-'  /\  `-' | \ `-'  / `-'`-'|___ 
 \    / | | \  / |  (_,_)| \    / \    /  \    /  |    \
  `'-..-' ''-'  `'-' |_________|  `'-..-'  `-...-'   `'-..-'  `--------`
::::End.logo::::

::::Begin Radiation.logo
           X XXXXXXXXXXXXX X
        X     XXXXXXXXXXX     X
      X        XXXXXXXXX        X
     X          XXXXXXX          X
    X            XXXXX            X
   X              XXX              X
   X               X               X
   XXXXXXXXXXXXXXX   XXXXXXXXXXXXXXX
    XXXXXXXXXXXXX     XXXXXXXXXXXXX
     XXXXXXXXXXX       XXXXXXXXXXX
      XXXXXXXXX         XXXXXXXXX
        XXXXXX           XXXXXX
          XXX             XXX
              X         X
                   X
::::End.logo::::

::::Begin Erzesel.Gotic.logo


 ,- _~,               ,, 
 (' /| /               || 
(( ||/= ,._-_ /\\ _-_  _-_, _-_ || 
(( ||  ||  / || \\ ||_. || \\ || 
 ( / |  ||  /\\ ||/  ~ || ||/  || 
 -____- \\,  || \\,/ ,-_- \\,/ \\ ipsum dolor sit ametsed cupiditat,
        /            consectetur adipisici elit,
in culpa qui  (, officia usmod tempor incidunt ut labore et dolore magna.
 Ut enim ad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquid ex ea commodi consequat.
 Quis aute iure reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint obcaecat non proident, 
sunt deserunt mollit anim id est laborum.
::::End.logo::::

wenn du richtig flexen willst , musst du schon etwas tiefer in die Kiste greifen....

https://www.gutefrage.net/home/thema/batch-trick/neue

oder so ein logo:

...zur Antwort

Ja da hast Du eine hübsche "leblose" Schachtel konstruier...🤣

Mir wäre es lieber gewesen, wenn Du statt Deines Bildchens den Code gepostet hättest. ...Aber nein es ist prima, wenn ich Zeit mit dem tippen einer Oberfläche vergeude... Ich habe ja sonst nichts zu tun...

egal...

Palladin007 hat das Warum nichts passiert bereits erklärt.

Ich erklär wie man es löst. Du kannst dem Textfeld den Output deines Programms direkt zuweißen, dann passiert solange nichts bis der Download oder was auch immer fertig ist und der braucht Zeit , den Powershell macht schon Eins nach dem Anderen.

Zeit ist das Stichwort, wir müssen über die Zeit verteilte Aktionen ausführen damit sich etwas in der GUI verändert. (wenn Du 18 Uhr einkaufen möchtest, starrst Du doch auch nicht ab Mittag permanent die Uhr an, sondern schaust in gewissen Abständen mal nach...

Und so muss das Dein Programm auch machen. Ich möchte jetzt nicht das komplette Eventhandling erklären. nur soviel, Du kannst für bestimmte Ereignisse eine Aktion definieren .

Was soll passieren , wenn die innere Uhr einen Tick macht, oder die Maus auf eien Button klickt.

Ich habe erstmal auf einen parallelen Thread verzichtet, damit du nachvollziehen kannst was ungefähr abläuft. Einen parallelen Thread haben wir eigentlich schon, die Systemuhr... und die Fragen wir in Abständen ab und ergänzen den Text im Fenster.

Ein Timer ruft alle 5 Sekunden die Aktion auf und auf Knopfdruck wird diese ebenfalls aufgerufen. die Aktionsroutine schreibt auch gleich mit ins Fenster, wer sie gerufen hat...

Function DoAction ($Eventquelle)
{
  $output = &{
    'Ereignisquelle: {0}' -f $Eventquelle
    'die Aktuell Zeit ist: {0}' -f (Get-Date -f "HH:mm:ss")
    $myDice = 1..6 | Get-Random
    'Deine Glueckszahl lautet : {0}' -f $myDice
    ''
  }|out-string
  $MyTextbox.Text += $output
  $MyTextbox.SelectionStart = $MyTextbox.Text.Length;
  $MyTextbox.ScrollToCaret()
}

Add-Type -a System.Windows.Forms

$MyTimer = New-Object System.Windows.Forms.Timer
 #Auslösezeit für Timerevent in Millisekunden  wäre Blödsinn)
$MyTimer.Interval = 5000
$MyTimer.Add_Tick({DoAction 'Timmy der Timer'}) #definiere die Aktion für einen Clickevent dieses Timmers ausgelöst wird
$MyTimer.Start()

[System.Windows.Forms.Application]::EnableVisualStyles()
$MyActionButton = New-Object 'System.Windows.Forms.Button'
$MyActionButton.Location = '10, 10'
$MyActionButton.Name = "MyActionButton"
$MyActionButton.Size = '200, 25'
$MyActionButton.TabIndex = 0
$MyActionButton.Text = "&zwischendurch abrufen"
$MyActionButton.UseVisualStyleBackColor = $true
$MyActionButton.Add_Click({DoAction 'Der bloede Knopf da oben'}) #definiere die Aktion für einen Clickevent dieses Buttons ausgelöst wird

$MyTextbox = New-Object 'System.Windows.Forms.TextBox'
$MyTextbox.Location = '12, 50'
$MyTextbox.Multiline = $true
$MyTextbox.Name = "MyTextbox"
$MyTextbox.Size = '470, 150'
$MyTextbox.Scrollbars = "Vertical"
$MyTextbox.TabIndex = 1

$Form = New-Object 'System.Windows.Forms.Form'
$Form.Size = '500, 250'
$Form.Controls.Add($MyActionButton)
$Form.Controls.Add($MyTextbox)
$Form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedDialog
$Form.Name = "Form"
$Form.Text = "Ich bin Glueckszeitsammler"
$Form.Add_Load({DoAction 'Einer muss anfangen'})
 # starte GUI
$Form.ShowDialog()

Den Output eines Programms in asynchron zu belauschen geht mit ganz wenigen Zeilen. Powershell hat dafür Jobs ...

Was in einem Job laufen soll ,läuft in der Regel ziemlich lange . Der Job stellt einen Buffer zur Verfügung, welchen man bei Bedarf leeren kann. (ein Briefkasten sozusagen) eine MiniDemo dazu:

$job = start-job -ScriptBlock {1..120|%{
        '{0}. Brief eingeworfen' -f $($_) 
        sleep 1
    }
}

while((get-job).state){
    'Jobstatus : ' + (get-job).state
    'ich  hole mal die Post aus dem Kasten'
    $output=Receive-Job -Job $job|out-string  #wir brachen nur jeweils die letzte Ausgabzeile, welche in den gesezten Zeitabständen verfügbar ist
    $output
    if (($output -eq '') -and ((get-job).state -eq 'Completed') ) {Remove-Job $job}
    sleep 3
}
' Da kommt nix mehr...'
pause

...und genauso machen wir es mit deinem Programm in einen parallelen Job verfrachten und die Aktionsroutine die Daten abholen lassen.

  # starte das Programm in einem parallelen Thread. (sonst wäre es nicht möglich in einer zeitlichen Abfolge die Ausgabe  "Stückenweise" an eine Variable, wie $MyTextbox.Text, zu übergeben)
  # das als Job ausgeführte Programm schreibt in einen Buffer, welcher mit "Receive-Job" bei jedem aufruf "leergelesen" wird.
$job = start-job  {."C:\Users\Erzesel Secure\Desktop\youtube-dl.exe" --output "testvideo" htt_usw.videoadresse |%{$_}2>$null}

Function DoAction () {
    $output = Receive-Job -Job $job |out-string #Daten aus der  Jobpipeline abholen      o
    $MyTextbox.Text += $output
    if (($output -eq '') -and ((get-job).state -eq 'Completed')) {
        Remove-Job $job;
        $MyTimer.Stop();
        $MyTextbox.Text += 'ich habe fertig...'|out-string
    }
    $MyTextbox.SelectionStart = $MyTextbox.Text.Length;
    $MyTextbox.ScrollToCaret()
}

Add-Type -a System.Windows.Forms

$MyTimer = New-Object System.Windows.Forms.Timer
  #Auslösezeit für Timerevent in Millisekunden
$MyTimer.Interval = 1000
$MyTimer.Add_Tick({DoAction}) #definiere die Aktion für einen Tickevent dieses Timers ausgelöst wird
$MyTimer.Start()

$MyTextbox = New-Object 'System.Windows.Forms.TextBox'
$MyTextbox.Name = "MyTextbox"
$MyTextbox.Location = '10, 20'
$MyTextbox.Size = '470, 170'
$MyTextbox.TabIndex = 1
$MyTextbox.Multiline = $true
$MyTextbox.WordWrap = $false;
$MyTextbox.Scrollbars = 'Both'

$Form = New-Object 'System.Windows.Forms.Form'
$Form.Name = "Form"
$Form.Size = '500, 250'
$Form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedDialog
$Form.Text = "My Downloade"
$Form.Controls.Add($MyTextbox)
$Form.Add_Load({DoAction}) #Was gleich nach dem Aufbau des Form-Objekts passieren soll

$Null=$Form.ShowDialog()

...trivial, wenn man weiß wie es geht...

das nächtste mal Code und keine Bilder!😏😉

Die videoadresse musst Du selber einsetzen... die wird von GF als video angezeigt .

...zur Antwort

Wenn man mal nicht nur auf Dein Spiel schaut, werden doch ständig , Sachen programmiert welche nach menschlichem Zeitempfinden parallel ablaufen. Ergo können sich auch 2 Spielfiguren gleichzeitig bewegen. Und C# unterscheidet sich im wesentlichen nicht von anderen Sprachen...

Vor 3 Wochen nanntest Du Deine Programmierkenntnisse noch "Semigut". Was immer Semi in Verbindung mit Gut bedeuten mag.... kurz daneben ist auch vorbei)

Das sollte dann auch bedeuten, das Du weißt wie man in einem Programm Dinge scheinbar gleichzeitig ablaufen lässt. Wie ein Eventhandler und Objekte funktionieren.

Ansonsten solltest Du wohl doch noch mal versuchen das "Semi" loszuwerden und Dich mit den Basics zu befassen.

...zur Antwort

so...

Ich habe mich mal drüber gebeugt.

Als erstes habe ich das Batchfenster Blau eingefärbt, damit es sich von der Console Deiner Batch unterscheidet. Damit solltest Du auch sehen, das mit Deiner Batch alles in Ordnung ist (auch ohne exit am Ende). Damit dürfte der schwarze Peter beim Entwickler Deiner App liegen.

Wie in meiner anderen Antwort erwähnt habe: ich nicht Deinen Laucher nicht.

Ich konnte ledigich mit einem gefakten Programm testen, welches die Konsole auch nicht von selbst abschaltet. Damit funktioniert mein Workaround.

Sollte (wieder erwarten) von vom Programm ein Name für die Console gesetzt werden, musst Du den Namen in der Titelzeile der Console als Fenstername in die Batch eintragen.

Ansonsten kannst Du irgendeinen beliebigen möglichst einzigartigen Fensternamen wählen , welcher der fremden Console angedichtet wird.

@echo off
color 1F
set "Fenstername=Vom_Esel_plattgemacht"
  rem Das geht nur wenn die Console der App keien eigenen Namen setzt!
start "%Fenstername%"  "C:\Program Files (x86)\Minecraft Launcher\MinecraftLauncher.exe"
 rem das ist ein recht fieser Einzeiler dieser minimiert Fenster (anhand des Fenstenamens) nach deren Start.
 rem wenn du am Ende der Powershellzeile "ShowWindow($hWnd,11)" in "ShowWindow($hWnd,0)" änderst, wird das Fenster komlett unsichtbar.
 rem Diese Option solltest Du jedoch nur wählen, wenn alles wie gewünscht  läuft
 rem Es gibt keine Möglichkeit ein so verstecktes Fenster wieder sichtbar zu machen!!!
 rem Ein Consolfenster von GUIapps sollte normalerweise durch den Enwickler innerhalb der App verborgen werden.
rem gegebenenfalls hier noch 1..2 Sekunden "timeout" einfügen falls das fenser zu lange zum Starten benötigt
powershell "$win32=Add-Type '[DllImport("""user32.dll""", CharSet = CharSet.Unicode)] public static extern IntPtr FindWindow(IntPtr sClassName, String sAppName);','[DllImport("""user32.dll""")] public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);' -name funcs -PassThru;$hWnd=$win32::FindWindow(0,'%Fenstername%');$win32::ShowWindow($hWnd,11)>$Null"


echo blaues fenster bleibt noch 8 Sekunden offen
timeout 8 >nul

Sollte das nicht klappen, wirst Du mit der Console des Lauchers leben müssen. Diese hat nichts mit Cmd zu tun, sondern ist die Basis einer jeden Consolanwendung.

...zur Antwort

Die Batch tut was sie soll und schließt.

Ich kenne Deinen Laucher leider nicht.

Ich habe eher den Verdacht, dass der Laucher "unsauber" programmiert ist.

Viele .Net Anwendungen starten mit einer Console, welche die eigentliche grafische Oberfläche startet. Gut programmierte Anwendungen verbergen dieses Consolfenster. ...Aber einige eben nicht😝.

Ich bin leider gerade Unterwegs und kann so nicht probieren, ob es möglich ist "von außen" das Problem zu beheben.

Normalerweise ist das die Aufgabe des Entwicklers.

...zur Antwort

Schneller als nahezu auf einmal, was eigentlich normal ist, geht es doch kaum.😏

@echo off
chcp 65001 >nul

echo gleich gehts los
rem mach irgendwas (hier einfach 3 sekunden pause)
timeout 3
rem schneller geht es nicht
echo Lorem ipsum dolor sit amet, consectetur adipisici elit,
echo sed eiusmod tempor incidunt ut labore et dolore magna aliqua.
echo Hallo Du da
echo Ut enim ad minim veniam,
echo quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat.
pause

Ich vermute mal, Du meinst sie sollen langsam ausgegeben werden.

Wenn etwas "gehackt" wird , hat das Programm zwischen jeder Ausgabe jede Menge andere Sachen zu tun. Ich weiß nicht was diese Batch tun könnte, also füge ich zwischen jeder Zeile eine Pause ein (timeout x).

Demo1.cmd

@echo off
chcp 65001 >nul

  rem normaler Text mit je 1Sec Verzögerung
echo hallo ich bin ein Text mit einer 1 Sekunde Pause...
timeout 1 >nul
echo ....zwischen den Zeilen ........
timeout 1 >nul
echo Das ist eine verdamt große Verzögerung
timeout 1 >nul
echo Das ist der Code Deiner Batch,
timeout 1 >nul
echo weil mir gerade nichts besseres einfällt
timeout 1 >nul

for /l %%a in (1,1,5) do (echo:) &rem 5 Leerzeilen ausgeben

  rem du kannst natürlich auch aus einer Datei lesen (in dieser Demo diese Batch %~f0)
for /f "usebackq delims=" %%a in ("%~f0") do (
    echo %%a
    timeout 1 >nul
)
pause

Eine Sekunde ist schon heftig, aber kürzere Intervalle hat Batch nicht zur Verfügung.

Wenn es darum geht einfach eine ungenaue kurze Verzögerung zu definieren genügt eine Schleife, welche nichts tut , als 1000e mal Nichts aufzurufen. (Beschäftigungstherapie für schnelle Rechner)

Demo2.cmd

@echo off
chcp 65001 >nul
color 0A
 rem definiere ein Macro für eine kürzere Verzögerung.
 rem "%delay%" gibt an wie oft die kleine Schleife Nichts Aufrufen soll. (beim Wert einfach probieren, was am besten passt. Hängt von der Geschwindigkeit der CPU ab)
set "delay=7000"
set "kleinePause1= for /l %%a in (1,1,%delay%) do (call )"
 
 rem normaler Text mit je einer kurzen Verzögerung
echo hallo ich bin ein Text mit kurzen Pausen...
%kleinePause1%
echo ....zwischen den Zeilen ........
%kleinePause1%
echo Das ist schon besser.
%kleinePause1%
echo mir ist noch immer nichts bessere eingefallen.
%kleinePause1%

for /l %%a in (1,1,3) do (echo:) 
 rem du kannst natürlich auch aus einer Datei lesen (in dieser Demo diese Batch %~f0)
for /f "usebackq delims=" %%a in ("%~f0") do (
  echo %%a
  %kleinePause1%
)
pause

Man kann das aber natürlich effektvoller gestalten. Ich hätte da mein uraltes "GostTyper"-Script. Das kommt dem Klische von "Hacken" wohl am nächsten.

An den Subroutinen solltes Du nur etwas verändern, wenn Du genau weißt was Du da tust. Ansonsten ist die Verwendungsweise wohl selbsterklärend...🤔

gosttyper1.cmd

@echo off
chcp 65001 >nul
setlocal enableDelayedExpansion
  rem erzeuge Backspace
for /f %%. in ('"echo prompt $H|cmd"') do set "BS=%%."
set count=0

set _delay=200
set _bdelay=500
set _ldelay=2000
:main
color 0A
 rem Achtung!!! ltype ist nich proof  bei "Gänsefüßchen" im text crasht die Routine
echo.
 rem                 "Text"                                       Verzögerungswert
call :gosttype "+++--------Du wurdest gehackt----------------+++" %_delay%
call :gosttype "+----------------------------------------------+" 100
echo:
call :gosttype "+Ich hoffe die Axt steckt nicht zu tief im Kopf+" %_ldelay%
call :gosttype "........................I......................." %_delay%
call :gosttype "......................like......................" %_bdelay%
call :gosttype "....................Scripting..................." %_bdelay%
echo:
call :gosttype "......Näää you müüühßen lääärnen.Scripting......" %_ldelay%
   rem mit 20mal call :gosttype . screiben, wären eine Übertreibung.
   rem Subrutinen in allen Ehren,  aber  das bekommt man mit normalem "echo . in einer kleinen schleife hin
for /l %%a in (1,1,20) do (echo .& for /l %%b in (1,1,%_bdelay%) do (call))
call :gosttype "Loading exit..." %_delay%
echo:
call :gosttype "+----------------------------------------------+" %_ldelay%
call :gosttype "+-------Systemerfolgreich kompostiert----------+" %_delay%
call :gosttype "         ...oder wie das heist?" 8000
call :gosttype "Exiting..." %_delay%
echo:
pause
:end_main
exit /b

:::::::::::  subroutines  ::::::::::::::

:gosttype  parameter: %1=Text  %2=Anzahl der  Warteschleifen zwische den Zeichen
set "line=%~1"
set "char=!line:~%count%,1!"
  rem Batch-Trick: Ausgabe ohne Linefeed mit set /p "= string"<nul
if "%char%" neq "" (
    <nul set /p "=.%BS%%char%"
) 
  rem verwende nie rem um nichts zu tun! Steht in einer Befehlskette irgendwo nach dem  rem blöderweise  eine Klammer oder ein anderes Steurzeichen , passieren unerwartete Dinge
  rem zudem ist (call) langsamer und der Loop braucht weniger durchläufe!
for /l %%b in (1,1,%~2) do (call )

if "%char%"=="" (
    echo:
    set "count=0"
    exit /b
)
set /a "count+=1"
goto :gosttype

...und man kann richtig fett auf die Kacke hauen (wenn man kann😁😎):

GostTyper_Multicolor.cmd

@echo off
chcp 65001 >nul
setlocal enableDelayedExpansion


call :initAnsi
call :initMacro


  rem Farbtabelle für den Regenbogen definieren
set "Regenbogen=,52,88,124,160,196,202,208,214,220,226,190,154,118,82,46,41,36,31,26,21,20,55,53,"
  rem Regenbogen Spiegeln (letzte Farbe zuerst) (auch Variablennamen unterliegen der Kreativität XD)
for %%a in (%Regenbogen%) do (set "negobnegeR=,%%a!negobnegeR!")


  rem mach nen Schmetteling draus
set "RegenbogenBfly=%Regenbogen%%negobnegeR%"


set "ShadesOfGray=237 238 239 240 241 242 243 244 245 246 247 248 249"
for %%a in (%ShadesOfGray%) do (set "notShadesOfGray=,%%a!notShadesOfGray%!")
  rem mach nen Schmetteling draus
set "SoGrayBfly=%ShadesOfGray%%notShadesOfGray%"
set "NightBlue=17"
set "OrangeWave=202 208 214 220 214 208"


  rem initilisiere für die angegebene Farbtabelle jeweils  ein Array mit den Escape seqenzen für 
  rem Hintergrund Fabtabelle.B und Vordergrund Fabtabelle.F
for %%a in (RegenbogenBfly , ShadesOfGray , SoGrayBfly , NightBlue , OrangeWave) do ( call :initANSI_ColorArray %%~a)
)




rem Aufruf:  verzögerung  FarbeTabelleB/F ode  =für Default  "Text  "
%#__gostType% 0 NightBlue.B         ".so geht man mit ""Gänsefüßchen"" & $$ um und ..."
%#__gostType% 0 NightBlue.B         "... so macht man ein   Ausrufezeichen $x  ....."
%#__gostType% 0 NightBlue.B         """..?.+.*.~.§.@.µ.€.|.<.>.&.=.$p.$x.$$..........."""
%#__gostType% 2000 OrangeWave.F     "...$$x=$x.,.$$p=$p.,.$$$=$$.,.""""="".................."
%#__gostType% 2000 OrangeWave.b     "...$$x=$x.,.$$p=$p.,.$$$=$$.,.""""="".................."
%#__gostType% 2000 =                "......................I......................."
%#__gostType% 2000 =                "....................like......................"
%#__gostType% 2000 =                "..................Scripting. ................."
%#__gostType% 0    RegenbogenBfly.B "......................I......................."
%#__gostType% 1000 RegenbogenBfly.B "....................like......................"
%#__gostType% 4000 RegenbogenBfly.B "..............Background Colors..............."
%#__gostType% 8000 SoGrayBfly.B     "..............    some Gray    ..............."
%#__gostType% 2000 RegenbogenBfly.F "......................I......................."
%#__gostType% 2000 RegenbogenBfly.F "....................like......................"
%#__gostType% 2000 RegenbogenBfly.F "..............Foreground Colors..............."
%#__gostType% 20000 ShadesOfGray.F  "..............    more Gray    ..............."






echo ende...
pause
exit /b


:::::: Helper Routines ::::::


:initANSI_ColorArray  %1 VarName Colortable
set ".cIndex=0"
for %%a in (!%1!) do (
      rem Arrays mit Farbsequenzen anlegen BackGround und ForeGround
    set "CArray.%1.F.!.cIndex!=%ESC%[38;5;%%am"
    set "CArray.%1.B.!.cIndex!=%ESC%[48;5;%%am"
    set /a ".cIndex+=1"
)
set "%1.F.cIndex=%.cIndex%"
set "%1.B.cIndex=%.cIndex%"
exit /b


:initMacro
  rem als estes  wird  der else-Zweig aufgelöst beim aufruf  des Macros  folgen die Argumente dem set argv=
  rem im zweiten Schritt wird argv aufgelöst und  die belegten Variablen getunnelt (wegen evt Sonderzeichen)
set #__gostType=for %%. in (1 2) do^
    if %%.==2 (^
        for /f "tokens=1,2*" %%a in ("^!argv^!") do (^
            set __StringToSplit=%%~c^&^
            call :draw __StringToSplit %%~a %%~b^
        )^
    ) else set argv=
exit /b




:initAnsi
  rem  prüfe  ob Escape-Sequenzen  erlaubt sind (Windows 10 v1903)
  rem nur der !!!DWord!!!-Wert ForceV2=0 deaktiviert, alles andere erlaubt Escapesequenzen (ansonsten scheinen ANSISequenzen inzwischen by default unterstützt zu werden)
for /f "tokens=3 delims=." %%a in ('ver') do (
    if %%a geq 18362 (reg query "HKCU\Console" /v "ForceV2"|find "REG_DWORD    0x0">nul && (
            echo Neue Consolenfunktionen  sind ausgeschaltet!) || goto :initAnsiVars
    ) else ( echo Benötige Windows 10 ab Version 1903)
)
timeout 5 >nul
exit /b
)
:initAnsiVars
  rem erzeuge ESC-Zeichen (ASCII 27)
for /f %%. in ('"echo prompt $E|cmd"') do set "ESC=%%."
  rem Cursormacros:
set "saveCursorPos=%ESC%7"
set "loadCursorPos=%ESC%8"
set "CursOff=%ESC%[?25l"
set "CursOn=%ESC%[?25h"


set "resetColor=%ESC%[0m"


  rem Cursor unsichtbar machen
echo %saveCursorPos%%CursOff%
exit /b


::::::  subroutines   :::::


:draw
set "lastColorIndex=-1
set "%~1=!%~1:""="!"
  rem Stringlänge-1 ermitteln
@(echo !%~1!)>"%temp%\%~n0.len"
for %%a in ("%temp%\%~n0.len?") do set /a "%~1.maxIndex=%%~za-3"
for /l %%. in (0,1,!%~1.maxIndex!) do (
    set Char=!char!!%~1:~%%.,1!
      rem kommt ein Platzhalter:
    if "!char!" neq "$" (
          rem für ein Ausrufezeichen?
        if /i "!char!"=="$X" set "char=^!"
        if /i "!char!"=="$P" set "char=%%"
        if    "!char!"=="$$" set "char=$"
        set /a "lastColorIndex+=1 , __cNr=lastColorIndex %% %3.cIndex" 2>nul
          rem Fabnummer in den als Laufvariable in den Arrayindex mogeln... (!array!index !! geht nicht)
        for %%. in ("!__cNr!") do (
            echo:%loadCursorPos%!CArray.%~3.%%~.!!char!%saveCursorPos%
        )
          rem Bremsschleife
        for /l %%. in (1,1,%~2)  do (call)
        set "char="
    )
)
echo:%resetColor%%saveCursorPos%
exit /b


...zur Antwort