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
GELÖST

Batch - Zufallszeilen aus txt-Datei anzeigen. Einige Macken im Skript

Frage Entwicklung Batch & Shell

Mitglied: wiseolli

wiseolli (Level 1) - Jetzt verbinden

30.01.2011, aktualisiert 18.10.2012, 6754 Aufrufe, 4 Kommentare

Früher hatte ich ein Programm, das mir nach einer bestimmten Zeit (z.B. nach 30 min.) auf dem Desktop verschiedene Zitate/Fremdwörter/Prüfungsfragen usw. aus einer Textdatei Zeilenweise per Zufallsgenerator anzeigen konnte. Nach und nach konnte man so die Sachen auswendig lernen.
Nun wollte ich so etwas in Batch schreiben (möglichst ohne externe Programme). Dabei bin ich auf ein paar Problemchen gestoßen.

Hallo Leute,

es gibt einige Probleme in meinem Batch-Code, die ich nicht beseitigen kann.
Vielleicht könnten mir ja die Batch-Experten unter euch auf die Sprünge helfen
(bei den Schleifen blick ich nicht so richtig durch)


Kurze Beschreibung:
  • Es wird eine Text-Datei eingelesen.
  • Jede Zeile bekommt eine Nummer davor gestellt und alles (Nr.+Textzeilen) wird in eine temporäre Datei geschrieben.
  • Per Zufallsgenerator wird eine Zeile ausgewählt und für eine festgelegte Zeit angezeigt
  • Nach einiger Zeit wird wieder eine Zufallszeile aus der Temp-Datei angezeigt usw.


Die Macken sind:
  • Die Zeilen, die einstellige Nummern haben werden nicht angezeigt (scheinbar erst ab Zeile Nr. 10)
  • Größere Zahlen kommen öfters vor (ist nicht wirklich zufällig)
  • Manchmal werden auch zwei Zeilen auf einmal angezeigt (aber das ist nicht so schlimm wie Macke mit Zufallszahlen) z.B. Zeilen 35 und darunter 45 oder 38 und 48 gleichzeitig.


Mein Code:
01.
@echo off 
02.
:: Variablen sind nur in diesem Fenster aktiv 
03.
setlocal 
04.
 
05.
REM Skript zeigt zufällige Zeilen aus einer Textdatei an 
06.
 
07.
REM Die Zitate dürfen keine Umlaute ß und andere Sonderzeichen enthalten 
08.
REM Oder man speichert die Textdatei nicht als ANSI sondern OEM oder DOS oder OEM850 als Kodierung 
09.
REM Wenn Editor das nicht kann, dann DOS-Editor (in cmd Edit eingeben) 
10.
REM evtl. muß man für andere Codepages/unicode die Console auf Lucida Schrift umstellen! 
11.
REM Damit lange Zitate nicht rechts auslaufen (mit Laufleiste) sondern automatisch umgebrochen werden, muß man beim CMD-Fenster-Eigenschaften den Breiten-Puffer dem Fenster-Puffer anpassen 
12.
 
13.
 
14.
::Einstellungen 
15.
::=========================================================================================================================== 
16.
 
17.
:: Fenstergröße Zeile,Spalte Anzahl 
18.
mode 81,5 
19.
 
20.
:: Fenstertitel ändern 
21.
title ______Zitate______ 
22.
 
23.
:: Fensterfarbe 
24.
COLOR f1 
25.
 
26.
:: Codepage des cmd-Fensters einstellen 
27.
:: Multi (DE) - für Textkodierungen wie DOS, OEM 850 u.ä. 
28.
rem CHCP 850 > nul 
29.
:: Windows 1252 - Kyrillische-Zeichen werden schon in Textdatei nicht angezeigt 
30.
CHCP 1252 > nul 
31.
:: Cyrillic - Text muß man auf OEM-855 kodieren. Umlaute werden ohne Punkte angezeigt, ß als Fragezeichen, Consolenfenster auf "Lucida Console" einstellen 
32.
rem CHCP 855 > nul 
33.
::Russian - Text muß man auf OEM-866 kodieren. Umlaute werden ohne Punkte angezeigt. ß als Fragezeichen.  Consolenfenster auf "Lucida Console" einstellen 
34.
rem CHCP 866 > nul 
35.
::UTF-8 - Funktioniert nicht, Fenster wird geschlossen 
36.
rem CHCP 65001 > nul 
37.
 
38.
:: Pfad zu der Datei anpassen, in der die Fremdwörter/Zitate drin  stehen : 
39.
set "MyFile=Zitate.txt" 
40.
::================================================================================================================================= 
41.
 
42.
 
43.
 
44.
:: Falls temporäre Datei existiert, dann löschen 
45.
if exist %temp%\tmp.txt del %temp%\tmp.txt 
46.
 
47.
:: Temporäre Datei mit vorangestellter Zeilennummerierung schreiben 
48.
for /f "tokens=*" %%i in ('type %MyFile%^|findstr /n .') do echo %%i>>%temp%\tmp.txt 
49.
 
50.
:: Zeilen zählen: 
51.
for /f "tokens=*" %%i in ('type %MyFile%^|findstr /n .') do for /f "delims=: tokens=1" %%j in ("%%i") do set /a counter=%%j 
52.
 
53.
:loop 
54.
cls 
55.
:: Zufallszahl von 1 bis Anzahl Zeilen 
56.
:: (Der erste Random-Aufruf geht ins Leere, weil erst beim zweiten Aufruf eine wirkliche Zufallszahl rauskommt.) 
57.
echo %random%>nul 
58.
 
59.
::Komischerweise werden einstellige Zeilennummern nicht angezeigt (erst ab Zeile Nr. 10), und größere Zahlen kommen öfters vor 
60.
::set /a rdm=(%random%*%counter%/32767)+1 
61.
::set /a rdm=1+%counter%*%random%/32768 
62.
 
63.
rem deshalb diese Methode probiert (Vorschlag von Biber, gefunden in http://www.administrator.de/index.php?content=21951#81715  ) 
64.
rem Beispiel, wenn man Zufallszahl zwischen 1 und 500 haben will, dann Set /a Variable=%random% %500 + 1 und in Batch %%500 + 1 (ohne +1 wird auch 0 gezählt) 
65.
::auch hier wieder werden einstellige Zeilennummern nicht angezeigt, obwohl es in cmd-Fenster geht 
66.
set /a rdm=%random% %%counter + 1 
67.
 
68.
::evtl. geht die Zählschleife nicht richtig. Evtl. mit manueller Zeilennnummer machen z.B. Am Ende der Textdatei, oder am Ende eine Markierung machen z.B. ---Ende--- und dort Zeile auslesen 
69.
::Manchmal werden auch zwei Zeilen auf einmal angezeigt (aber das ist nicht so schlimm wie Macke mit Zufallszahlen) z.B. Zeilen 35 und darunter 45 oder 38 und 48 
70.
 
71.
::echo. 
72.
:: Zufällige Zeile (in temporär erstellten Text-Datei) finden 
73.
echo. 
74.
findstr /L %rdm%: %temp%\tmp.txt 
75.
echo. 
76.
 
77.
 
78.
:: Zeit in Sekunden (wie schnell werden andere Zeilen angezeigt) 
79.
rem Zum Testen erst auf Paar Sekunden gestellt für Schnelldurchlauf 
80.
@ping -n 2 localhost> nul 
81.
cls 
82.
goto loop 
83.
 
84.
 
85.
rem Man kann es wohl auch ohne temp-Datei lösen, wenn man die Originalzitate durchnummeriert (ich weiß aber nicht genau wie)


Grüße (und vielen Dank schon mal im Voraus für die Hilfe)
wiseolli
Mitglied: 60730
30.01.2011, aktualisiert 18.10.2012
Salü,

Mal zum spielen in der schwarzen Kiste ganz ohne @echo off....

for /l %a in (1,1,100) do echo %a: a%a>>C:\script\random\123.in

findstr /l 4: C:\script\random\123.ini
  • Das ist das, was du in Zeile 74 machst und das kommt sinngemäß dabei heraus:
4: a4 
14: a14 
24: a24 
34: a34 
44: a44 
54: a54 
64: a64 
74: a74 
84: a84 
94: a94
Ergo:
findstr /b /c:"4:" C:\script\random\123.ini
4: a4
Gruß
Bitte warten ..
Mitglied: wiseolli
30.01.2011 um 16:55 Uhr
Hallo,

mit
for /l %a in (1,1,100) do echo %a: a%a>>%temp%\123.ini
findstr /l 4: %temp%\123.ini
findstr /b /c:"4:" %temp%\123.ini
hab ich's nun nachvollziehen können.

Vielen Dank TimoBeil!

Zeile 74 habe ich nun in
 findstr /b /c:"%rdm%:" %temp%\tmp.txt 
geändert. Und nun läufts.

Gruß
wiseolli
Bitte warten ..
Mitglied: pieh-ejdsch
30.01.2011 um 17:39 Uhr
moin,

in Zeile 48 und 51 gibst Du jeweils Die Zeilennummern von der OriginalDatei aus aber blendest die Leerzeilen aus
for /f "tokens=*" %%i in ('type %MyFile%^|findstr /n .') do echo %%i>>%temp%\tmp.txt
somit kommst Du aber auf einen Falschen EndWert, wenn Du paar verstreute LeerZeilen im Original hast. - Die werden ja auch mitgezählt und dein Script zeigt nichts an, wenn genau diese Zeile rausgepickt würde.
wenn Du den genauen Zeilenwert ohne die Leerzeilen haben willst, musst Du findstr 2 mal nehmen das erste ohne Option /n
type %MyFile%|findstr  . |findstr /n "^" >%temp%\tmp.txt
wenn Du Type Datei nicht zur Konvertierung der Datei nimmst, kannst Du die Datei dem 1. Findstring so mitgeben.

in Zeile 51 kannst Du die Zeilen auch gleich mithilfe der TempDatei zählen
for /f "usebackq delims=:" %%i in ("%temp%\tmp.txt") do set /a counter=%%i
wenn Du in Zeile 74 /c: weglässt geht es auch. Du hast ja schon /b dastehen.

Gruß Phil
Bitte warten ..
Mitglied: wiseolli
05.02.2011 um 15:11 Uhr
Hallo, und danke für den Kommentar Phil.

in Zeile 48 und 51 gibst Du jeweils Die Zeilennummern von der OriginalDatei aus aber blendest die Leerzeilen aus
Tatsächlich. Hab paar leere Zeilen ins Orig. eingefügt. Und wenn ich die erstellte Temp öffne, sind die Leerzeilen (und deren Anfangsnummern nicht da).

Da ich aber in den "for-Schleifen" nicht durchblicke, werde ich versuchen die Leerzeilen zu vermeiden. Und zur Not bemühe ich halt die Funktion "Delete Blank Lines" im Notepad++

wenn Du in Zeile 74 /c: weglässt geht es auch. Du hast ja schon /b dastehen.
Stimmt, hab's probiert, geht auch ohne.
Hatte den Befehl von TimoBeil so 1:1 übernommen, da die beiden Schalter in findstr /? für mich auch passend klangen:
 /B    Sucht am Zeilenanfang. 
... 
  /C:Zeichenfolge   Sucht nach Zeichenfolge buchstabengetreu.
Danke für die Hinweise/Verbesserungen noch mal - Dat Ding rennt wie ich's wollte!

Gruß
wiseolli
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
Ungewöhnliche Txt.Datei-Abfrage mit Batch (3)

Frage von DaTobsn zum Thema Batch & Shell ...

Webentwicklung
gelöst HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Batch & Shell
Merkwürdige Zeilenformatierung in txt Datei (3)

Frage von miczar zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell oder Batch-Task: Kopiere Datei x mal und benenne diese um (2)

Frage von Lorderich zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

DSL, VDSL
DSL-Signal bewerten (14)

Frage von SarekHL zum Thema DSL, VDSL ...