Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
Kommentar vom Moderator Biber am 25.09.2010 um 01:34:30 Uhr
Titel editiert.

Ausgabe aktualisieren

Frage Entwicklung Batch & Shell

Mitglied: bankaifan

bankaifan (Level 2) - Jetzt verbinden

24.09.2010, aktualisiert 25.09.2010, 3387 Aufrufe, 17 Kommentare

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

01.
fc /B %MyLW%\docs\datas\sources\log\%roomname%.room Y:\Chat\log\%roomname%.room>nul 
02.
if %ERRORLEVEL% GTR 0 ( 
03.
for /f "delims=:" %%i in ('findstr /n $ %MyLW%\docs\datas\sources\log\%roomname%.room') do set /a "lines=%%i" 
04.
set /a lines-=10 
05.
more +%lines% %MyLW%\docs\datas\sources\log\%roomname%.room) 
06.
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

01.
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?

01.
choice 1 goto :Eingabe 5sec warten goto :aktualisieren
???
Mitglied: miniversum
24.09.2010 um 12:03 Uhr
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.
Bitte warten ..
Mitglied: bankaifan
24.09.2010 um 12:41 Uhr
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
Bitte warten ..
Mitglied: miniversum
24.09.2010 um 12:52 Uhr
Du hast ne ausgabe.bat und eine eingabe.bat. Die eingabe besteht (vereinfacht) nur aus:
01.
@echo off 
02.
:loop 
03.
set /P input= Message: 
04.
echo %input% >%MyLW%\docs\datas\sources\log\%roomname%.room 
05.
goto:loop
Die Ausgabe besteht (vereinfacht) aus:
01.
@echo off 
02.
:loop 
03.
fc /B %MyLW%\docs\datas\sources\log\%roomname%.room Y:\Chat\log\%roomname%.room>nul 
04.
if %ERRORLEVEL% GTR 0 ( 
05.
for /f "delims=:" %%i in ('findstr /n $ %MyLW%\docs\datas\sources\log\%roomname%.room') do set /a "lines=%%i" 
06.
set /a lines-=10 
07.
more +%lines% %MyLW%\docs\datas\sources\log\%roomname%.room) 
08.
copy %MyLW%\docs\datas\sources\log\%roomname%.room Y:\Chat\log\%roomname%.room>nul 
09.
rem warte 1s 
10.
ping localhost -n 2 >NUL 
11.
goto:loop
Bitte warten ..
Mitglied: bankaifan
24.09.2010 um 13:01 Uhr
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
Bitte warten ..
Mitglied: jeb-the-batcher
24.09.2010 um 18:31 Uhr
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.
01.
@echo off 
02.
setlocal EnableDelayedExpansion 
03.
for /F "tokens=1-5 delims=? eol=:" %%a IN ("%0") do ( 
04.
	if "%%b" == "" ( 
05.
		goto :StartMultiThread 
06.
	) ELSE ( 
07.
		call :%%b %%c %%d %%e > con 
08.
09.
10.
goto :eof 
11.
rem goto :StartMultiThread 
12.
:FuncA 
13.
for /L %%n in (1,1,5) do ( 
14.
	ping -n %2 127.0.0.1 > nul 
15.
	echo !time! %1 cnt=%%n > con 
16.
17.
goto :eof 
18.
 
19.
:FuncB 
20.
for /L %%n in (1,1,5) do ( 
21.
	ping -n %2 127.0.0.1 > nul 
22.
	echo                                 !time! %1 cnt=%%n 
23.
24.
goto :eof 
25.
 
26.
:::::::::::::::::::::::::::::::::: 
27.
:: Startet zwei Instanzen dieser Batchdatei 
28.
:StartMultiThread 
29.
echo Starte zwei Threads 
30.
call "%~dp0/?FuncA?ThreadA?3?/../%~nx0" | call "%~dp0/?FuncB?ThreadB?2?/../%~nx0" 
31.
echo Programm Ende 
32.
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
Bitte warten ..
Mitglied: bankaifan
24.09.2010 um 23:16 Uhr
Boa. wenn des funktioniert wäre das gleich genau das richtige.

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

01.
call "./?FuncA?ThreadA?3?/../%~0" | call "./?FuncB?ThreadB?2?/../%~0" 
das ist ja scheinbar der Verursacher :D
Bitte warten ..
Mitglied: bankaifan
27.09.2010 um 11:07 Uhr
Also mein code sieht jetzt folgendermaßen aus

01.
@echo off 
02.
set MyLW=%CD:~0,39% 
03.
 
04.
:start 
05.
set aktuell=%~n0 
06.
set roomname=%aktuell:~6,50% 
07.
set lastroom=[%room%] = %roomname% 
08.
if %user% == Guest goto :keinep 
09.
if exist %MyLW%\docs\datas\sources\blocked\PC.txt ( 
10.
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 
11.
12.
if exist %MyLW%\docs\datas\sources\blocked\Users.txt ( 
13.
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 
14.
15.
:keinep 
16.
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" 
17.
 
18.
setlocal EnableDelayedExpansion 
19.
cls 
20.
echo. 
21.
echo ~Chat by AP448~ 
22.
echo. 
23.
echo. 
24.
echo Aktueller Channel: %roomname% 
25.
echo. 
26.
echo. 
27.
echo User %user% betrat den Chat %roomname% um %time:~0,5%... 
28.
echo User %user% betrat den Chat %roomname% um %time:~0,5%... >> %MyLW%\docs\datas\sources\log\%roomname%.room 
29.
for /F "tokens=1-5 delims=? eol=:" %%a IN ("%0") do ( 
30.
	if "%%b" == "" ( 
31.
		goto :StartMultiThread 
32.
	) ELSE ( 
33.
		call :%%b %%c %%d %%e > con 
34.
35.
36.
goto :eof 
37.
rem goto :StartMultiThread 
38.
:FuncA 
39.
:input 
40.
set input= 
41.
cls 
42.
echo. 
43.
echo ~Chat by AP448~ 
44.
echo. 
45.
echo. 
46.
echo Aktueller Channel: %roomname% 
47.
echo. 
48.
echo. 
49.
echo Gib deine Nachricht ein... 
50.
echo. 
51.
echo [logoff] = Ausloggen 
52.
echo [room]   = Zurück zu Raumwahl 
53.
echo. 
54.
set /P input= Message: 
55.
if "%input%"=="" goto :input 
56.
if "%input%"=="room" call %MyLW%\docs\datas\rooms.bat 
57.
if "%input%" == "logoff" goto :logoff 
58.
if "%input%" NEQ "res" echo %user%, um %time:~0,5% - %input% >> %MyLW%\docs\datas\sources\log\%roomname%.room 
59.
goto :input 
60.
goto :logoff 
61.
 
62.
:FuncB 
63.
cls 
64.
for /f "delims=:" %%i in ('findstr /n $ %MyLW%\docs\datas\sources\log\%roomname%.room') do set /a "lines=%%i" 
65.
set /a lines-=10 
66.
more +%lines% %MyLW%\docs\datas\sources\log\%roomname%.room 
67.
sleep 5 
68.
)                                !time! %1 cnt=%%n 
69.
goto :FuncB 
70.
goto :logoff 
71.
 
72.
:::::::::::::::::::::::::::::::::: 
73.
:: Startet zwei Instanzen dieser Batchdatei 
74.
:StartMultiThread 
75.
echo Starte zwei Threads 
76.
call "%~dp0/?FuncA?ThreadA?3?/../%~nx0" | call "%~dp0/?FuncB?ThreadB?2?/../%~nx0" 
77.
echo Programm Ende 
78.
goto :logoff 
79.
 
80.
 
81.
:logoff 
82.
echo User %user% hat sich um %time:~0,5% abgemeldet. >> %MyLW%\docs\datas\sources\log\%roomname%.room 
83.
call %MyLW%\docs\start.bat
funktioniert leider überhaupt nicht.

Er kann scheinbar
01.
echo.
nicht interpretieren und er schreibt lauter kryptische zeichen. ne idee?
Bitte warten ..
Mitglied: miniversum
27.09.2010 um 12:52 Uhr
Bei mir funktioniert schon der Democode von jeb-the-batcher nicht richtig sobald in einer der Funktionen ein set /p enthalten ist.
Bitte warten ..
Mitglied: jeb-the-batcher
27.09.2010 um 21:18 Uhr
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

01.
@echo off 
02.
setlocal EnableDelayedExpansion 
03.
for /F "tokens=1-5 delims=? eol=:" %%a IN ("%0") do ( 
04.
	if "%%b" == "" ( 
05.
		goto :StartMultiThread 
06.
	) ELSE ( 
07.
		call :%%b %%c %%d %%e > con 
08.
09.
10.
goto :eof 
11.
 
12.
:::: Dies ist der erste Task, die normale Ausgabe geht an die Pipe, daher verwende ich hier eine Umleitung nach con 
13.
:FuncA 
14.
for /L %%n in (1,1,5) do ( 
15.
	ping -n %2 127.0.0.1 > nul 
16.
	echo !time! %1 cnt=%%n > con 
17.
18.
goto :eof 
19.
 
20.
:::: Dies ist der zweite Task, die normale Eingabe kommt aus der Pipe, daher verwende ich hier eine Umleitung von con 
21.
:FuncB 
22.
set /p var=Gibs mir: < con 
23.
if %errorlevel% NEQ 0 goto :eof 
24.
if "%var%"=="" goto :eof 
25.
echo( > con 
26.
echo( Eingabe=%var% 
27.
goto :FuncB 
28.
 
29.
:::::::::::::::::::::::::::::::::: 
30.
:: Startet zwei Instanzen dieser Batchdatei 
31.
:StartMultiThread 
32.
echo Starte zwei Threads 
33.
call "%~dp0/?FuncA?ThreadA?3?/../%~nx0" | call "%~dp0/?FuncB?ThreadB?2?/../%~nx0" 
34.
echo Programm Ende 
35.
goto :eof
jeb
Bitte warten ..
Mitglied: bankaifan
27.09.2010 um 22:46 Uhr
wow. jetzt bin ich vollkommen überfordert
Bitte warten ..
Mitglied: bankaifan
01.10.2010 um 08:48 Uhr
Also funktioniert jetzt einigermaßen

Aber trotzdem noch ma die frage. wie kann ich hier

01.
cls
und
01.
echo


verwenden?
Bitte warten ..
Mitglied: jeb-the-batcher
02.10.2010 um 12:10 Uhr
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.
Bitte warten ..
Mitglied: bankaifan
03.10.2010 um 00:08 Uhr
Hey,

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

Und leerzeilen funktionieren auch nicht. Ne idee?
Bitte warten ..
Mitglied: jeb-the-batcher
05.10.2010 um 17:29 Uhr
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.
Bitte warten ..
Mitglied: bankaifan
05.10.2010 um 22:46 Uhr
Naja. Theoretisch will ich ja nur den halben bildschirm löschen :D Vllt kennst du ja n workaround :D
Bitte warten ..
Mitglied: miniversum
06.10.2010 um 14:51 Uhr
Eine (unschöne) Möglichkeit wäre:
echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo. & echo.
Bitte warten ..
Mitglied: bankaifan
06.10.2010 um 17:06 Uhr
Hehe. Die ist wirklich sehr unschön :D

Naja. vllt schreib ich mir ja n kleines programm mit C# dass das übernimmt.
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows Server
Windows Remote App - Ausgabe in lokales Office (1)

Frage von fluluk zum Thema Windows Server ...

Python
Python - ausgabe formatieren

Frage von BadFsaadKl zum Thema Python ...

Batch & Shell
gelöst Batch ausgabe zeilenweise stat spaltenweise ausgeben (4)

Frage von sugram zum Thema Batch & Shell ...

Datenbanken
Microsoft SQL Server Feld mit Trigger aktualisieren (3)

Frage von ursus57 zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...