doppellhelix
Goto Top

Mal wieder Dateiinhalte verändern und allg. Fragen zu Powershell

Hallo alle,

mitlerweile werde ich hier noch zum Dauergast face-smile

Nachdem ich durch eure Hilfe schon einiges an Batchbefehlen gelernt habe, gehts nun weiter.
Und wiedermal fehlt mir der richtige Einstieg in ein Thema. Soll heißen: Ich weiß ganit, wo ich anfangen soll mit der suche.

Folgendes Problem:

Auf einem FTP Server wird jede halbe Stunde eine Datei erzeugt. Sie heißt min_day.js und hat folgenden Inhalt.

m[mi++]="03.08.11 16:45:00|500;459;67;29857;607;255"
m[mi++]="03.08.11 16:40:00|1217;1104;157;29815;629;264"
m[mi++]="03.08.11 16:35:00|1915;1730;245;29711;639;270"
.
.
.

Jede halbe Stunde wird die Datei nach oben erweitert, mit 5 Minutenwerte.

Leider kann ich mit einer *.js Datei nichts Anfangen. Ich habe mir also eine Batchdatei geschrieben (an der Stelle nochmals danke an alle die geholfen haben).

Diese Batchdatei holt sich die Datei vom FTP Server und speichert sie auf ein lokales Verzeichnis.
Nach dem speichern wird der Dateiname abgeändert von min_day.js in xxx.txt

Das funktioniert soweit tadellos.

Allerdings stehen jetzt noch Sachen in der Datei, was ich nicht gebrauchen kann.

Der Dateiinhalt sollte so aussehen:

03.08.11;16:45:00;500;459;67;29857;607;255
03.08.11;16:40:00;1217;1104;157;29815;629;264
03.08.11;16:35:00;1915;1730;245;29711;639;270
.
.
.


Hier meine ersten Fragen:
Wie genau geht das?
Kann ich das "Dateiinhalt abändern" noch in die vorhandene Batchdatei mit einfügen?

Hier wird viel von Powershell geredet. Und das man das mit Powershell machen kann. Wo finde ich ein deutsches Tutorial für Powershell?
Weil so wie ich das hier gelesen habe, kann man ja damit echt feine Sachen machen. Damit möchte ich mich gerne näher befassen.

Also, ich bin für jeden Tip dankbar.
Am aller besten (wenn auch etwas dreist) wäre es, wenn mir jemand ein Programm dafür schreiben könnte. Und dazu noch Erklärungn, was die einzelnen Zeilen bedeuten.
So habe ich etwas in der Hand, womit ich anfangen kann das zu lernen. Abgesehen davon, brauche ich das relativ Zeitnah.

Vielen lieben Dank.

Gruß Helix

Content-Key: 170896

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

Ausgedruckt am: 29.03.2024 um 06:03 Uhr

Mitglied: Doppellhelix
Doppellhelix 03.08.2011 um 19:56:09 Uhr
Goto Top
So. ich habe mitlerweile etwas gefunden.

SETLOCAL enabledelayedexpansion


SET "datei=c:\CSV\min_day.txt"
SET "ausgabe=c:\CSV\fertig\GBLH.txt"
SET "suchzeichen="
SET "ersetzungszeichen="

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

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

:ersetzen
REM Das Suchzeichen mit dem Ersetzungsteichen tauschen
SET zeile=!zeile:%suchzeichen%=%ersetzungszeichen%!

REM Ergebnis in die Ausgabedatei schreiben
ECHO !zeile!>>%ausgabe%
GOTO :eof

:eof

Das klappt auch soweit. Aber wenn ich jetzt als Suchzeichen | (einen Tab) eingebe, dann bricht das Programm ab.
Es kommt die Fehlermeldung:
SET zeile=!zeile: | !
Der Befehl "" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

Wie kann ich das TAB Zeichen (Senkrechter Strich) in ein Semikolon ändern?

Kann ich diese Datei noch erweitern, so daß noch mehr in einem Rutsch geändert wird?
Z.B der Anfang der Datei: m[mi++]="
Wenn ich das als Suchzeichen eingebe, ändert er die Datei zwar ab, aber dann erscheint folgendes:
"=="03.08.11 17:35:00...........

Weiß jemand Rat?
Mitglied: bastla
bastla 03.08.2011 um 22:04:08 Uhr
Goto Top
Hallo Doppelhelix!

Versuch es mal mit
SET "zeile=%%~i"
anstatt
SET zeile=%%i
(ich hätte ja auch die Zeilennummer dafür angegeben - wenn Du die passende verwendet hättest) ...
Kann ich diese Datei noch erweitern, so daß noch mehr in einem Rutsch geändert wird?
Was einmal geht, geht auch zweimal ...

... wobei die Tatsache, dass der zu entfernende Teil vor dem ersten vorkommenden "=" steht danach schreit, die "for"-Schleife etwas anzupassen - gleich am Stück etwa so:
@echo off & SETLOCAL

SET "datei=c:\CSV\min_day.txt"  
SET "ausgabe=c:\CSV\fertig\GBLH.txt"  
SET "suchzeichen=|"  
SET "ersetzungszeichen=;"  

REM Loeschen der Ausgabedatei, falls sie (noch) existiert
IF EXIST "%ausgabe%" DEL /f "%ausgabe%" 2>nul  

REM Datei zeilenweise auslesen
REM und in Variable "zeile" schreiben  
FOR /f "tokens=1* delims==" %%i IN ('FINDSTR . "%datei%"') DO (  
    set "zeile=%%~j"  
    call :ersetzen
)
goto :eof

:ersetzen
call set "zeile=%%zeile:%suchzeichen%=%ersetzungszeichen%%%"  
>>"%ausgabe%" echo %zeile: =;%  
goto :eof
Grüße
bastla
Mitglied: Doppellhelix
Doppellhelix 04.08.2011 um 06:25:11 Uhr
Goto Top
Guten Morgen,

leider gehts immer noch nicht, wenn ich nur das TAB Zeichen weghaben möchte.

Mein Code sieht nun so aus:

SETLOCAL enabledelayedexpansion


SET "datei=c:\CSV\min_day.txt"  
SET "ausgabe=c:\CSV\fertig\GBLH.txt"  
SET "suchzeichen=|"  
SET "ersetzungszeichen=;"  

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

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

:ersetzen
REM Das Suchzeichen mit dem Ersetzungsteichen tauschen
SET zeile=!zeile:%suchzeichen%=%ersetzungszeichen%!

REM Ergebnis in die Ausgabedatei schreiben
ECHO !zeile!>>%ausgabe%
GOTO :eof

:eof
Mitglied: Doppellhelix
Doppellhelix 04.08.2011 um 07:46:11 Uhr
Goto Top
@bastla
Mit deinem Tip auf dieser Seite gehts letztendlich
http://www.benutzer.de/Batch_-_Suchen_u._Ersetzen_in_.txt_Datei_-_G%C3% ...

Gruß Helix
Mitglied: bastla
bastla 04.08.2011 um 08:53:52 Uhr
Goto Top
Hallo Doppelhelix!
leider gehts immer noch nicht, wenn ich nur das TAB Zeichen weghaben möchte.
Abgesehen davon, dass "|" und TAB zwei völlig unterschiedliche Dinge sind: Wenn ich Deine Letztfassung mit meinem Entwurf (oder auch nur mit meinem Tipp) von oben vergleiche, fühle ich mich nicht ganz ernst genommen ...

... anyhow, wenn Du eine Lösung hast, soll's mir auch recht sein (obwohl ich den Link zu dieser Seite: Batch - Suchen u. Ersetzen in .txt Datei - Gänsefüßchen durch nix bevorzugen würde).

Grüße
bastla
Mitglied: Doppellhelix
Doppellhelix 04.08.2011 um 09:50:22 Uhr
Goto Top
Zitat von @bastla:
fühle ich mich nicht ganz ernst genommen ...


Das wollte ich natürlich nicht. Entschuldigung.

Ich habe doch 0,0 Ahnung von Scripten usw. Ich brauchte nur sehr schnell eine Lösung. Und der 2. Vorschlag hat eben direkt funktioniert.
Natürlich ist das Ergebnis nicht 100% so wie ich es will. Ich möchte ja gerne ALLES entfernen, was ich nicht brauche.

So sollte das Endergebnis aussehen:
03.08.11;16:45:00;500;459;67;29857;607;255
03.08.11;16:40:00;1217;1104;157;29815;629;264
03.08.11;16:35:00;1915;1730;245;29711;639;270

Aber es läuft jetzt erstmal und ich kann in Ruhe weiterforschen, wie man die ganze Sache eleganter und zu 100% richtig hinbekommt.

Gruß Helix
Mitglied: bastla
bastla 04.08.2011 um 10:08:55 Uhr
Goto Top
Hallo Doppelhelix!

Sooo wichtig nehme ich mich zwar auch nicht, aber ich frage mich (bzw Dich face-wink), ob Du meinen Ansatz überhaupt getestet hast ...

Grüße
bastla
Mitglied: Doppellhelix
Doppellhelix 04.08.2011 um 11:02:24 Uhr
Goto Top
Ja selbstverständlich.

Als erstes habe ich dies hier gemacht:

SET "zeile=%%~i"
anstatt
SET zeile=%%i

Und das funktionierte bei mir nicht. Vorrangig wollte ich ja nur diesen Senkrechten Strich weghaben (der ja kein TAB Zeichen ist)

Was ich noch nicht getestet hatte, war die Geschichte mit der FOR Schleife. Um z.b. den Anfang (m[mi++]=) zu entfernen.
Ich habe dir also geantwortet, dann habe ich mich weiter auf die Suche gemacht und deine Lösung auf der anderen Seite gefunden.

Also was ich als Anfänger in den letzten 3 Tagen gesucht und getestet habe....... face-smile Gut das ich im öffentlichen Dienst arbeite^^
Mitglied: bastla
bastla 04.08.2011 um 11:09:23 Uhr
Goto Top
Hallo Doppelhelix!

Eigentlich wollte ich den Ablauf beschleunigen, indem ich nicht nur einen Tipp hinsichtlich der "for"-Schleife gegeben, sondern einen fertigen Batch hinterlassen habe ... face-wink

Grüße
bastla

P.S.: Der "senkrechte Strich" wird auch gerne "Pipe" genannt, weil er als Verbindung zwischen Befehlen (zur Weitergabe der Ergebnisse) verwendet wird ...
Mitglied: Doppellhelix
Doppellhelix 04.08.2011 um 11:43:27 Uhr
Goto Top
Wahnsinn!!!

Also jetzt kapier ich das erstmal.
Joah, dann käme ich mir an deiner Stelle auch "als nicht ernst genommen vor"
lol

Vielen Dank für deine Hilfe. So ist es absolut perfekt!

Jetzt muß ich mir den Code aber mal genau anschauen, um zu ergründen was da genau passiert face-smile

Eine Frage noch. Gibt es einen Namen für die Sprache, mit der du das geschrieben hast?

Gruß Helix
Mitglied: bastla
bastla 04.08.2011 um 11:50:09 Uhr
Goto Top
Hallo Doppelhelix!
Gibt es einen Namen für die Sprache, mit der du das geschrieben hast?
Wird gemeinhin "Batch" genannt.

Bei weiteren Fragen: fragen ... face-wink

Grüße
bastla
Mitglied: Doppellhelix
Doppellhelix 04.08.2011 um 12:17:30 Uhr
Goto Top
Gerne.

Das hier ist jetzt meine letzte Frage. Weil ich habe für heute auch keine Lust mehr face-smile

Die ist jetzt mein Vollsändiger Code, den ich mir zusammengebastelt habe.
Ich rufe zuerst einen FTP Server auf und hole mir die Datei auf meinen Lokalen PC. Dann ändere ich den Dateinamen. Und dann kommt dein Code.

::Abholung der Daten fuer GBLH
set FTP=ftp-script.dat
set SRV=home3.solarlog-web.de
set USR=xxx
set PAS=xxx

:: FTP-Script erstellen
echo open %SRV% > %FTP%
echo %USR%>> %FTP%
echo %PAS%>> %FTP%
echo bin >> %FTP%
echo lcd d:\Import_Solar\GBLH >> %FTP%
:: nun den richtigen Befehl eintragen mget,put oder get (fuer eine einzelne Datei)...
echo get min_day.js >> %FTP%
echo close >> %FTP%
echo quit >> %FTP%

:: FTP mit Script ausfuehren
ftp -s:%FTP%

:: Aufraeumen
del /Q %FTP%
set USR=
set PAS=

:: Umbenennen
rename d:\Import_Solar\GBLH\min_day.js gblh.txt

::Dateiinhalt anpassen
@echo off & SETLOCAL

SET "datei=d:\Import_Solar\GBLH\gblh.txt"  
SET "ausgabe=d:\Import_Solar\GBLH\fertig\gblh.txt"  
SET "suchzeichen=|"  
SET "ersetzungszeichen=;"  

REM Loeschen der Ausgabedatei, falls sie (noch) existiert
IF EXIST "%ausgabe%" DEL /f "%ausgabe%" 2>nul  

REM Datei zeilenweise auslesen
REM und in Variable "zeile" schreiben  
FOR /f "tokens=1* delims==" %%i IN ('FINDSTR . "%datei%"') DO (  
    set "zeile=%%~j"  
    call :ersetzen
)
goto :eof

:ersetzen
call set "zeile=%%zeile:%suchzeichen%=%ersetzungszeichen%%%"  
>>"%ausgabe%" echo %zeile: =;%  
goto :eof
::==============================================================================
::==============================================================================

Jetzt möchte ich das gerne noch für 2 weitere FTP Server machen.
Wenn ich den gleichen code (natürlich mit anderen Angaben) direkt unter der letzten Zeile schreibe, dann wird nur der 1. Teil ausgeführt. Also nur für den 1. Server.
Ich nehme an, du hast nen Befehl drin, der die Verarbeitung stoppt.
Und was passiert mit den fertigen Dateien? Würden die auch bei der nächsten abfrage überschrieben werden?

Gruß Helix
Mitglied: bastla
bastla 04.08.2011 um 12:38:54 Uhr
Goto Top
Hallo Doppelhelix!
Ich nehme an, du hast nen Befehl drin, der die Verarbeitung stoppt.
Zeile 46 (ein "goto" ist erforderlich, damit das Unterprogramm nach der Schleife nicht nochmals durchlaufen wird - Du kannst aber durch Einfügen weiterer Zeilien unmittelbar vor Zeile 46 das "Hauptprogramm" noch erweitern ...
Und was passiert mit den fertigen Dateien? Würden die auch bei der nächsten abfrage überschrieben werden?
Es gibt einige Kommentare in dem Batch - in Zeile 37 steht auch einer ... face-wink
Noch eine Anmerkung zu dne Zeilen 7 - 16: Die könntest Du auch so
:: FTP-Script erstellen
 >%FTP% echo open %SRV%
>>%FTP% echo %USR%
>>%FTP% echo %PAS%
>>%FTP% echo bin
>>%FTP% echo lcd d:\Import_Solar\GBLH
:: nun den richtigen Befehl eintragen mget,put oder get (fuer eine einzelne Datei)...
>>%FTP% echo get min_day.js
>>%FTP% echo close
>>%FTP% echo quit
schreiben - liest sich dann leichter ...

Grüße
bastla
Mitglied: Doppellhelix
Doppellhelix 04.08.2011 um 12:52:40 Uhr
Goto Top
Oh Mann. langsam wirds mir peinlich.

Also ich habe Zeile 46 gelöscht. Und analog dazu weiter unten für die weiteren Serverabfragen.

Aber dennoch wird nur der 1. Server abgefragt.

Du redest von Unterprogramm und Hauptprogramm^^ Keine ahnung wo das eine Aufhört und das andere Anfängt.
Mitglied: Doppellhelix
Doppellhelix 04.08.2011 um 13:33:43 Uhr
Goto Top
Ok. Habe alles so hinbekommen, wie ich es wollte.

Nochmals vielen Dank für deine Hilfe.

Gruß Helix
Mitglied: Doppellhelix
Doppellhelix 04.08.2011 um 17:09:26 Uhr
Goto Top
Denkste.

Eine sache ist da doch noch, wie ich leider gerade feststellen muß.

Ich brauche immer in der 1. Zeile eine Überschrift.
Also in der Datei, die fix und fertig ist.

Sie sollte so aussehen:

Datum;Uhrzeit;ACLeistung;DCLeistung;ACTagesertrag;DCSpannung;WRTemperatur

Wenn du das noch hinbekommst, versprech ich dir das ich dich in Ruhe lassen werde face-smile

Gruß Helix
Mitglied: bastla
bastla 04.08.2011 um 17:13:33 Uhr
Goto Top
Hallo Doppelhelix!

Ersetze einfach Zeile 38 durch
>"%ausgabe%" echo Datum;Uhrzeit;ACLeistung;DCLeistung;ACTagesertrag;DCSpannung;WRTemperatur
Grüße
bastla

P.S.:
versprech ich dir das ich dich in Ruhe lassen werde face-smile
Ist nicht nötig - mich zwingt ja keiner, hier zu schreiben ... face-wink