Forum: PC-Programmierung Batch - Wie 2 Ausgaben auf eine Zeile in Datei?


von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich möchte die Fuses vom µC auslesen halbwegs formatiert in eine Datei 
schreiben. Funktionieren tut aktuell folgendes.
1
set /A TIMEOUT=2
2
set /A NUMBER=4
3
set PROGRAMMER=jtag2updi
4
set TARGET=m4809
5
set DATEI=NanoEveryTest.txt
6
@ echo off
7
8
mode COM%NUMBER%:1200,E,8,1
9
timeout /T %TIMEOUT%
10
echo Fuse 0: wdtcfg: > %DATEI%
11
avrdude -c %PROGRAMMER% -P com%NUMBER% -p %TARGET% -b 115200 -U fuse0:r:-:b 1>> %DATEI%
12
timeout /T %TIMEOUT%
13
pause

Nur hätte ich gern beide Ausgaben
1
Fuse 0: wdtcfg: 
2
0b0

in einer Zeile.
1
Fuse 0: wdtcfg: 0b0

Ist das möglich? Wie?

von Torsten B. (butterbrotstern)


Lesenswert?

Das Problem liegt am echo, der hängt ein CR-LF an.
Erstelle z.B. mit notepad.exe eine Datei z.B. fuse0.txt, die den Text 
ohne 0d-0a enthält, und kopiere diese.

statt echo
copy fuse0.txt %DATEI%

von Veit D. (devil-elec)


Lesenswert?

Hallo,

> ... die den Text ohne 0d-0a enthält ...

Wo kommt das 0d-0a her? Was ist das?

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Torsten B. schrieb:
> Das Problem liegt am echo, der hängt ein CR-LF an.

...oder die beiden Ausgaben zuerst jeweils in eine Variable schreiben 
und dann beide mit einem Echo ausgeben:

echo %var1% %var2% > %datei%

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Wo kommt das 0d-0a her?

Torsten B. schrieb:
> Das Problem liegt am echo, der hängt ein CR-LF an.

von Klaus W. (mfgkw)


Lesenswert?

Mit -n unterdrückt echo den Zeichenvorschub.

von Εrnst B. (ernst)


Lesenswert?

Klaus W. schrieb:
> Mit -n unterdrückt echo den Zeichenvorschub.

"Batch" nicht "Bash":

https://learn.microsoft.com/de-de/windows-server/administration/windows-commands/echo

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ist zwar ein Hack
1
echo|set /p=Fuse 0: wdtcfg: >%DATEI%

aber von solchen Hacks lebt Windows ;-)

von Veit D. (devil-elec)


Lesenswert?

Hallo,

okay Jungs & Mädels, ich stehe zwar wieder im Wald aber ich werde das 
ausprobieren ... Danke

von Veit D. (devil-elec)


Lesenswert?

Hallo,

in Variablen schreiben schien am Einfachsten, nur wie bekomme ich die 
Ausgabe von avrdude in die Variable?
1
set /A TIMEOUT=2
2
set /A NUMBER=4
3
set PROGRAMMER=jtag2updi
4
set TARGET=m4809
5
set DATEI=NanoEveryTest.txt
6
7
@ echo off
8
9
mode COM%NUMBER%:1200,E,8,1
10
timeout /T %TIMEOUT%
11
set VAR1=Fuse 0: wdtcfg:
12
set VAR2=echo avrdude -c %PROGRAMMER% -P com%NUMBER% -p %TARGET% -b 115200 -U fuse0:r:-:b
13
echo %VAR1% %VAR2% > %DATEI%
14
timeout /T %TIMEOUT%
15
pause

von Klaus W. (mfgkw)


Lesenswert?

Εrnst B. schrieb:
> Klaus W. schrieb:
>> Mit -n unterdrückt echo den Zeichenvorschub.
>
> "Batch" nicht "Bash":
>
> 
https://learn.microsoft.com/de-de/windows-server/administration/windows-commands/echo

Oh, sorry.
Windows gibt es ja auch noch...

von Veit D. (devil-elec)


Lesenswert?

Hallo,

mit dem Tipp von Yalu bekomme ich das hin. Danke.
Die Sache mit "in die Variable speichern" würde mich interessieren.
1
set /A TIMEOUT=2
2
set /A NUMBER=4
3
set PROGRAMMER=jtag2updi
4
set TARGET=m4809
5
set DATEI=NanoEveryTest.txt
6
7
@ echo off
8
9
mode COM%NUMBER%:1200,E,8,1
10
timeout /T %TIMEOUT%
11
echo|set /p=Fuse 0: wdtcfg: >%DATEI%
12
avrdude -c %PROGRAMMER% -P com%NUMBER% -p %TARGET% -b 115200 -U fuse0:r:-:b 1>> %DATEI%
13
timeout /T %TIMEOUT%
14
15
mode COM%NUMBER%:1200,E,8,1
16
timeout /T %TIMEOUT%
17
echo|set /p=Fuse 1: bodcfg: >>%DATEI%
18
avrdude -c %PROGRAMMER% -P com%NUMBER% -p %TARGET% -b 115200 -U fuse1:r:-:b 1>> %DATEI%
19
timeout /T %TIMEOUT%
20
pause

von Jens M. (schuchkleisser)


Lesenswert?

Wenn du an eine Programmzeile ein 1>>datei oder 2>>datei dranhängst, 
wird deren Standardausgabe oder Fehler an die Datei angehängt.
Was jetzt was ist weiß ich nicht, und hängt auch vom Programm ab.
Musste testen. ;)
Dein einfaches >> ohne 1 oder 2 ist ja auch die Standardausgabe, nur 
eben die vom echo

Und in die Variable gehts mit For.
Das Konstrukt bekomme ich so auch nicht hin, aber for kann ein Programm 
ausführen und die Ergebnisses in eine Variable beamen.
Kuckmal 
https://administrator.de/tutorial/tutorial-zur-for-schleife-155681.html#toc-17

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

in die Datei umlenken mit 1> klappt ja, auch schon vorher einzeln.

Ist für "in die Variable schreiben" wirklich die for Schleife notwendig?
Wenn man eigentlich nur C/C++ schreibt ist das ein grauenvoller Syntax. 
:-)

: Bearbeitet durch User
von Jens M. (schuchkleisser)


Lesenswert?

Ja, soweit mir bekannt geht es nur mit dem for.
Linux ist da wohl was einfacher, aber WinDOS eben nicht so.
Und es ist keine For-Schleife, da schleift nichts. ;)
Es führt halt für jedes Argument die Befehle aus, und da du keinen 
Zähler, keine Liste mit Argumenten oder keine Datei mit einer Liste 
angibst, wird eben das angegebene Programm ausgeführt und das 
"Ergebnis"=die Ausgabe dessen in die Variablen gepackt.
Mit DOS-for kann man schon ne Menge machen, aber ja, die Syntax ist ein 
Graus. Ist halt erweitertes DOS von vor 25 Jahren oder so.

Theoretisch gibt es die Variante, die Ausgabe des Programms in eine 
Datei zu schreiben und das dann wieder in eine Variable zu laden.
Aber das funktioniert glaub ich nicht mit jedem CMD (irgendeine Option 
ist erforderlich) und es braucht eben temporäre Files.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Danke für die Erklärung. Dann lasse ich das erstmal sein. Dafür brauche 
ich eine gewisse Muse sonst wird das nichts. Ich behalte es im 
Hinterstübchen.  :-)

von C-hater (c-hater)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
> Danke für die Erklärung. Dann lasse ich das erstmal sein. Dafür brauche
> ich eine gewisse Muse sonst wird das nichts. Ich behalte es im
> Hinterstübchen.  :-)

Du könntest auch einfach die powershell verwenden. Dagegen kackt die 
bash ungefähr genauso ab, wie die klassischen cmd-Batches gegenüber der 
bash.

Tja, das Bessere war schon immer der Hauptfeind des Guten...

von Veit D. (devil-elec)


Lesenswert?

Hallo,

du wirst es vermutlich kaum Glauben, aber die Powershell kam mir auch 
schon in den Sinn. Man könnte vielleicht auch Python verwenden.

von C-hater (c-hater)


Lesenswert?

Veit D. schrieb:

> Man könnte vielleicht auch Python verwenden.

Könnte man. Aber sollte man? Ich sehe nichts, was dafür spräche.

von Torsten B. (butterbrotstern)


Angehängte Dateien:

Lesenswert?

0d-0a ist das selbe wie CR-LF
Hex Dez C  ASCII
 09  09 \t HT  Horizontal Tab   Tabulator
 0a  10 \n LF  Line Feed        Zeilenvorschub
 0c  12 \f FF  Form Feed        Seitenvorschub
 0d  13 \r CR  Carriage Return  zur ersten Spalte
https://de.wikipedia.org/wiki/Escape-Sequenz
im Anhang die Datei ohne CR-LF

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo Torsten,

Danke für die gezeigte Möglichkeit, nur ist das dafür zu umständlich für 
8 Minidateien. Solange echo|set /p= keine Probleme macht reicht das aus.
Für andere Sachen bestimmt sehr wertvoll zu wissen. Besten Dank.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.