bankaifan
Goto Top

Ausgabe aktualisieren

Moin zusammen,

ich hab n kleine Problem. und vllt weiß ja jmd von euch wie ich es lösen kann

Folgendes

Ich habe wie auch gestern schon einen Chat mi Batch und habe dann gestern auch die Ausgabe gebastelt.

Jetzt hätte ich gerne dass die ausgabe immer automatisch aktualisiert wird

fc /B %MyLW%\docs\datas\sources\log\%roomname%.room Y:\Chat\log\%roomname%.room>nul
if %ERRORLEVEL% GTR 0 (
for /f "delims=:" %%i in ('findstr /n $ %MyLW%\docs\datas\sources\log\%roomname%.room') do set /a "lines=%%i"  
set /a lines-=10
more +%lines% %MyLW%\docs\datas\sources\log\%roomname%.room)
copy %MyLW%\docs\datas\sources\log\%roomname%.room Y:\Chat\log\%roomname%.room>nul

soweit hab ich das jetzt

Sprich er vergleich die beiden Log-Dateien und wenn es einen unterschied gibt dann aktualsiert er.

Aber damit das ganz auch sinn macht müsste ich es in eine Dauerschleife setzen. Problem ist jetzt

dass er zwischen durch auch noch das hier machen muss

set /P input= Message:

Sprich er muss schauen ob jmd etwas schreiben möchte.

nun meine Frage. Glaubt ihr dass lässt sich realisieren? Mit VBScript, JavaScript, Batch? Oder muss ich mir was in C# einfallen lassen?

Bin mal auf eure hinweise gespannt.

Grüße

Bankaifan

[OT]Solch kompliziertes Denken so früh am Morgen is nicht gut. Ich hol mir ma nen Kaffee [/OT]


EDIT: Wäre da "choice" einen gedanken wert? Ich hab gelesen da kann man sagen dass z. B. für 5 sec ne abfrage gemacht wird und anschließend geht er automatisch weiter?

choice 1 goto :Eingabe 5sec warten goto :aktualisieren
???
Kommentar vom Moderator Biber am 25.09.2010 um 01:34:30 Uhr
Titel editiert.

Content-ID: 151676

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

Ausgedruckt am: 22.11.2024 um 07:11 Uhr

miniversum
miniversum 24.09.2010 um 12:03:40 Uhr
Goto Top
Ich würde es so lösen das ich das in zwei Batches machen würde.
Eine für die Eingabe und die andere für die Anzeige.
Die Anzeige kannst du dann regelmäßig aktualisieren lassen und die Eingabe macht eben nur das set /p und das hinzufügen zur Datei.
bankaifan
bankaifan 24.09.2010 um 12:41:05 Uhr
Goto Top
und wie würdest du das mit den regelmäßigen abständen machen? wenn ich die eingabe.bat aufrufe würde er warten bis ne eingabe gemacht wird d.h. ich müsste mindestens enter drücken damit er weiter geht und das habe ich bis jetzt auch schon
miniversum
miniversum 24.09.2010 um 12:52:19 Uhr
Goto Top
Du hast ne ausgabe.bat und eine eingabe.bat. Die eingabe besteht (vereinfacht) nur aus:
@echo off
:loop
set /P input= Message:
echo %input% >%MyLW%\docs\datas\sources\log\%roomname%.room
goto:loop

Die Ausgabe besteht (vereinfacht) aus:
@echo off
:loop
fc /B %MyLW%\docs\datas\sources\log\%roomname%.room Y:\Chat\log\%roomname%.room>nul
if %ERRORLEVEL% GTR 0 (
for /f "delims=:" %%i in ('findstr /n $ %MyLW%\docs\datas\sources\log\%roomname%.room') do set /a "lines=%%i"  
set /a lines-=10
more +%lines% %MyLW%\docs\datas\sources\log\%roomname%.room)
copy %MyLW%\docs\datas\sources\log\%roomname%.room Y:\Chat\log\%roomname%.room>nul
rem warte 1s
ping localhost -n 2 >NUL
goto:loop
bankaifan
bankaifan 24.09.2010 um 13:01:21 Uhr
Goto Top
gut. aber dann hätte ich ja immer zwei fenster offen. ma sehen vllt kennt biber noch ne möglichkeit :D aber ich werds mal so versuchen. nur die eingabe.bat werd ich wohl mit ner msg box machen

EDIT: Habs jetzt ma so nach dem system gemacht. ich lass n .vbs aufrufen, das mir ne .bat unsichtbar öffnet, das mir wiederrum n .vbs öffnet, dass ein eingabefenster im windowsstyle öffnet. ist ganz ok. wäre trotzdem cool wenns noch anders ginge
jeb-the-batcher
jeb-the-batcher 24.09.2010 um 18:31:37 Uhr
Goto Top
Da ich, wie der Name schon sagt, der Pure-Batch Verfechter bin hier eine Lösung mit reinem Batch.

Der Vorschlag von miniversum ist an sich OK, und sieht man auch recht oft. Man kann die beiden Fenster auch ganz nett mit MODE auf die gewünschte größe bringen.

Die zweite Methode ist eher unbekannt (genau genommen habe ich die noch nie woanders gesehen).
Die "EINE FENSTER" Methode, mit der man mehrere Batchdateien in einem cmd-Fenster starten kann, es darf natürlich auch mehrmals die selbe Datei sein.
Das ganze basiert auf Pipes, bei Pipes werden beide Seiten gestartet und laufen asynchron.

Eine kleine Demo.
@echo off
setlocal EnableDelayedExpansion
for /F "tokens=1-5 delims=? eol=:" %%a IN ("%0") do (  
	if "%%b" == "" (  
		goto :StartMultiThread
	) ELSE (
		call :%%b %%c %%d %%e > con
	)
)
goto :eof
rem goto :StartMultiThread
:FuncA
for /L %%n in (1,1,5) do (
	ping -n %2 127.0.0.1 > nul
	echo !time! %1 cnt=%%n > con
)
goto :eof

:FuncB
for /L %%n in (1,1,5) do (
	ping -n %2 127.0.0.1 > nul
	echo                                 !time! %1 cnt=%%n
)
goto :eof

::::::::::::::::::::::::::::::::::
:: Startet zwei Instanzen dieser Batchdatei
:StartMultiThread
echo Starte zwei Threads
call "%~dp0/?FuncA?ThreadA?3?/../%~nx0" | call "%~dp0/?FuncB?ThreadB?2?/../%~nx0"  
echo Programm Ende
goto :eof

[Edit]
call "./?FuncA?ThreadA?3?/../%~0" | call "./?FuncB?ThreadB?2?/../%~0"
durch dies ersetzt
call "%~dp0/?FuncA?ThreadA?3?/../%~nx0" | call "%~dp0/?FuncB?ThreadB?2?/../%~nx0"
Weil es sonst fehlschlägt, wenn man das Batchfile mit einem Pfad gestartet hat
[/Edit]

Ausgabe
Starte zwei Threads
18:27:09,24 ThreadB cnt=1
18:27:10,24 ThreadA cnt=1
18:27:10,27 ThreadB cnt=2
18:27:11,30 ThreadB cnt=3
18:27:12,27 ThreadA cnt=2
18:27:12,33 ThreadB cnt=4
18:27:13,36 ThreadB cnt=5
18:27:13,36 ThreadB Ende
18:27:14,30 ThreadA cnt=3
18:27:16,32 ThreadA cnt=4
18:27:18,35 ThreadA cnt=5
18:27:18,35 ThreadA Ende
Programm Ende

jeb
bankaifan
bankaifan 24.09.2010 um 23:16:21 Uhr
Goto Top
Boa. wenn des funktioniert wäre das gleich genau das richtige.

Magst du mir des vllt ma erklären? also dieses stück hier

call "./?FuncA?ThreadA?3?/../%~0" | call "./?FuncB?ThreadB?2?/../%~0"   

das ist ja scheinbar der Verursacher :D
bankaifan
bankaifan 27.09.2010 um 11:07:39 Uhr
Goto Top
Also mein code sieht jetzt folgendermaßen aus

@echo off
set MyLW=%CD:~0,39%

:start
set aktuell=%~n0
set roomname=%aktuell:~6,50%
set lastroom=[%room%] = %roomname%
if %user% == Guest goto :keinep
if exist %MyLW%\docs\datas\sources\blocked\PC.txt (
for /f "delims=" %%i in (%MyLW%\docs\datas\sources\blocked\PC.txt) do findstr /i /b /C:%computername% %MyLW%\docs\datas\sources\blocked\PC.txt> nul && call %MyLW%\docs\datas\sources\blocked.bat  
)
if exist %MyLW%\docs\datas\sources\blocked\Users.txt (
for /f "delims=" %%c in (%MyLW%\docs\datas\sources\blocked\Users.txt) do findstr /i /b /C:%username% %MyLW%\docs\datas\sources\blocked\Users.txt> nul && call %MyLW%\docs\datas\sources\blocked.bat  
)
:keinep
if not exist %MyLW%\docs\datas\sources\log\%roomname%.room for /L %%a in (0,1,9) do echo.>>"%MyLW%\docs\datas\sources\log\%roomname%.room"  

setlocal EnableDelayedExpansion
cls
echo.
echo ~Chat by AP448~
echo.
echo.
echo Aktueller Channel: %roomname%
echo.
echo.
echo User %user% betrat den Chat %roomname% um %time:~0,5%...
echo User %user% betrat den Chat %roomname% um %time:~0,5%... >> %MyLW%\docs\datas\sources\log\%roomname%.room
for /F "tokens=1-5 delims=? eol=:" %%a IN ("%0") do (  
	if "%%b" == "" (  
		goto :StartMultiThread
	) ELSE (
		call :%%b %%c %%d %%e > con
	)
)
goto :eof
rem goto :StartMultiThread
:FuncA
:input
set input=
cls
echo.
echo ~Chat by AP448~
echo.
echo.
echo Aktueller Channel: %roomname%
echo.
echo.
echo Gib deine Nachricht ein...
echo.
echo [logoff] = Ausloggen
echo [room]   = Zurück zu Raumwahl
echo.
set /P input= Message:
if "%input%"=="" goto :input  
if "%input%"=="room" call %MyLW%\docs\datas\rooms.bat  
if "%input%" == "logoff" goto :logoff  
if "%input%" NEQ "res" echo %user%, um %time:~0,5% - %input% >> %MyLW%\docs\datas\sources\log\%roomname%.room  
goto :input
goto :logoff

:FuncB
cls
for /f "delims=:" %%i in ('findstr /n $ %MyLW%\docs\datas\sources\log\%roomname%.room') do set /a "lines=%%i"  
set /a lines-=10
more +%lines% %MyLW%\docs\datas\sources\log\%roomname%.room
sleep 5
)                                !time! %1 cnt=%%n
goto :FuncB
goto :logoff

::::::::::::::::::::::::::::::::::
:: Startet zwei Instanzen dieser Batchdatei
:StartMultiThread
echo Starte zwei Threads
call "%~dp0/?FuncA?ThreadA?3?/../%~nx0" | call "%~dp0/?FuncB?ThreadB?2?/../%~nx0"  
echo Programm Ende
goto :logoff


:logoff
echo User %user% hat sich um %time:~0,5% abgemeldet. >> %MyLW%\docs\datas\sources\log\%roomname%.room
call %MyLW%\docs\start.bat

funktioniert leider überhaupt nicht.

Er kann scheinbar
echo.
nicht interpretieren und er schreibt lauter kryptische zeichen. ne idee?
miniversum
miniversum 27.09.2010 um 12:52:24 Uhr
Goto Top
Bei mir funktioniert schon der Democode von jeb-the-batcher nicht richtig sobald in einer der Funktionen ein set /p enthalten ist.
jeb-the-batcher
jeb-the-batcher 27.09.2010 um 21:18:37 Uhr
Goto Top
Pipes sind ein wenig schwierig, besonders bei Ein/Ausgaben, teilweise werden keine Zeilenumbrüche ausgegeben sondern die dahinter liegenden Ascii-Zeichen.

Der Code von bankifan wird so nicht funktionieren, die ganzen Ausgaben sollten in einen Thread verschoben werden, weil sonst wird versucht den ganzen kram dreimal auszugeben
Beim ersten starten der Batch und jeweils pro Thread.

Ein kleines Beispiel mit set /p

@echo off
setlocal EnableDelayedExpansion
for /F "tokens=1-5 delims=? eol=:" %%a IN ("%0") do (  
	if "%%b" == "" (  
		goto :StartMultiThread
	) ELSE (
		call :%%b %%c %%d %%e > con
	)
)
goto :eof

:::: Dies ist der erste Task, die normale Ausgabe geht an die Pipe, daher verwende ich hier eine Umleitung nach con
:FuncA
for /L %%n in (1,1,5) do (
	ping -n %2 127.0.0.1 > nul
	echo !time! %1 cnt=%%n > con
)
goto :eof

:::: Dies ist der zweite Task, die normale Eingabe kommt aus der Pipe, daher verwende ich hier eine Umleitung von con
:FuncB
set /p var=Gibs mir: < con
if %errorlevel% NEQ 0 goto :eof
if "%var%"=="" goto :eof  
echo( > con
echo( Eingabe=%var%
goto :FuncB

::::::::::::::::::::::::::::::::::
:: Startet zwei Instanzen dieser Batchdatei
:StartMultiThread
echo Starte zwei Threads
call "%~dp0/?FuncA?ThreadA?3?/../%~nx0" | call "%~dp0/?FuncB?ThreadB?2?/../%~nx0"  
echo Programm Ende
goto :eof

jeb
bankaifan
bankaifan 27.09.2010 um 22:46:01 Uhr
Goto Top
wow. jetzt bin ich vollkommen überfordert face-smile
bankaifan
bankaifan 01.10.2010 um 08:48:28 Uhr
Goto Top
Also funktioniert jetzt einigermaßen

Aber trotzdem noch ma die frage. wie kann ich hier

cls
und
echo


verwenden?
jeb-the-batcher
jeb-the-batcher 02.10.2010 um 12:10:32 Uhr
Goto Top
Also "cls" ist kein Problem, zumindestens aus dem zweiten Thread.

"echo" gibt teilweise Probleme, wenn aus beiden Threads Ausgaben auf >con gemacht werden.
Manchmal werden statt Zeilenumbrüche die Zeichen aus dem Zeichensatz ausgegeben also <cr><lf> wird zu ?? (kann ich hier nicht darstellen)

Scheint nicht zu passieren wenn man nur aus einem Task ausgaben macht.

Sprich man darf nur einen Viewer-Task erzeugen und alle anderen sind Worker oder Eingabe-Tasks.

Das nutze ich z.B. um mehrere Netzwerksynchronisierungen "gleichzeitig" durchzuführen, so dass bei Blockade einer Sync-Task nicht gleich alle warten müssen.
bankaifan
bankaifan 03.10.2010 um 00:08:27 Uhr
Goto Top
Hey,

also CLS funktioniert nicht. Da schreibt er mir nur das "weiblichzeichen"

Und leerzeilen funktionieren auch nicht. Ne idee?
jeb-the-batcher
jeb-the-batcher 05.10.2010 um 17:29:08 Uhr
Goto Top
Ok, das mit dem "CLS" ist scheinbar doch ein Problem.

Ich hab es bisher nicht im Thread genutzt, sondern nur beim starten des "Hauptthreads".

Sprich ich hab auch keine Lösung, um nachträglich den Bildschirm einfach zu löschen.
bankaifan
bankaifan 05.10.2010 um 22:46:31 Uhr
Goto Top
Naja. Theoretisch will ich ja nur den halben bildschirm löschen :D Vllt kennst du ja n workaround :D
miniversum
miniversum 06.10.2010 um 14:51:34 Uhr
Goto Top
Eine (unschöne) Möglichkeit wäre:
echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo.
bankaifan
bankaifan 06.10.2010 um 17:06:31 Uhr
Goto Top
Hehe. Die ist wirklich sehr unschön :D

Naja. vllt schreib ich mir ja n kleines programm mit C# dass das übernimmt.