BATCH Text schnell ablaufen lassen?
Hallo.
Ich habe mir eine BATCH Datei erstellt und möchte nun einen Text Zeile fĂŒr Zeile ganz schnell ausgeben also dass ganz schnell nacheinander die Textzeilen Kommen.
(Vorstellung wie wenn "typisch" etwas "gehackt" wird) yk.
Lg Fabio
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
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.