Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: wiseolli

wiseolli (Level 1) - Jetzt verbinden

30.01.2011, aktualisiert 18.10.2012, 7227 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 https://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 ..
Ähnliche Inhalte
Batch & Shell
Batch : TXT-Datei auslesen
gelöst Frage von Newplay123Batch & Shell20 Kommentare

Hallo, ich habe eine Textdatei mit dem Inhalt " "Test" ". Also die zweiten Anführungszeichen sind auch mit in ...

Batch & Shell

Batch-Skript Schleife älteste Datei umbenennen

Frage von pentaddBatch & Shell9 Kommentare

Hallo zusammen, Ich möchte per Batch-Skript folgendes umsetzen: älteste Datei in einem Ordner finden Datei umbenennen: vom Dateinamen die ...

Entwicklung

Batch oder Powershell für .txt-Datei

gelöst Frage von freshman2017Entwicklung5 Kommentare

Hallo liebe Gemeinde, ich habe eine .txt-Datei, die aus einer Artikelnummer und einem Bildname bestehen soll. Ausgangsdatei (export.txt) ist ...

Windows 7

BATCH: Alter einer TXT-Datei bestimmen

gelöst Frage von ahstaxWindows 75 Kommentare

Hallo, wie bekomme ich mit einer DOS-Batch das Alter einer TXT-Datei bestimmt und lassen dann, bspw bei Alter >16h, ...

Neue Wissensbeiträge
Viren und Trojaner

Staatstrojaner soll auch per Einbruch installiert werden können

Information von transocean vor 1 TagViren und Trojaner2 Kommentare

Moin, Bundesinnenminister Horst Seehofer will dem Verfassungsschutz Wohnungseinbrüche erlauben, um den geplanten Staatstrojaner zu installieren. Gruß Uwe

Windows 7
Win7 Update scheitert KB4512506
Information von infowars vor 1 TagWindows 7

Falls jemand auch das Problem hat mit dem: Monatliches Sicherheitsqualitätsrollup für Windows 7 für x64-basierte-Systeme (KB4512506) Das scheint mit ...

Humor (lol)
Wenn hacken nach hinten los geht
Information von em-pie vor 2 TagenHumor (lol)5 Kommentare

Moin, weil heute Freitag ist, nachfolgender kurzer Artikel zum schmunzeln:) l+f: NULL ist ein notorischer Falschparker

Windows Update
Windows: August 2019 Patchday-Probleme
Information von kgborn vor 3 TagenWindows Update3 Kommentare

Ich kippe mal einige kurze Informationen hier rein - vielleicht hilft es Betroffenen. Die August 2019-Updates für Windows haben ...

Heiß diskutierte Inhalte
Switche und Hubs
Glasfaser-Anschluss Telekom muss verteilt werden
Frage von cansoniSwitche und Hubs28 Kommentare

Vorweg: Bin nur Anwender und kein Experte Die Situation: Der Vermieter stellt einen Glasfaseranschluss in der Wohnung bereit. Wir ...

Ubuntu
Download manchmal langsam oder komplette Abbrüche bzw. Videos spielen nicht bis zum Schluss
Frage von stefanstpUbuntu17 Kommentare

Immer wieder berichten unsere Kunden, dass Downloads abbrechen oder super langsam sind oder Videos nicht abgespielt werden können bzw. ...

Hyper-V
VMs von Hyper-V auf externer Festplatte
Frage von SnowbirdHyper-V17 Kommentare

Hallo, ich möchte gerne von VirtualBox auf Hyper-V umsteigen und würde auch gerne weiterhin meine VMs auf der externen ...

Festplatten, SSD, Raid
SSDs durch Lagerung ohne Strom nach 6 Monaten defekt?!?
gelöst Frage von GlobetrotterFestplatten, SSD, Raid15 Kommentare

Moin Gemeinde Ich hatte gerade nen Trauerspiel Habe hier etliche NAS-Geräte herumfahren welche ich mal auf die Seite gelegt ...