schustec
Goto Top

Text-Deien öffnen, ein Wort suchen und nach Bedingungsprüfung ein anderes Wort ersetzen

Hallo,
ich habe ein etwas komplexeres Problem. Das Stundenplanprogramm unserer Schule gibt die Vertretungspläne in HTML aus, damit sie dann auf einem digitalen schwarzen Brett angezeigt werden können (Dateiname: Vertretung_Datum.html). Farben usw. können über eine zusätzliche css-Datei verändert werden. Da der Übersichtlichkeit wegen jeder Tag in einer anderen Farbe gestaltet sein soll, habe ich auch schon verschieden css-Dateien erstellt. Es ist jedoch sehr mühsam, im HTML-Dokument händisch jeweils den Link zur entsprecheneden css-Datei zu ändern. In der zweiten Zeile jedes HTML-Dokuments steht die Zeile "Vertretungsplan für Mo. den ...".
Über eine Batch-Datei würde ich nun gerne diesen Textabschnitt suchen lassen und über eine "Wenn"-Abfrage den Namen der CSS-Datei austauschen lassen (z.B. Wenn "Vertretungsplan für Mo." dann href="x.css" austauschen durch href="y.css". Im Ordner liegen noch andere Dateien. Die Batchdatei sollte also nur die HTML-Dateien der Reihe nach öffnen, überprüfen, Text austauschen und die Datei wieder abspeichern.
Ich habe im Forum schon ein paar Beispiele zum Ersetzen von Text gefunden, jedoch gelingt es mir nicht, sie für meine Bedürfnisse anzupassen und vor allem mit den restlichen Anforderungen zu kombinieren. Ich kenn mich leider nur ein wenig mit Basic aus, aber die Batch-Befehle sind schon ziemlich anders. Für Hilfe und Teillösungen wäre ich sehr dankbar.
Danke und Grüße, T. Schuster

Content-ID: 161179

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

Ausgedruckt am: 26.11.2024 um 09:11 Uhr

bastla
bastla 20.02.2011 um 22:01:15 Uhr
Goto Top
Hallo schustec!

Wenn es den Verweis auf die "css"-Datei nur ein einziges Mal je HTML-Datei gibt, könntest Du es damit versuchen (ungetetstet):
@echo off & setlocal
set "Ordner=D:\Vertretungen"  
set "Typ=html"  
set "Von=x.css"  

set R=%temp%\ReplaceIt.vbs
>%R% echo Set a=WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile(a(0)).ReadAll:fso.CreateTextFile(a(0)).Write Replace(T,a(1),a(2))  

pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d *.%Typ%') do call :ProcessFile "%%i"  
popd
pause
goto :eof

:ProcessFile
set "Nach="  
findstr /i c:"Vertretungsplan für Mo" %1>nul && set "Nach=Mo.css"  
findstr /i c:"Vertretungsplan für Di" %1>nul && set "Nach=Di.css"  
findstr /i c:"Vertretungsplan für Mi" %1>nul && set "Nach=Mi.css"  
findstr /i c:"Vertretungsplan für Do" %1>nul && set "Nach=Do.css"  
findstr /i c:"Vertretungsplan für Fr" %1>nul && set "Nach=Fr.css"  
if not defined Nach echo Nicht bearbeitet: %1 & goto :eof

cscript //nologo %R% %1 "%Von%" "%Nach%"  
echo Bearbeitet: %1
goto :eof
Ersetzt wird der Text in %Von% durch den Text in %Nach% - daher bitte entsprechende Anpassungen in den Zeilen 4 und 17-21 vornehmen.

Bitte zunächst Testdaten verwenden, da die Änderungen (ohne Sicherungskopien) direkt in die Dateien geschrieben werden ...

Grüße
bastla
60730
60730 20.02.2011 um 22:14:14 Uhr
Goto Top
moin,

  • Wenn "Vertretungsplan für Mo." wirklich genauso dasteht und sonst im Plan selber nur Mo oder Montag....
... würde ich Findstr /c: "Vertretungsplan f.r Mo." mit einer Schleife über alle html Dokumente laufen lassen.

  • Grundsätzlich würde ich das aber auch nicht machen, sondern einen intelligenten Webserver z.B mit PHP nehmen, der das css selber via script einbaut.
  • Da das wahrscheinlich wieder mit Kanonen auf Spatzen geworfen ist....

  • Würde ich - wenn die Dateien immer identisch aufgebaut sind - nicht mit "suchen und ersetzen" arbeiten, sondern mit
  • Suchen, abschneiden und zusammenfügen.
- Sprich du hast 5 verschiedene Header, für jeden Tag einen
  • - suchst mit Findstr /c: "suche" nach dem Tag
  • schneidest immer ab der der Zeile ab, wo der Body anfängt (prüfst idealerweise ob die Zeile body enthält)
(more +9 ursprungsdatei>header.txt)
  • kopierst den Tagesbody mit dem Rest und überschreibst die ursprungsdatei.
(copy montag.tmpl + body.txt montag.html)

  • Probier das mal selber aus zusammen zu kombinieren - als Lehrer sollte dir das ja nicht unmöglich sein.

Gruß
€dit
@bastla - hätte ich gesehen, dass du onthelinie bist - hätt ich mir das Geplänkel gespart face-wink
Allerdings suche ich auch nicht nach für, sondern f.r - sollte so ohne chcp und co sauberererererer laufen tun.
bastla
bastla 20.02.2011 um 22:24:12 Uhr
Goto Top
@t-mo
@bastla - hätte ich gesehen, dass du onthelinie bist - hätt ich mir das Geplänkel gespart face-wink
Wieso das denn? Du hast ja eine andere Herangehensweise gezeigt - damit hat schustec schon mindestens 2 Möglichkeiten mehr ...
Allerdings suche ich auch nicht nach für, sondern f.r - sollte so ohne chcp und co sauberererererer laufen tun.
Ist auf jeden Fall die sicherere Variante (obwohl es vermutlich ja doch auf "ü" hinauslaufen wird face-wink) ...

Grüße
bastla
boulder02
boulder02 20.02.2011 um 23:10:49 Uhr
Goto Top
Hi,
kann euer Programm auch css-Klassen-Tags ausgeben?
Dann wäre es am einfachsten, du definierst in einer einzigen css-Datei die Wochentage unterschiedlich farbig.


LG boulder
schustec
schustec 21.02.2011 um 00:12:44 Uhr
Goto Top
Hi,
kann euer Programm auch css-Klassen-Tags ausgeben?
Dann wäre es am einfachsten, du definierst in einer einzigen css-Datei die Wochentage unterschiedlich farbig.
Das kann ich so genau nicht sagen, da ich mich mit css nicht auskenne, einfaches HTML geht gerade noch. Der Anfang der Seiten sieht so aus:
<html><head>
<link rel="stylesheet" type="text/css" href="cssdatei.css"></link><script src="möglicheJacaScriptDatei.js" type="text/javascript"></script><title>XXX</title></head><body>
<p class="seite">
Die Idee hört sich gut an, aber ich glaube, dass sich das so nicht umsetzen lässt, da der Plan eines Wochentags / mehrerer Wochentage gleichzeitig aushängt (also am Mo. wird auch schon der von Di. oder Mi. erzeugt (und auch oft wieder abgeändert)). Das heißt, dass für die Farben der dargestellte Tag des Plan entscheidend ist und nicht der Tag der Erstellung. Oder ginge das?
Dank und Gruß, Thomas
schustec
schustec 21.02.2011 um 00:16:23 Uhr
Goto Top
Sorry, dass ich noch nicht geantwortet habe, habe so schnell noch nicht mit einer Antwort gerechnet. Werde den Vorschlag von bastla morgen nachmittag gleich ausprobieren und Erfolgsmeldungen weitergeben. Vielen Dank für die schnelle Hilfe.
Gruß, Thomas
60730
60730 21.02.2011 um 11:06:05 Uhr
Goto Top
moin,

schau dir mal das "Geplänkel" zwischen bastla und mir an...

  • Vertretungsplan für Mo.
  • Vertretungsplan f&uuml;r Mo.

Daher probiere lieber gleich so herum:

17. findstr /i c:"r Mo" %1>nul && set "Nach=Mo.css"
usw.

Und zum testen bitte @echo off nicht benutzen! - das Setlocal jedoch gerne.

habe so schnell noch nicht mit einer Antwort gerechnet.
  • eine(r) Antwort in dem Forum zum Thema Bätsch? face-wink

Gruß
schustec
schustec 21.02.2011 um 17:29:16 Uhr
Goto Top
Habe es getestet und funktioniert super. Musste nur ein wenig rumprobieren, welche Textstelle am sichersten erkannt wird. Mit " f&uuml;r" und "für" hat es nicht funktioniert und mit "r Mo" auch nicht. Nach den Tagen kommt aber ein Komma und wenn ich "r Mo," verwende, wird der Tag sauber identifiziert (Austausch hat sofort funktioniert). Die Batch-Datei macht jetzt genau das, was ich mir erhofft hatte. Vielen Dank nochmal!
Gruß, Thomas
boulder02
boulder02 22.02.2011 um 11:36:00 Uhr
Goto Top
Hallo Thomas,
du hast das Problem ja schon gelöst, aber zu den Klassen nochmal:
Das Vertretungsprogramm gibt immerhin schon mal die Klasse "seite" aus (hier im <p> Tag. Du kannst über css ja definieren, dass alle <p> grün sind. Über die Klasse "seite" kannst du definieren, dass eben dieses einzelne <p> z.B. rot ist. Ist aber für dein Problem nicht ausreichend...
Durchsuche mal deine html-Seite, ob noch mehr Klassennamen vergeben sind (class="xxx"), idealerweise halt mit den Wochentagen korreliert.
Vielleicht stehen die in einem <div>Tag.
Schaue auch nochmal in deinem Vertretungsprogramm, ob du da css-Klassen definieren kannst. Ich kenne das von z.B. Joomla cms und einigen Komponenten, dass du Klassennamen angeben kannst, die dann in den Quelltext eingefügt werden.

Viele Grüße
schustec
schustec 22.02.2011 um 21:10:44 Uhr
Goto Top
Hi,
also css-Klassen kann man nicht definieren, aber Druckformate und da kann man in gewissen Bereichen auch HTML-Tags bei Texteingaben integrieren. Alle anderen Infos werden aus der Datenbank geholt. Gedruckt wird dann ein HTML-Dokument in dem diese Tags mitgedruckt werden, dann aber vom Browser schon beachtet werden (z.B. <B>), aber das bringt wohl nicht viel.
Das gedruckte Dokument enthält tatsächlich verschiedene Stellen mit Klassenangaben (wie z.B. <tr class="k"><th rowspan="1" class="k">), ich weiß nur leider nicht, was ich damit anfangen soll. In der css-Datei finde ich keine Stelle, wo dieses "k" auftaucht, ich kenne mich damit absolut nicht aus. Ich mache zwar die Schulhomepage, aber unser Programm erzeugt nur html-Codes, ohne css. Es gibt ja sogar die Möglichkeit, ein Java Script einzubinden (siehe oben), damit könnte man evtl. auch was machen, aber da gehen meine Kenntnisse dann gegen Null! Ich bin mit der bisherigen Lösung schon recht zufrieden, bastle und lerne natürlich gerne weiter, insofern sind weitere Tips natürlich immer willkommen. Falls meine Infos etwas bringen, freue ich mich auf weitere Antworten.
Gruß, Thomas
boulder02
boulder02 23.02.2011 um 11:07:50 Uhr
Goto Top
Hallo Thomas,
vielleicht gehts ja doch?
Du kannst ja in deiner css-Datei definieren, dass die Tabellenköpfe z.B. grüne Schrift auf gelbem Grund haben sollen.
In der css steht dann
th {
color: green;
background-color: yellow;
}
Dann sind alle Tabellenüberschriftszeilen (was'n Wort) gelb. Du hast also das generelle Erscheinungsbild definiert.

Jetzt hast du aber eine bestimmte Tabelle, in der du schwarze Schrift auf grauem Grund in der Überschriftszeile stehen haben willst. Das definierst du dann mit den Klassen. html muss ja wissen, dass eine Tabellenüberschrift ausgegeben werden soll, also muss das <th> hin. Aber nur so ist das ja gelb. Also kommt die Klasse dazu: <th class="k">
In der CSS definierst du dann diese Klasse:
.k {
color: black;
background-color: silver;
}

Jetzt werden alle Tabellenüberschriften, die zusätzlich die Klassenangabe haben grau mit schwarzer Schrift angezeigt. Alle Tabellenüberschriften, die keine oder eine andere Klassenangabe haben eben gelb mit grüner Schrift (bzw. in der anderen Klassendefinition) angezeigt.

Wenn jetzt jeder ausgegebene Wochentag in deinem html Dokument eine eigene Klasse zugewiesen bekommt, dann kannst du alles in einer einzelnen Datei definieren und brauchst nichts über batches ersetzen.
Ob das jetzt die Überschriften sind oder ob vielleicht eine Klassenangabe in dem <table>-Tag des jeweiligen Schultages stehen oder ein <div> um jeden Wochentag gebaut ist musst du mal schauen. Es muss halt für jeden Tag eine eigene Klasse geben.

In der css definierst du die Klasse mit einem Punkt, dann Klassenname, dann die geschwungenen Klammern. In die Klammer kommen untereinander die Formatierungsangeben, jeweils schön mit einem Semikolon abgeschlossen(wichtig)

Schau mal nach. Vielleicht hast du ja Glück.

Grüße
schustec
schustec 23.02.2011 um 18:45:33 Uhr
Goto Top
Hallo Boulder,
ok, jetzt verstehe ich mehr. Sehe ich das richtig, dass man mit Klassen dann auch die Zeilenhöhe einer Tabelle verändern/definieren kann? Ein Problem bleibt aber dennoch:
Zitat von @boulder02:
Wenn jetzt jeder ausgegebene Wochentag in deinem html Dokument eine eigene Klasse zugewiesen bekommt,
Es gibt in einem HTML-Dokument doch keine "Wenn-Dann"-Bedingungen, oder doch? Ich werde mich dazu mal auf die Suche machen.
Danke nochmal und Grüße!
boulder02
boulder02 23.02.2011 um 19:43:22 Uhr
Goto Top
Hi Thomas,
das mit der Tabellenzeilenhöhe ist richtig. Jeder Browser hat seine default-Werte. Du kannst aber jedes tag für dich passend definieren. Das machst du im css einfach mit der Angabe des tags und dann der Definition in den geschweiften Klammern. Das gilt dann fürs ganze Dokument.
Und wenn du Klassen einsetzt, kannst du an gezielten Stellen abweichende Definitionen erstellen.
Wenn es ein Klasse gäbe, die "montag" heisst und z.B. notiert wäre; <table class="montag">, dann bekommt die ganze Montagstabelle eben deine eigene Definition/Formatierung ab.
Angenommen du definierst in der css-Datei:
.montag {
background-color: yellow;
}
bekommt die Tabelle <table class="montag"> einen gelben Hintergrund.
<tr class="montag"> sorgt dafür, dass nur diese Tabellenzeile den gelben Hintergrund hat.
<p class="montag"> versorgt diesen Absatz mit gelbem Hintergrund.

Eine weitere Klasse (in der selben css-Datei definiert) könnte dann sein:
.dienstag {
background-color: green;
}

Die Tabelle <table class="dienstag"> ist dann eben grün hinterlegt.

Das "wenn" von oben bezieht sich auf das Vertetungsprogramm. Irgendwer (oder -was) muss ja an den richtigen Stellen den Klassennamen hinschreiben. Und wenn das Vertretungsprogramm das irgendwie anbietet, kannst du css schön einsetzen (z.B. auch die Tabellenzeilehöhe definieren; oder den Abstand vom Text zur Linie; oder oder oder). Aber das ist halt die Voraussetzung/Einschränkung, dass das Vertretungsprogramm das macht...

Viel Erfolg
LG Jörg