Daten aus Textdatein per Kommandozeile extrahieren und anzeigen
Hi,
nach meinem letzten Eintrag (Logdateien per Kommandozeile auswerten (For-If, Find etc.) - Wer kann noch DOS?) habe ich geglaubt, ich habe die Funktionsweise der FOR Schleife gerafft...
Vielleicht kann mir jemand sagen, was an meiner Schleife falsch ist.
Zur Erklärung:
Ein PC schreibt beim LOGIN in ein Verzeichnis eine Datei mit seinem Hostname. In der steht z.B. der Benutzername drinnen.
Die einzelnen Dateien schreibe ich mir in eine Datei (%temp%\rechner.txt und möchte sie Zeile für Zeile auswerten und je Rechnereintrag in der %temp%\rechner.txt eine Zeile in einer HTML Datei zufügen...
NUR... Ich kriegs nicht hin und verstehe auch nicht, warum?
Vielen Dank für Eure Ideen
nach meinem letzten Eintrag (Logdateien per Kommandozeile auswerten (For-If, Find etc.) - Wer kann noch DOS?) habe ich geglaubt, ich habe die Funktionsweise der FOR Schleife gerafft...
Vielleicht kann mir jemand sagen, was an meiner Schleife falsch ist.
Zur Erklärung:
Ein PC schreibt beim LOGIN in ein Verzeichnis eine Datei mit seinem Hostname. In der steht z.B. der Benutzername drinnen.
Die einzelnen Dateien schreibe ich mir in eine Datei (%temp%\rechner.txt und möchte sie Zeile für Zeile auswerten und je Rechnereintrag in der %temp%\rechner.txt eine Zeile in einer HTML Datei zufügen...
NUR... Ich kriegs nicht hin und verstehe auch nicht, warum?
@echo off & setlocal
set rechnerzahl=1
set maxdurchlauefe=10
set tempdatei=%dateiverzeichniss%\onlinestatus.htm
set dateiverzeichniss=C:\inetpub\wwwroot\diagnose
set durchlauf=0
set trennzeile=+++++++++++++++++++++++++++++++++++++++++++++++++++
del %tempdatei%
REM In der Vorbereitung werden die erstezn Zeilen der HTML Datei zusammengeschrieben.
REM Die Kopfdaten und die beiden Rahmen definiert.
:vorbereitung
echo ^<!DOCTYPE html PUBLIC ^"-//W3C//DTD HTML 4.01 Transitional//EN^">%tempdatei%
echo ^"http://www.w3.org/TR/html4/loose.dtd^"^>>>%tempdatei%
echo ^<head^>>>%tempdatei%
echo ^<meta http-equiv=^"Content-Type^" content=^"text/html; charset=iso-8859-1^" /^>>>%tempdatei%
echo ^<title^>architekturagentur Stuttgart - Arno Freudenberger, Klaus Grübnau^</title^>>>%tempdatei%
echo ^<link rel^=^"stylesheet^" type^=^"text^/css^" href^=^"http^:^/^/www.architekturagentur.de^/support^/styles.css^"^>>>%tempdatei%
echo ^<!--script type=^"text/javascript^" src=^"support/scripts.js^"^>^</script--^>>>%tempdatei%
echo ^</head^>>>%tempdatei%
echo ^<body style=^"margin:0px;padding:0px;background-color:#FFFFFF^"^>>>%tempdatei%
echo ^<table border^=^"0^" width=^"80%%^" align^=^"center^"^>>>%tempdatei%
echo ^<tr^>>>%tempdatei%
echo ^<td align^=^"center^" valign^=^"middle^"^> >>%tempdatei%
echo ^<p^>^<p^>^ ^<p^>letzte Aktualisierung am: %date%, %time%^<^/^p^>>>%tempdatei%
echo ^<p^>^<p^>^ ^</p^>>>%tempdatei%
echo.>>%tempdatei%
echo ^<table border^=^"1^" width=^"100%%^"^> >>%tempdatei%
echo on
REM Pro txt Datei im Verzeichnis wird dieser Loop durchgegangen
:einzelnerRechner
rem Dateien im Verzeichnis auswerten
dir %dateiverzeichniss%\*.txt|find ".txt">%temp%\rechner.txt
REM +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM + HIER IST GLAUB ICH MEIN PROBLEM
REM +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for /f "tokens=4 delims= " %%a in (%temp%\rechner.txt) do (
echo %%a
set /a durchlauf=%durchlauf%+1
rem Setzen der Informationen aus der Datei
set detaildatei=%%a
REM +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM + HIER IST GLAUB ICH EIN WEITERES PROBLEM (ich will ja nicht foobar.txt als Rechnername haben)
REM +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for /f "tokens=* delims=. " %%b in ("%%a") do set Rechner=%%b
echo %trennzeile%
echo %%a
echo %%b
echo %trennzeile%
rem Suchen der Benutzerdaten in der Einzeldatei im Verzeichnis
find %dateiverzeichniss%\%%a "Benutzer:">%temp%\benutzername.txt
for /f "tokens=2 delims=:" %%i in (%temp%\benutzername.txt) do set benutzername=%%i
echo off
rem Schreiben der Informationen in die HTML Datei
echo ^<tr^>>>%tempdatei%
echo ^<td^>%%a^</td^>>>%tempdatei%
echo ^<td^>%Benutzername%^</td^>>>%tempdatei%
echo ^<td^>^<img src^=^"^.^.^\images^\punkt_gruen.gif^" width^=^"6^" height^=^"10^" border^=^"0^" align^=^"middle^"^>online^<^/td^>>>%tempdatei%
echo ^<td^>^<a href^=^"%detaildatei%^"^>Details^<^/a^>^<^/td^>>>%tempdatei%
echo ^<^/tr^>>>%tempdatei%
echo on
)
pause
cls
:hochzaehler
set /a rechnerzahl=%rechnerzahl%+1
if %rechnerzahl%==%maxdurchlauefe% goto end
goto EinzelnerRechner
:end
echo ^<^/table^>>>%tempdatei%
echo ^<^p^>^ ^;^<^/p^>>>%tempdatei%
echo ^<^/td^>>>%tempdatei%
echo ^<^/tr^>>>%tempdatei%
echo ^<^/table^>>>%tempdatei%
echo ^<^/body^>>>%tempdatei%
echo ^<^/html^>>>%tempdatei%
Vielen Dank für Eure Ideen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 01.09.2011 um 09:32:34 Uhr
Link korrigiert und Beitrg verschoben nach "Batch &Shell"
Content-ID: 172412
Url: https://administrator.de/forum/daten-aus-textdatein-per-kommandozeile-extrahieren-und-anzeigen-172412.html
Ausgedruckt am: 21.04.2025 um 21:04 Uhr
9 Kommentare
Neuester Kommentar

moin,
nur mal als allerersten Ansatz..
und wenn du dich jetzt frägen tutest, wtf - schau dir deine Zeile 4 & 5 an....
Gruß
nur mal als allerersten Ansatz..
C:\script>set haumichblau=
C:\script>set haumichgruen=
C:\script>set haumichgruen=%haumichblau%\123
C:\script>set haumichblau=17
C:\script>set haumichgruen
haumichgruen=%haumichblau%\123
nimm das vermaledeite @ Echo off raus, solange du "testest"
und wenn du dich jetzt frägen tutest, wtf - schau dir deine Zeile 4 & 5 an....
Gruß
Aloha,
gucke ich mir eventuell noch einmal an aber erst einmal als Effizienz-Tipp folgendes:
Bei deinem Echofluss reduziert das deutlich die Zugriffe auf die Datei (auf, schreiben, zu, auf, schreiben, zu ...)
Und es erspart den evtl. fehleranfälligen Anblick von
bei
fließt überflüssigerweise noch ein Leerzeichen mit ein, auch das wird mit einer Voranstellung verhindert
Desweiteren empfiehlt sich (gerade hier), die Subarbeitung innerhalb der Schleife(n) nachgestellt zu setzen (sprich: TAB), um die Funktionsansicht besser darzustellen.
Noch etwas
verstehe ich nicht, wenn du sowieso mit
genauso mit
Dann erspart man sich auch das von Biber genannte
greetz André
gucke ich mir eventuell noch einmal an aber erst einmal als Effizienz-Tipp folgendes:
>>"%tempdatei%"(echo bla
echo keks
echo und
echo so
echo weiter)
Und es erspart den evtl. fehleranfälligen Anblick von
^>>>
^> >>
Desweiteren empfiehlt sich (gerade hier), die Subarbeitung innerhalb der Schleife(n) nachgestellt zu setzen (sprich: TAB), um die Funktionsansicht besser darzustellen.
Noch etwas
set detaildatei=%%a
%%a
weiterarbeitest, warum dann nicht auch im echo
für die Datei?echo ^<td^>^<a href^=^"%%a^"^>Details^<^/a^>^<^/td^>
benutzername
etc ... mit einem übersichtlicheren Aufbau der Struktur wäre das auch viel eindeutiger zu erkennen, zumal du teilweise schon im echo
die Schleifenvariablen direkt einsetzt ...Dann erspart man sich auch das von Biber genannte
enabledelayedexpansion
(was ich gerade bei HTML etc. sowieso vermeiden und lieber Unterprozesse ackern lassen würde)greetz André
Moin ceng.de,
eine "FOR...IN.. DO ( )" Anweisung ist für den CMD-Interpreter EINE auszuführende Zeile, auch wenn diese "Programmzeile sich in dem Schnipsel z.b. von Zeile 44 bis 74 zieht.
Bedeutet, dass alle dort verwendeten Variablen (z.B. %benutzername%) genau EINMAL aufgelöst werden - quasi "bei Betreten" der Zeile 44 (die in in Zeile 74 endet).
Wenn du Variablen innerhalb der FOR-Anweisung neu setzt und den neu gesetzten Wert verwenden willst, dann musst du
a) ganz oben aus "setlocal" ein "setlocal EnableDelayedExpansion" machen
b) die innerhalb der FOR-Anweisung neu gesetzten Variablen nach dem Setzen nicht als %benutzername%, sondern in der Schreibweise !benutzername! anfassen.
Eine Forumssuche nach "EnableDelayedExpansion" oder "verzögerter Variablenauflösung" könnte helfen.
Grüße
Biber
eine "FOR...IN.. DO ( )" Anweisung ist für den CMD-Interpreter EINE auszuführende Zeile, auch wenn diese "Programmzeile sich in dem Schnipsel z.b. von Zeile 44 bis 74 zieht.
Bedeutet, dass alle dort verwendeten Variablen (z.B. %benutzername%) genau EINMAL aufgelöst werden - quasi "bei Betreten" der Zeile 44 (die in in Zeile 74 endet).
Wenn du Variablen innerhalb der FOR-Anweisung neu setzt und den neu gesetzten Wert verwenden willst, dann musst du
a) ganz oben aus "setlocal" ein "setlocal EnableDelayedExpansion" machen
b) die innerhalb der FOR-Anweisung neu gesetzten Variablen nach dem Setzen nicht als %benutzername%, sondern in der Schreibweise !benutzername! anfassen.
Eine Forumssuche nach "EnableDelayedExpansion" oder "verzögerter Variablenauflösung" könnte helfen.
Grüße
Biber

Zitat von @ceng.de:
>
> und wenn du dich jetzt frägen tutest, wtf - schau dir deine Zeile 4 & 5 an....
Uuups... Der Wald und die Bäume...
>
> und wenn du dich jetzt frägen tutest, wtf - schau dir deine Zeile 4 & 5 an....
Uuups... Der Wald und die Bäume...
eben und wenn mir beim groben durchlesen schon in Zeile 1,4&5 sowas auffällt, dann fällt sich bei mir die Entscheidung, das ich den Rest der Bäume garnicht ansehen möchte.
nimm das vermaledeite @ Echo off raus, solange du "testest"
Oder erwartest du allen ernstes, einer von uns baut sich deine Struktur zusammen - wir sind doch keine Ar
Aloha,
Meinen Tipp könntest du also auch so ansehen:
Finde ich aber inzwischen bei längeren Blöcken (in Klammern natürlich, sonst wäre es kein Block mehr) unschön erst am Ende nachvollziehen zu können, wo es hingeschrieben wird. Von der Ansicht optimaler wäre wohl sowieso
greetz André
>>%datei% echo Inhalt
und echo Inhalt>>%datei%
sind beide ein Kommando, auf einer Zeile, daher tun sie genau dasselbe, nur das ersteres keine Leerzeichenproblematik (wie schon oft vorgekommen) hervorruft.Meinen Tipp könntest du also auch so ansehen:
(echo bla
echo keks
echo und
echo so
echo weiter)>>"%tempdatei%"
Finde ich aber inzwischen bei längeren Blöcken (in Klammern natürlich, sonst wäre es kein Block mehr) unschön erst am Ende nachvollziehen zu können, wo es hingeschrieben wird. Von der Ansicht optimaler wäre wohl sowieso
>>%datei% (
echo Zeile 1
echo Zeile 2
.
.
.
echo letzte Zeile
)
greetz André
Moin ceng.de
Eventuell mal Hilfe da suchen, wo sie die hinterhältigen RedmonderInnen gemeinerweise gut versteckt haben - in der Hilfe.
Grüße
Biber
Zitat von @ceng.de:
-> Nachdem ich die beiden Einträge gemacht habe (EnableDel... und !benutze...) kommen die richtigen Aussagen.
Dann könntest du doch zumindest schon ein ganz, ganz blasses oikalyptusfarbenes Erledigt-Häkchen oben andeuten....-> Nachdem ich die beiden Einträge gemacht habe (EnableDel... und !benutze...) kommen die richtigen Aussagen.
JETZT MUSS ICH NUR NOCH VERSTEHEN, WARUM DAS SO IST...
Eventuell mal Hilfe da suchen, wo sie die hinterhältigen RedmonderInnen gemeinerweise gut versteckt haben - in der Hilfe.
> Set /?
....
...
Die verzögerte Erweiterung von Umgebungsvariablen erlaubt es, eine
Umgebungsvariable, unter Verwendung eines weiteren Zeichens (dem
Ausrufezeichen), zur Laufzeit zu erweitern. Mit aktivierter verzögerter
Erweiterung von Umgebungsvariablen können obige Beispiele wie folgt geschrieben
werden:
set VAR=vorher
if "%VAR%" == "vorher" (
set VAR=nachher
if "!VAR!" == "nachher" @echo Es funktioniert!
)
set LISTE=
for %i in (*) do set LISTE=!LISTE! %i
echo %LISTE%
....
Grüße
Biber