130834
Goto Top

TODO List in ( Batch )

Hallo Liebe Forum-Nutzer

Ich habe heute versucht, mir eine Batch zu schreiben die Notizen anzeigt, aka eine Todo Liste die ich in eine txt schreibe.

Diese Startet beim start von Windows über ein Registry Key.
Das Script sollte die Linien in der Mitte eines Fensters "Tippen"

Problem: Ich habe versucht alles zu automatisieren. Eine bestimmte Engine in Script versucht, den ganzen Text in der
Mitte des Fensters zu platzieren, indem sie die String länge erfasst und dann eine variable mit Leerzeichen schreibt und diese VOR dem text anzeigt.

Unglücklicherweise... funktioniert irgendetwas daran nicht, nur die erste Linie wird richtig angezeigt, die anderen werden irgendwo im Nirwana geschrieben.

Der Code ist hier; Bereit für Copy&Paste und Ausführung nur leicht modifiziert, mit Kommentaren aber ohne txt Auslesung.

@echo off
setlocal enableextensions enabledelayedexpansion
Title Today's ToDo List - %date%  
mode con cols=80 lines=40


set "speed=70"  
set lines=0

:: Titel wird angezeigt

echo ________________________________________________________________________________
echo.
echo              ÛÛÛÛÛ  ÛÛÛÛÛ  ÛÛÛÛ   ÛÛÛÛÛ     Û      Û  ÛÛÛÛÛ  ÛÛÛÛÛ
echo                Û    Û   Û  Û   Û  Û   Û     Û      Û  Û        Û   
echo                Û    Û   Û  Û   Û  Û   Û     Û      Û  ÛÛÛÛÛ    Û   
echo                Û    Û   Û  Û   Û  Û   Û     Û      Û      Û    Û   
echo                Û    ÛÛÛÛÛ  ÛÛÛÛ   ÛÛÛÛÛ     ÛÛÛÛÛ  Û  ÛÛÛÛÛ    Û   
echo.
echo ________________________________________________________________________________

:: Die ausgeschaltete TXT Auslese-Engine
::   for /f "usebackq delims=" %%i in ("%userprofile%\Desktop\todo.txt") do set /a lines+=1 & set "line!lines!=%%i" 

:: Für tests eingefügte Standard Linien, die den Fehler deutlich representieren
:: Notiz: Eine zu lange Linie wird aus irgendeinem grund das Script zum Absturz bringen

set line1=this is line one
set line2= this is line 2
set line3=too long lines 
set line4=will crash the script
set /a lines=4


:: Ein MEchanismus um einen Backspace Charakter einer Variable, ( %%a) zuzuweisen
for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "BS=%%a"  

:: Das theoretische Hauptscript. Es ruft die alle Funktionen auf
for /L %%b in (1,1,%lines%) do (
set num=0
set "line=!line%%b!"  
call :center
call :type
)

:: rem Der Abschluss des Scripts, mit einer weiteren 80 breiten _ Linie
echo ________________________________________________________________________________

:: rem Hier endet das Script dann.
pause>nul
goto :EOF

:type

:: rem eine zufällige Wartezeit um einen "realistischen" Tip-Mechanismus zu erschaffen 
set "letter=!line:~%num%,1!"  
set "delay=%random%%random%%random%%random%%random%%random%%random%"  
set "delay=%delay:~-6%"  
:: rem hier wird der Buchstabe geschrieben
if not "%letter%"=="" set /p "=a%bs%%letter%" <nul  


:: rem Hier wird gewartet, und überprüft ob noch ein BUchstabe vorhanden ist
for /L %%c in (1,%speed%,%delay%) do rem
if "%letter%"=="" echo.&goto :EOF  
set /a num+=1
goto :type


:: rem Das Center für .... Centering
:center
set "leng=0"  
set "finlen=0"  

call :length "!line!" "leng"  


:: rem Hier wird die Fensterbreite ( 80 ) Minus die Variablen Länge gerechnet, und dann durch 2
:: rem um die Leerzeichen vor dem eigentlichen Text zu erhalten.
:: rem Mir fällt gerade auf das mein Problem vieleicht auch dadurch gelöst werden könnte indem Ich die Leerzeichen einfach nochmal, und zwar nach dem text schreibe,
:: rem Jedoch ist das eigentlich nicht mein Ziel und Das script sollte nach dem Text sowieso eine Neue Linie erzeugen

set /a "finlen=80-%leng%"  
set /a "finlen=%finlen%/2"  

call :fin "%finlen%" "finvar"  


:: rem Hier werden die Leerzeichen geschrieben. Ich hab das schreiben dieser in verschiedenen Kombinationen des Backspace Charakters versucht, jedoch ohne das gewünschte Ergebnis
set /p "=a%bs%!finvar!" <nul  
exit /b

:length <measure> <output>
:: rem hier wird die Variablen-Länge ausgezäht und gesetzt

set "string=%~1"  
:lengthsub
if defined string ( set "string=%string:~1%" & set /a "len +=1" & goto lengthsub )  
set /a "%~2=%len%"  
exit /b

:fin <spaces> <centerText> <output>

:: rem Hier werden die Leerzeichen erzeugt
set /a "leno=%~1"  
:subD
if "%leno%" GTR "0" ( set "Demo=%Demo% " & set /a "leno-=1" & goto :subD )  
set "%~2=%Demo%"  
exit /b

bitte den Code nicht einfach komplett neuschreiben xD

Danke im vorraus für die Antworten

lg clragon

Content-Key: 320793

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

Ausgedruckt am: 19.03.2024 um 07:03 Uhr

Mitglied: rubberman
Lösung rubberman 13.11.2016 um 02:47:19 Uhr
Goto Top
Hallo clragon.

Du hast vergessen Variablen neu zu initialisieren. Ich weiß nicht welche das alles sind (z.B. len), ist aber auch halb so wild. Die Aufrufe der Routinen in eine eigene Subumgebung zu packen, die dann wieder aufgehoben wird, sollte darüber hinweg helfen.
setlocal
call :center
call :type
endlocal

Grüße
rubberman
Mitglied: 130834
130834 13.11.2016 um 11:05:48 Uhr
Goto Top
Danke für die Hilfe!
Ich habe diesmal versucht, genug Informationen direkt von Anfang mitzuliefern.
Mitglied: canlot
canlot 13.02.2019 um 12:48:12 Uhr
Goto Top
Hi,

offtopic:

Warum schreibt man heute noch Batch????
Warum?
Heutzutage schreibt man powershell Scripte oder wenn es was vernünftiges sein soll, dann eine richtige Programmiersprache nehmen.
Ode machst du das aus Langeweile?

Gruß
Mitglied: 130834
130834 13.02.2019 um 14:26:08 Uhr
Goto Top
Hi,

Hast du dir mal das Datum des Posts angeschaut?
Sind schon ein paar Jährchen vergangen.

Batch ist leicht zu lernen und es ist zum einsteigen geeignet,
sowie für kleine Projekte und Dinge die keine Komplexen Mechanismen benötigen.

Powershell ist meiner Meinung nach eine Abscheulichkeit und
bevor ich das anfasse bau ich mir lieber Dinge in C#, Java oder Python zusammen.


lg clragon