5.9k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von mikoop Experte (2.7k Punkte)
Hallo Supporter,

Ich steuere über am PC angeschlossene Relais-Platinen die Bewässerung der Topfpflanzen in unserem Betrieb. Die Bewässerungsdauer (sowie die Auswahl der zu bewässernden Beete) erfolgt über eine txt Datei, die von einem Programm (let it click)
ausgelesen und durchgeführt wird.

Um auf verschiedenes Wetter reagieren zu können, habe ich verschiedene dieser Dateien mit unterschiedlichen Laufzeiten gespeichert, über eine bat-Datei überschreibe ich bei Bedarf die Datei aktuell.lec2, die vom Programm dann ausgelesen wird.

Der Nachteil an diesem Verfahren ist, dass Änderungen (zB ein Beet kommt dazu oder fällt weg) in allen 4 Dateien übernommen werden müssen (heiss, sonnig, bedeckt, regen). Schon mehrmals wurde eine Änderung in einer der Dateien vergessen, und das kann zu Problemen führen.

Deshalb möchte ich die Datei aktuell.lec2 nicht mehr überschreiben, sondern den Inhalt der Datei per batch überschreiben, und zwar nur die Zeitangaben.

So soll zB aus einer 300 eine 400 werden oder eine 200.
Wie kann ich das realisieren?
Hier ein Einblick in eine der Dateien:

set 2 8 on {Öffnen des Hauptventils im Schacht}
set 1 1 on {Start des Bewässerung mit Beet 1}
sleep 300
set 1 1 off
set 1 2 on
sleep 300
set 1 2 off
{alle Befehle zwischen diesen Klammern werden ignoriert}
{Beete durch entfernen der Klammern bei Bedarf aktieren}
set 1 3 on
sleep 300
set 1 3 off
set 1 4 on
sleep 300
set 1 4 off
set 1 5 on
sleep 300
set 1 5 off
set 1 6 on
sleep 300
set 1 6 off
set 1 7 on
sleep 300
set 1 7 off
set 1 8 on
sleep 300
set 1 8 off
{Beetwechsel bzw Wechsel der Relaisplatine}
set 2 1 on
sleep 300
set 2 1 off
set 2 2 on
sleep 300
set 2 2 off
{set 2 3 on}
{sleep 300}
{set 2 3 off}
{set 2 4 on}
{sleep 300}
{set 2 4 off}
{set 2 5 on}
{sleep 300}
{set 2 5 off}
{set 2 6 on}
{sleep 300}
{set 2 6 off}
{set 2 7 on}
{sleep 300}
{set 2 7 off}
{Start der Bewässerung der Drähte - 3. Relaisplatine}
set 3 1 on
sleep 300
Set 3 1 off
set 3 2 on
sleep 300
set 3 2 off
{Klammern entfernen um die Beete zu aktivieren}
{set 3 3 on}
{sleep 300}
{Set 3 3 off}
{set 3 4 on}
{sleep 300}
{set 3 4 off}
set 3 5 on
sleep 300
Set 3 5 off
{set 3 6 on}
{sleep 300}
{set 3 6 off}
set 2 8 off {Schliessen des Haupventils}


Wie müsste eine batch-Datei lauten, die (unter WinXP) aus allen sleep 300 sleep 400 macht und die Datei dann so wieder speichert?

Danke und Gruss, Mikoop

17 Antworten

0 Punkte
Beantwortet von
Hallo, die Parole wäre "Suchen und Ersetzen", ob es mit einer Batch zu realisieren ist, vielleicht...
Hier was du ansehen könntest:Search and Replace.
Das vielleicht dementsprechend vorschalten, die Dateiänderungen durchführen und nachher die Batch ausführen lassen.
Früher gab es beim Conrad.de mini SPS, Logo oder wie die Teile hießen, die waren für die Hutschienenmontage.
Oder falls du einen einfachen Rechner hast, mit einer Floppy würde schon reichen und eine SPS-Step5 Disk.
Bei Firmen die Automatisierung einsetzen, müsste noch so ein Oldtimer irgendwo in der Schublade liegen:-))


mfg
0 Punkte
Beantwortet von
let it click- Hast du einen Link dafür, alles was man so per google findet, ist alles bloß nicht das gesuchte?
0 Punkte
Beantwortet von tracer Mitglied (393 Punkte)
0 Punkte
Beantwortet von
Jap @tracer, das ist es, wenn man das Handbuch anschaut, dann passt der Code (set, sleep...)
Danke

mfg
0 Punkte
Beantwortet von tracer Mitglied (393 Punkte)
mmmhhhh....

ob man damit was erreichen kann??
http://fart-it.sourceforge.net/">
http://fart-it.sourceforge.net/
0 Punkte
Beantwortet von Experte (1.9k Punkte)
Keine Ahnung, aber ... wenn es nur um 2 unterschiedliche Werte geht, wäre es möglich, beide Wertdateigruppen in je einen Ordner zu kopieren und dann die Arbeitsdatei zu veranlassen, die auszutauschenden Dateien zu löschen und dann aus dem Ordner, den man grade braucht, die Dateien "hoch" zu kopieren ?
Möglicherweise müsste das Programm zum Wechsel beendet und neu gestartet werden, was man sicher auch per Bartch regeln könnte ...

Vielleicht war in meinem Gefasel was brauchbares dabei ;)
0 Punkte
Beantwortet von massaraksch Experte (3.1k Punkte)
Da ich ja Powershell-Befürworter bin, hier eine Möglichkeit damit:

Ersetzen von "sleep 300" durch "sleep 400":

Langform:
(get-content aktuell.lec2) | foreach-object { $_ -replace 'sleep 300','sleep 400' } | set-content aktuell.lec2

Kurzform:
(gc aktuell.lec2) | % { $_ -replace 'sleep 300','sleep 400' } | sc aktuell.lec2

Erweitert um regulären Ausdruck ("Platzhalter"). Damit wird jedes "sleep ???" ersetzt. Man braucht also den Ausgangswert nicht fest angeben:
(gc aktuell.lec2) | % { $_ -replace "sleep \w\w\w","sleep 400" } | sc aktuell.lec2


Die Windows-Powershell ist schnell installiert (auch auf XP) und bietet schöne Möglichkeiten.

So, jetzt aber wieder zum Spiel...

mfg, Massaraksch
0 Punkte
Beantwortet von mikoop Experte (2.7k Punkte)
Hallo nochmal,

Danke für eure engagierten Antworten.
Ein externes Programm will ich lieber nicht nutzen, falls es mit Windows Bordmitteln geht.
Optimal wäre eben eine batch-Datei.

Ich selber noch ein bischen gegoogelt und folgenden Thread gefunden, sogar hier im SN:

@ECHO off
SETLOCAL enabledelayedexpansion

REM
REM Testprogramm
REM Suchen und Ersetzen in einer Textdatei
REM
REM https://supportnet.de/threads/1481757
REM batti-batch 11/2007
REM
REM lauffaehig ab Windows 2000
REM


SET "quell_datei=vollstaendiger Dateiname incl. Laufwerk und Pfad"
SET "ziel_datei=vollstaendiger Dateiname incl. Laufwerk und Pfad"
SET "suchen_nach=hans mustermann"
SET "ersetzen_durch=clara mustermann"

REM Ausgabe einer Fehlermeldung und Programmabbruch
REM falls die Variable "suchen_nach" nicht definiert ist
IF NOT DEFINED suchen_nach (ECHO Fehler: Die Variable suchen_nach nicht definiert^^!&GOTO :eof)

REM Loeschen der Ausgabedatei, falls sie (noch) existiert
IF EXIST %ziel_datei% (DEL /f %ziel_datei% 1>NUL 2>NUL)

REM Quell-Datei zeilenweise auslesen
REM und in Variable "zeile" schreiben
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (
SET zeile=%%i& CALL :ersetzen !zeile!
)
GOTO :weiter
:ersetzen
REM innerhalb der Variable "zeile"
REM den Inhalt der Variable "suchen_nach" suchen
REM und diese durch den Inhalt der Variable "ersetzen_durch" ersetzen
SET zeile=!zeile:%suchen_nach%=%ersetzen_durch%!

REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben
IF [!zeile!] EQU [] (ECHO.>>%ziel_datei%) ELSE (ECHO !zeile!>>%ziel_datei%)
GOTO :eof

:weiter
REM weitere Verarbeitung

ECHO Fertig^^!



Ich habe es so abgewandelt, aber irgendwie klappt es noch nicht:

@ECHO off
SETLOCAL enabledelayedexpansion

REM
REM Testprogramm
REM Suchen und Ersetzen in einer Textdatei
REM
REM https://supportnet.de/threads/1481757
REM batti-batch 11/2007
REM
REM lauffaehig ab Windows 2000
REM


SET "quell_datei=E:\Eigene Dateien\Wasser\standard.txt"
SET "ziel_datei=E:\Eigene Dateien\Wasser\aktuell.lec2"
SET "suchen_nach=sleep 300"
SET "ersetzen_durch=sleep 500"

REM Ausgabe einer Fehlermeldung und Programmabbruch
REM falls die Variable "suchen_nach" nicht definiert ist
IF NOT DEFINED suchen_nach (ECHO Fehler: Die Variable suchen_nach nicht definiert^^!&GOTO :eof)

REM Loeschen der Ausgabedatei, falls sie (noch) existiert
IF EXIST %ziel_datei% (DEL /f %ziel_datei% 1>NUL 2>NUL)

REM Quell-Datei zeilenweise auslesen
REM und in Variable "zeile" schreiben
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (
SET zeile=%%i& CALL :ersetzen !zeile!
)

GOTO :weiter
:ersetzen
REM innerhalb der Variable "zeile"
REM den Inhalt der Variable "suchen_nach" suchen
REM und diese durch den Inhalt der Variable "ersetzen_durch" ersetzen
SET zeile=!zeile:%suchen_nach%=%ersetzen_durch%!

REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben
IF [!zeile!] EQU [] (ECHO.>>%ziel_datei%) ELSE (ECHO !zeile!>>%ziel_datei%)
GOTO :eof

:weiter
REM weitere Verarbeitung

ECHO Fertig^^!



Die batch läuft ohne Fehlermeldung durch, jedoch wird nichts verändert und auf dem Desktop erscheint eine Datei NUL.

Wo kann da der Fehler liegen?

Danke und Gruss, Mikoop
0 Punkte
Beantwortet von massaraksch Experte (3.1k Punkte)
Wenn du die gute Powershell nicht willst, dann nimm halt VB-Script.
Das ist ein "Bordmittel" und zugleich einfacher als die alten "DOS"-Versuche...
(naja, DOS ist die CMD-Shell zwar nicht, aber ähnlich)

Beispiel siehe:
blogs.technet.com/b/heyscriptingguy/archive/2005/02/08/how-can-i-find-and-replace-text-in-a-text-file.aspx

IMHO recht einfach und übersichtlich.

mfg, Massaraksch
0 Punkte
Beantwortet von mikoop Experte (2.7k Punkte)
Hallo Massaraksch,

Ich habe generell nichts gegen die Powershell, habe aber davon keine Ahnung.
Gibt es da denn auch eine Stapelverarbeitung, und mit welcher Endung müsste ich die entsprechende Datei speichern?

Testweise habe ich die Powershell installiert, bin beim Testen deines Codes aber schon daran gescheitert, dass ich deinen Code ja nicht direkt vom Browser rüber kopieren konnte und manuell die Zeichen | und $_ nicht erzeugen konnte...sorry dafür.

Ausserdem habe ich nicht verstanden, welche deiner Vorschläge ich wie kombinieren kann / soll.

Danke und Gruss, Mikoop
...