BATCH Text schnell ablaufen lassen?

1 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


Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Palladin007  20.04.2022, 09:55

Ach Du Heilige - Du hast echt zu viel Zeit :D

Ich hab ab der Hälfte abgebrochen, aber ich mag dein:

(Beschäftigungstherapie für schnelle Rechner)

:D

PS:

Ich hab vor Ewigkeiten Mal sowas wie ein Verschlüsselungs-Tool in Batch geschrieben. War vermutlich ziemlich mies und weit von "sicher" entfernt, aber es hat funktioniert - zumindest meistens.
Nachdem ich dann Fehler hatte, die sich niemand erklären konnte und wir uns einig waren, dass Batch einfach nicht genau genug rechnet, habe ich Batch dann endlich liegen gelassen - hätte ich früher machen sollen.

1