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
dieses "let em click" programm von conrad.de kann aber doch mit sicherheit auch variablen verarbeiten. lese dir doch mal das handbuch genau durch. es müßte sowas geben wie folgt:


BEISPIEL




delay=300

set 2 8 on {Öffnen des Hauptventils im Schacht}
set 1 1 on {Start des Bewässerung mit Beet 1}
sleep $delay
set 1 1 off
set 1 2 on
sleep $delay
set 1 2 off
---


ich mag nicht glauben, dass so was einfaches wie variablen oder konstanten nicht in der scriptsprache enthalten sind.

LG
0 Punkte
Beantwortet von massaraksch Experte (3.1k Punkte)
Ich habe generell nichts gegen die Powershell, habe aber davon keine Ahnung.

Macht nix, hatte ich auch nicht - bis ich "mußte" ;o)

Gibt es da denn auch eine Stapelverarbeitung, und mit welcher Endung müsste ich die entsprechende Datei speichern?

Klar. Stapelverarbeitung geht wie bei Batch. Dateiendung ".ps1", also z.B. "Ersetze.ps1". Eigentlich ähnlich zu DOS/CMD (ok, mit ein paar Besonderheiten).

Ausführen im Explorer mit Rechtsklick - "Mit PowerShell ausführen".

In der Powershell selbst ausführen mit vollständiger Pfadangabe
C:\Verzeichnis\ersetze.ps1

bzw. im aktuellen Verzeichnis erfolgt der Aufruf mit
.\ersetze.ps1

(man beachte den "Punkt-Backslash", siehe Ähnlichkeit zu Unix/Linux-Shells)

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.

Versteh ich nicht... Geht doch problemlos zu kopieren und mit Rechtsklick einzufügen?

(Tipp am Rande: Im Systemmenü des Powershell-Fensters - genau wie bei CMD-Shell-Fenstern - unter Eigenschaften den "Quick-Edit-Modus" einschalten, dann kann man schnell mit Maus markieren/kopieren/einfügen)

Zur Zeicheneingabe: Das | ("Pipe") ist AltGr + <
Aber sag jetzt nicht, du kriegst kein Dollar und Unterstrich hin... ;o)

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

Naja, Beispiel 1 und 2 sind genau das gleiche, nur ist Beispiel 2 für Schreibfaule ;o)
Fast alle PS-Befehle (sog. "cmdlets") haben neben den "sprechenden" Bezeichnungen auch Kurzformen (aliase), oft auch aus der alten DOS-Welt oder Unix/Linux.

Beispiele:
% ist die Abkürzung von foreach-object
Get-content = gc = type = cat
Get-Childitem = gci = dir = ls
(für jeden was dabei)

Hilfe mit "get-help" oder "help" oder "man", z.B. "man dir"

Beispiel 3 (mit reg. Ausdruck) wäre wohl am besten, da du dort die zu ersetzende Zahl nicht angeben brauchst. Also egal ob in der Ausgangsdatei "sleep 200" oder "sleep 500" steht, es wird immer durch den neuen Wert "sleep 400" ersetzt.

(hmm, man könnte auch gleich ein Prozedur-Script mit Parameterübergabe basteln, aber so weit gehen wir jetzt nicht...)

Noch ein Hinweis: Besser vielleicht, die Dateiangaben mit Pfad zu machen, gleiches Prinzip wie in Batches, wenn Leerzeichen drin, dann in Anf.zeichen einschließen, also (gc "X:\Neuer Ordner\aktuell.lec2") usw.

Abgesehen davon finde ich die VB-Script-Variante in dem Link zum Technet-Scripting auch recht passabel. Eigentlich mit wenig Aufwand machbar/durchschaubar.

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

Kurze Zwischenmeldung:
@Massaraksch

Das Script von deinem Link funktioniert ganz gut, ich musste ja nur die Pfade und Suchbegriffe anpassen.
Wenn das ganze eingerichtet ist gebe ich nochmals Meldung, bis dahin vielen Dank!

Wenn ich mal mehr Zeit habe will ich mich aber nochmals mit der batch-Datei beschäftigen. Diese arbeitet ja mit einer Quell- und einer Zieldatei, das hat den Vorteil, dass ich mit einer neutralen Grunddatei arbeiten kann und alle Änderungen an dieser Datei in eine neue Datei geschrieben werden. Das kommt mir sicherer und komfortabler vor als immer die Original-Datei zu verändern, aber Hauptsache, die Sache läuft jetzt erst mal.

Bis dahin danke,
Gruss, Mikoop
0 Punkte
Beantwortet von
Unterschiedliche Quell- und Zieldateien? Ist doch auch mit VBS oder Powershell kein Problem...

In dem VB-Script-Beispiel (aus dem Technet) änderst du einfach die Zeile mit der Schreiboperation:
...
Set objFile = objFSO.OpenTextFile("C:\Ordner\Ziel.txt", ForWriting)


In meinem Powershell-Beispiel z.B. so:

(gc "C:\Ordner\Quelle.lec2) | % { $_ -replace "sleep \w\w\w","sleep 400" } | sc "C:\Ordner\Ziel-400.lec2"

Die ganze Logik steckt dabei in einer einzigen Zeile:

aus Quelldatei lesen | String ersetzen | in Zieldatei schreiben

(wobei die Zieldatei eine neue sein kann oder halt die gleiche)

Einfacher gehts kaum ;o)

Ich bin der Meinung, diese alten Batch-Konstrukte sind dafür einfach ungeignet, viel zu unübersichtlich, fehleranfällig und schwer anpaßbar. Obwohl ich vor Jahren sowas auch gern gemacht habe. Und einfache Sachen auch immer noch per Batch-Script erledige.

mfg, Massaraksch (ohne Cookie)
0 Punkte
Beantwortet von
Da fehlte ein Anf.zeichen bei der Quelle...

(gc "C:\Ordner\Quelle.lec2") | % { $_ -replace "sleep \w\w\w","sleep 400" } | sc "C:\Ordner\Ziel-400.lec2"

mfg
0 Punkte
Beantwortet von
Eine kleine Nachlässigkeit... beim VB-Script muß noch was ergänzt werden, falls die Zieldatei noch nicht existiert:

Set objFile = objFSO.OpenTextFile("C:\Ordner\Ziel.txt", ForWriting, True)

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

Von der Lösung per batch-Datei habe ich mich jetzt endgültig verabschiedet und bin zum vbs script umgeschwenkt, muss aber nicht nur einen Platzhalter, sonder 4 ersetzen, woran ich auch wieder scheitere (ich gehe halt nur in die Baumschule).

Dafür habe ich jetzt einen neuen Thread aufgemacht, da es jetzt um vbs geht und dadurch vielleicht noch andere SNler anspricht...

Vielen Dank für die vielen Ideen und Lösungsansätze,

Grus, Mikoop
...