Discussion:
Mit FOR-Schleife eine Zeile anfuegen
(zu alt für eine Antwort)
Roland White
2011-01-08 06:42:47 UTC
Permalink
[MS-DOS 6.22]

Hi Alle,

an alle Dateien innerhalb eines Verzeichnisses, die dem Muster 0*.txt
entsprechen, soll eine (Leer-)Zeile angehängt werden. Für eine einzelne
Datei tut:
echo. >>00021.txt
das gewünschte. In einer for-Schleife:

for %X in (0*.txt) do echo. >> %X

funktioniert das leider nicht (es wird lediglich eine Datei mit dem
Namen %X erzeugt). Mit edlin habe ich es auch nicht hingebracht; keine
Ahnung, wie ich den dazu bringen könnte.

Brauche ich den sed? Oder ein andere Shell?

TIA

R-
--
Die From-Adresse ist gueltig, fuer PM aber bitte hinter dem Vornamen
noch ".white" einfuegen.
-- Ich bin nicht pessimistisch, ich behalte nur gerne recht. --
Andrej Kluge
2011-01-08 09:14:20 UTC
Permalink
Hi,
Post by Roland White
for %X in (0*.txt) do echo. >> %X
Muß in Batch-Files das "%" nicht verdoppelt werden? Also
for %%X in (0*.txt) do echo. >> %%X

?

Ciao
AK
Roland White
2011-01-08 09:41:46 UTC
Permalink
Post by Andrej Kluge
Hi,
Post by Roland White
for %X in (0*.txt) do echo. >> %X
Muß in Batch-Files das "%" nicht verdoppelt werden? Also
for %%X in (0*.txt) do echo. >> %%X
Ja, muß. Auf der Kommandozeile genügt allerdings ein einzelnes "%".
--
Die From-Adresse ist gueltig, fuer PM aber bitte hinter dem Vornamen
noch ".white" einfuegen.
Andrej Kluge
2011-01-08 09:52:03 UTC
Permalink
Hi,
Post by Roland White
Post by Andrej Kluge
Muß in Batch-Files das "%" nicht verdoppelt werden? Also
for %%X in (0*.txt) do echo. >> %%X
Ja, muß. Auf der Kommandozeile genügt allerdings ein einzelnes "%".
Ja, ich weiß, deswegen schrieb ich's doch :-)

Ciao
AK
Joseph Terner
2011-01-08 10:12:41 UTC
Permalink
Post by Roland White
[MS-DOS 6.22]
Das hätte besser im Subject Platz gefunden. :-)
Post by Roland White
an alle Dateien innerhalb eines Verzeichnisses, die dem Muster 0*.txt
entsprechen, soll eine (Leer-)Zeile angehängt werden. Für eine einzelne
echo. >>00021.txt
for %X in (0*.txt) do echo. >> %X
funktioniert das leider nicht (es wird lediglich eine Datei mit dem
Namen %X erzeugt).
Logisch, denn das >> %X wirkt auf FOR und nicht auf ECHO. COMMAND /C
könnte helfen, aber MS-DOS erlaubt Dir leider nicht, >> zu escapen.
Deshalb bleibt Dir nur der Umweg über eine Batchdatei:

C>COPY CON ADDLINE.BAT
ECHO. >> %1
^Z

C>FOR %X IN (0*.TXT) DO ADDLINE.BAT %X
Post by Roland White
Mit edlin habe ich es auch nicht hingebracht; keine
Ahnung, wie ich den dazu bringen könnte.
EDLIN ist doch bei MS-DOS 6.22 gar nicht dabei.

ciao, Joseph
Ulrich F. Heidenreich
2011-01-08 12:00:40 UTC
Permalink
Post by Joseph Terner
aber MS-DOS erlaubt Dir leider nicht, >> zu escapen.
Die Frage lag mir auch gerade auf der Zunge: Keine Chance?
Ich hätte nämlich gerne auch eine Lösung, auf welchem Wege
ich zum Beispiel

Echo <http://url.exapmle.com> >> sigfile.txt

gebacken bekomme.

Zum Ursprungsproblem. Eigentlich sollte es auch damit gehen:

echo. > line
for %x in (0*.txt) do copy %x /a+line %x/b
del line

CU!
Ulrich
--
Spamschleudern: http://invalid.de/spamsink.html
In 11 Monaten und 17 Tagen ist Weihnachten
Q8PZB 7EBRS Q8NW0 TSGZU CFSCS 59Z7U C0XG0 DXXJU SASD8
Stellt euch vor, es ist Samstag und keiner geht hin!
Erhard Kaden
2011-01-08 13:45:00 UTC
Permalink
Post by Ulrich F. Heidenreich
Echo <http://url.exapmle.com> >> sigfile.txt
Wenn Du die Klammern weglässt, funktioniert es:


Echo http://url.exapmle.com >> sigfile.txt

Ciao

----------

MfG

*Erhard Kaden*

e-mail: ***@web.de
***@t-online.de
## CrossPoint/FreeXP v3.42 (EMS) ##
Ulrich F. Heidenreich
2011-01-08 13:58:25 UTC
Permalink
Eben nicht zu dem Thema.
Post by Ulrich F. Heidenreich
Echo <http://url.exapmle.com> >> sigfile.txt
Sehr witzig. Die lasse ich dann auch weg, wenn ich zum Beispiel ein
"</br>" in eine Datei "redirecten" will.

CU!
Ulrich
--
Spamschleudern: http://invalid.de/spamsink.html
In 11 Monaten und 17 Tagen ist Weihnachten
4F4AP VELOO AJ1ED ISM0H 4UELQ XEU6Z V9YXY NFKJQ WH27G
Stellt euch vor, es ist Samstag und keiner geht hin!
Stefan Reuther
2011-01-08 22:31:06 UTC
Permalink
Post by Ulrich F. Heidenreich
Post by Joseph Terner
aber MS-DOS erlaubt Dir leider nicht, >> zu escapen.
Die Frage lag mir auch gerade auf der Zunge: Keine Chance?
Ich hätte nämlich gerne auch eine Lösung, auf welchem Wege
ich zum Beispiel
Echo <http://url.exapmle.com> >> sigfile.txt
gebacken bekomme.
Soweit ich weiß geht das unter "echtem" DOS tatsächlich nicht.


Stefan
Stefan Reuther
2011-01-09 16:48:42 UTC
Permalink
Post by Stefan Reuther
Post by Ulrich F. Heidenreich
Post by Joseph Terner
aber MS-DOS erlaubt Dir leider nicht, >> zu escapen.
Die Frage lag mir auch gerade auf der Zunge: Keine Chance?
Ich hätte nämlich gerne auch eine Lösung, auf welchem Wege
ich zum Beispiel
Echo <http://url.exapmle.com> >> sigfile.txt
gebacken bekomme.
Soweit ich weiß geht das unter "echtem" DOS tatsächlich nicht.
Da war noch was: MS-DOS 6.22 lässt "<" und ">" in Ruhe, wenn sie
zwischen einem Paar Anführungszeichen stehen. Allerdings werden die dann
von 'echo' mit ausgegeben.
echo "<http://url.exapmle.com>" >> sigfile.txt
geht also, schreibt aber eben auch Anführungszeichen in die Datei.


Stefan
Roland White
2011-01-09 09:04:50 UTC
Permalink
Ulrich F. Heidenreich <***@tremornet.de> wrote:

[...]
Post by Ulrich F. Heidenreich
echo. > line
for %x in (0*.txt) do copy %x /a+line %x/b
del line
Klappt, vielen Dank an Alle.
--
Die From-Adresse ist gueltig, fuer PM aber bitte hinter dem Vornamen
noch ".white" einfuegen.
-- Ich bin nicht pessimistisch, ich behalte nur gerne recht. --
Jens Fittig
2011-01-09 15:05:10 UTC
Permalink
Post by Joseph Terner
Post by Roland White
[MS-DOS 6.22]
Das hätte besser im Subject Platz gefunden. :-)
Post by Roland White
an alle Dateien innerhalb eines Verzeichnisses, die dem Muster 0*.txt
entsprechen, soll eine (Leer-)Zeile angehängt werden. Für eine einzelne
echo. >>00021.txt
for %X in (0*.txt) do echo. >> %X
funktioniert das leider nicht (es wird lediglich eine Datei mit dem
Namen %X erzeugt).
Logisch, denn das >> %X wirkt auf FOR und nicht auf ECHO.
Völliger Unsinn!
Post by Joseph Terner
COMMAND /C
könnte helfen, aber MS-DOS erlaubt Dir leider nicht, >> zu escapen.
ist ja auchz nicht nötig!
falsch!

Es ist lediglich der Fehler mit den "%" da.

Habe es gerade nachvollzogen

for %%X in (0*.txt) do echo. >> %%X

geht wie es der OP will!
Stefan Reuther
2011-01-09 16:45:40 UTC
Permalink
Post by Jens Fittig
Post by Joseph Terner
Post by Roland White
for %X in (0*.txt) do echo. >> %X
funktioniert das leider nicht (es wird lediglich eine Datei mit dem
Namen %X erzeugt).
Logisch, denn das >> %X wirkt auf FOR und nicht auf ECHO.
Völliger Unsinn!
Ganz schön laut mal wieder.
Post by Jens Fittig
Habe es gerade nachvollzogen
for %%X in (0*.txt) do echo. >> %%X
geht wie es der OP will!
Unter Windows XP vielleicht. Nicht unter MS-DOS 6.22. Denn dort wirkt
das '>> %x' (oder in der Batchdatei '>> %%x') tatsächlich auf das FOR,
nicht auf das ECHO, so dass eine Datei namens '%x' angelegt wird.

Und, ja, ich hab das gerade eben ausprobiert, unter MS-DOS 6.22, weil
ich den DOS-Rechner (wegen was anderem zwar) gerade mal wieder aufgebaut
habe. Robuste Technik übrigens, der muss jetzt so 5 Jahre lang unbenutzt
gewesen sein.


Stefan
Jens Fittig
2011-01-10 10:22:13 UTC
Permalink
Post by Stefan Reuther
Post by Jens Fittig
Post by Joseph Terner
Post by Roland White
for %X in (0*.txt) do echo. >> %X
funktioniert das leider nicht (es wird lediglich eine Datei mit dem
Namen %X erzeugt).
Logisch, denn das >> %X wirkt auf FOR und nicht auf ECHO.
Völliger Unsinn!
Ganz schön laut mal wieder.
Nicht ganz - die Aussage

"denn das >> %X wirkt auf FOR "

ist natürlich völliger Unsinn. %X "wirkt" überhaupt nirgends. Das ist
eine Variable, die belegt wird. Aber nicht "wirkt"
Post by Stefan Reuther
Post by Jens Fittig
Habe es gerade nachvollzogen
for %%X in (0*.txt) do echo. >> %%X
geht wie es der OP will!
Unter Windows XP vielleicht.
ACK
Post by Stefan Reuther
Nicht unter MS-DOS 6.22.
ACK - da habe ich es nicht getestet. Sorry - mein Ffehler!
Post by Stefan Reuther
Denn dort wirkt
das '>> %x' (oder in der Batchdatei '>> %%x') tatsächlich auf das FOR,
nicht auf das ECHO, so dass eine Datei namens '%x' angelegt wird.
wieder Unsinn! %x oder %%x "wirken" nirgends! Schon gar nicht auf das
FOR. Die FOR-Schleife wird korrekt abgearbeitet. Nur das hinter dem
"DO" wird verhunzt.

Der Fehler sitzt im Teil der Ausgabeumleitung nach dem DO innerhalb
der FOR-Schleife in Verbindung mit ECHO. Diese wird falsch
abgearbeitet. Das "Echo" wird entsprechend der Anzahl FOR-Elemente an
den Bildschirm ausgegeben. Und jedesmal die Datei %X erzeugt
Stefan Reuther
2011-01-10 18:04:14 UTC
Permalink
Post by Jens Fittig
Post by Stefan Reuther
Post by Jens Fittig
Post by Joseph Terner
Post by Roland White
for %X in (0*.txt) do echo. >> %X
funktioniert das leider nicht (es wird lediglich eine Datei mit dem
Namen %X erzeugt).
Logisch, denn das >> %X wirkt auf FOR und nicht auf ECHO.
Völliger Unsinn!
Ganz schön laut mal wieder.
Nicht ganz - die Aussage
"denn das >> %X wirkt auf FOR "
ist natürlich völliger Unsinn. %X "wirkt" überhaupt nirgends.
Aber '>> %X'. Der Operator '>>' mit seinem Operanden '%X' wirkt auf den
'for'-Befehl derart, dass die Ausgabe des 'for'-Befehls umgeleitet wird,
nicht wie intendiert die Ausgabe der individuellen 'echo'-Befehle.

Das kann man natürlich technisch exakter ausdrücken, von "völligem
Unsinn" ist es aber weit entfernt.


Stefan
Jens Fittig
2011-01-10 21:47:13 UTC
Permalink
Post by Stefan Reuther
Post by Jens Fittig
Post by Stefan Reuther
Post by Jens Fittig
Post by Joseph Terner
Post by Roland White
for %X in (0*.txt) do echo. >> %X
funktioniert das leider nicht (es wird lediglich eine Datei mit dem
Namen %X erzeugt).
Logisch, denn das >> %X wirkt auf FOR und nicht auf ECHO.
Völliger Unsinn!
Ganz schön laut mal wieder.
Nicht ganz - die Aussage
"denn das >> %X wirkt auf FOR "
ist natürlich völliger Unsinn. %X "wirkt" überhaupt nirgends.
Aber '>> %X'. Der Operator '>>' mit seinem Operanden '%X' wirkt auf den
'for'-Befehl derart, dass die Ausgabe des 'for'-Befehls umgeleitet wird,
nicht wie intendiert die Ausgabe der individuellen 'echo'-Befehle.
Das kann man natürlich technisch exakter ausdrücken, von "völligem
Unsinn" ist es aber weit entfernt.
Es ist und bleibt völliger Unsinn, wenn jemand behauptet, dass eine
Variable _wirkt_!

Auch eine Ausgabeumleitung _wirkt_ nicht auf das FOR, sondern sie ist
ein Teil des durch den FOR-Befehl ausgelösten Vorganges.

In einer Fachgruppe sollte man schon ein paar grundsätzliche
Formulierungssachen beachten und nicht irgend ein halblebiges
Stammtischpalaver loslassen.

EOD!
Hans-Bernhard Bröker
2011-01-10 23:39:52 UTC
Permalink
Post by Jens Fittig
Es ist und bleibt völliger Unsinn, wenn jemand behauptet, dass eine
Variable _wirkt_!
Es ist noch gröberer Unsinn, wenn jemand behauptet, irgendwer hätte hier
behauptet, dass hier irgendwo eine Variable wirkt.

Das Problem ist, dass du die umstrittene Aussage hier schlicht nicht
richtig gelesen hast.
Post by Jens Fittig
Auch eine Ausgabeumleitung _wirkt_ nicht auf das FOR, sondern sie ist
ein Teil des durch den FOR-Befehl ausgelösten Vorganges.
Nein. Ausgabeumleitungen sind nicht "Teil eines Vorganges", sondern ein
eigenständiger Vorgang, der auf andere Vorgänge wirkt.
Post by Jens Fittig
In einer Fachgruppe sollte man schon ein paar grundsätzliche
Formulierungssachen beachten und nicht irgend ein halblebiges
Stammtischpalaver loslassen.
Den Spruch solltest du dir ausschneiden und auf die eigene Nase tackern.
Dirk Wolfgang Glomp
2011-01-11 10:04:03 UTC
Permalink
Post by Hans-Bernhard Bröker
Post by Jens Fittig
Es ist und bleibt völliger Unsinn, wenn jemand behauptet, dass eine
Variable _wirkt_!
Es ist noch gröberer Unsinn, wenn jemand behauptet, irgendwer hätte hier
behauptet, dass hier irgendwo eine Variable wirkt.
Das Problem ist, dass du die umstrittene Aussage hier schlicht nicht
richtig gelesen hast.
Post by Jens Fittig
Auch eine Ausgabeumleitung _wirkt_ nicht auf das FOR, sondern sie ist
ein Teil des durch den FOR-Befehl ausgelösten Vorganges.
Nein. Ausgabeumleitungen sind nicht "Teil eines Vorganges", sondern ein
eigenständiger Vorgang, der auf andere Vorgänge wirkt.
Post by Jens Fittig
In einer Fachgruppe sollte man schon ein paar grundsätzliche
Formulierungssachen beachten und nicht irgend ein halblebiges
Stammtischpalaver loslassen.
Den Spruch solltest du dir ausschneiden und auf die eigene Nase tackern.
Ja wenn man es darauf anlegt, dann kann man alles mißverstehen.

Dirk
Bert Braun
2011-04-08 22:30:33 UTC
Permalink
Post by Jens Fittig
Post by Stefan Reuther
Post by Jens Fittig
Post by Stefan Reuther
Post by Jens Fittig
Post by Joseph Terner
Post by Roland White
for %X in (0*.txt) do echo. >> %X
funktioniert das leider nicht (es wird lediglich eine Datei mit dem
Namen %X erzeugt).
Logisch, denn das >> %X wirkt auf FOR und nicht auf ECHO.
Völliger Unsinn!
Ganz schön laut mal wieder.
Nicht ganz - die Aussage
"denn das >> %X wirkt auf FOR "
ist natürlich völliger Unsinn. %X "wirkt" überhaupt nirgends.
Aber '>> %X'. Der Operator '>>' mit seinem Operanden '%X' wirkt auf den
'for'-Befehl derart, dass die Ausgabe des 'for'-Befehls umgeleitet wird,
nicht wie intendiert die Ausgabe der individuellen 'echo'-Befehle.
Das kann man natürlich technisch exakter ausdrücken, von "völligem
Unsinn" ist es aber weit entfernt.
Es ist und bleibt völliger Unsinn, wenn jemand behauptet, dass eine
Variable _wirkt_!
Auch eine Ausgabeumleitung _wirkt_ nicht auf das FOR, sondern sie ist
ein Teil des durch den FOR-Befehl ausgelösten Vorganges.
In einer Fachgruppe sollte man schon ein paar grundsätzliche
Formulierungssachen beachten und nicht irgend ein halblebiges
Stammtischpalaver loslassen.
EOD!
Ahja, "Jens Fittig", der bekannte Wolfgang Gerber aus Neu-Ulm, wie er
leibt und lebt!

Diesen anerkannten und merkbefreiten Troll solltet Ihr hier nicht
ernsthaft füttern, der ist ohnehin nur auf Stunk und Ärger aus.


Gruß...Bert


--

Ulrich F. Heidenreich
2011-01-11 12:11:39 UTC
Permalink
Post by Stefan Reuther
Aber '>> %X'. Der Operator '>>' mit seinem Operanden '%X' wirkt auf den
'for'-Befehl derart, dass die Ausgabe des 'for'-Befehls umgeleitet wird,
nicht wie intendiert die Ausgabe der individuellen 'echo'-Befehle.
Gegenfrage: Was gibt denn der FOR-Befehl aus? Wenn überhaupt irgendetwas
außer konkret einem "Syntaxfehler" eigentlich doch eine Liste von auf
"0*.txt" matchenden Dateinamen. Daß da am Ende eine einzige Datei namens
%X herauskommt, halte ich für verwunderlich. Sie kommt aber.

Dagegen funktioniert ein "for %x in (0*.txt) do echo %x >> textlist" wie
erwartet. Eher scheint es mir daran zu liegen, daß die ">>"-Umleitung
als solche auf der *rechten* Seite keine FOR-Variablen expandiert.

CU!
Ulrich
--
Spamschleudern: http://invalid.de/spamsink.html
In 11 Monaten und 14 Tagen ist Weihnachten
QDYSC WPSQC B8772 M46EK 358TS U86OK V2W5U TWG79 BQ5DP
Stellt euch vor, es ist Dienstag und keiner geht hin!
Joseph Terner
2011-01-11 14:23:40 UTC
Permalink
Post by Ulrich F. Heidenreich
Dagegen funktioniert ein "for %x in (0*.txt) do echo %x >> textlist" wie
erwartet.
Probier's mal mit einem > anstelle von >> aus. Was steht anschließend in
der Datei?

ciao, Joseph
Ulrich F. Heidenreich
2011-01-11 15:05:54 UTC
Permalink
Post by Joseph Terner
Post by Ulrich F. Heidenreich
Dagegen funktioniert ein "for %x in (0*.txt) do echo %x >> textlist" wie
erwartet.
Probier's mal mit einem > anstelle von >> aus. Was steht anschließend in
der Datei?
Dann wird sie ständig überschrieben. Aber darum geht's doch gar nicht.

Offensichtlich wird bei "for %x in (foo.*) do echo %x >> bar.txt" das
%x expandiert, bei "for %x in (foo.*) do echo bar >> %x" das %x nicht.

CU!
Ulrich
--
Spamschleudern: http://invalid.de/spamsink.html
In 11 Monaten und 14 Tagen ist Weihnachten
OB1E7 TMNKJ M9BN4 FEEG8 6V84F AX2H1 CEBYY 5FODR 2JOCA
Stellt euch vor, es ist Dienstag und keiner geht hin!
Ulrich F. Heidenreich
2011-01-11 16:37:17 UTC
Permalink
Post by Ulrich F. Heidenreich
Offensichtlich wird bei "for %x in (foo.*) do echo %x >> bar.txt" das
%x expandiert, bei "for %x in (foo.*) do echo bar >> %x" das %x nicht.
So. Und jetzt glaube ich auch diese unglückliche "Wirkt auf"-
Formulierung kapiert zu haben:

Ein "for %x in (foo.*) do echo bar" echoet entsprechend oft "bar" an
den Stdout. Ein "for %x in (foo.*) do echo %x" echoet dagegen alle
auf "foo.*" matchende Namen an Stdout.

Ob dahinter eine ">>"-Umleitung folgt, weiß FOR/ECHO genausowenig,
wie das Umleitungsziel wissen kann, was %X bedeutet.

Habe ich es so richtig verstanden?

CU!
Ulrich
--
Spamschleudern: http://invalid.de/spamsink.html
In 11 Monaten und 14 Tagen ist Weihnachten
FYE3S 8Y9BN 5HDO4 E7V87 K6N8G WZ1WT DLN1F 2HJTR 6112L
Stellt euch vor, es ist Dienstag und keiner geht hin!
Stefan Reuther
2011-01-11 17:24:36 UTC
Permalink
Post by Ulrich F. Heidenreich
Post by Joseph Terner
Post by Ulrich F. Heidenreich
Dagegen funktioniert ein "for %x in (0*.txt) do echo %x >> textlist" wie
erwartet.
Probier's mal mit einem > anstelle von >> aus. Was steht anschließend in
der Datei?
Dann wird sie ständig überschrieben. Aber darum geht's doch gar nicht.
Offensichtlich wird bei "for %x in (foo.*) do echo %x >> bar.txt" das
%x expandiert, bei "for %x in (foo.*) do echo bar >> %x" das %x nicht.
command.com wertet zuerst die Umleitungsoperatoren aus. Im ersten Fall
sieht sie also, dass da eine Datei 'bar.txt' erzeugt werden soll, im
zweiten Fall eine Datei '%x'. Das notiert sie jetzt irgendwo und geht
dann zur Auswertung des eigentlichen Befehls über, aus dem die Umleitung
ausgeschnitten wurde (dass das Ausschneiden funktioniert, sieht man z.B.
mit "echo foo >bar quux").

Es bleibt also der for-Befehl ohne die Umleitung über. Nur in dem übrig-
bleibenden Text wird der %-Platzhalter ersetzt, da dies eine Funktion
des for-Befehls ist. Der for-Befehl bekommt also das ">> %x" nie zu sehen.

Da command.com recht primitiv ist, wird nun die oben notierte Umleitung
auf jeden einzelnen Befehl angewendet (anstatt auf den kompletten
for-Befehl insgesamt), da command.com eben offenbar über die
Funktionalität "führe einen Befehl mit Umleitung aus" verfügt, aber
nicht "führe einen Befehl mit Umleitung aus, lass die Umleitung aber
nachher stehen".

Aus einer ähnlichen Ecke kommt übrigens dann auch der Grund, warum die
Prozentzeichen bei for in Batchdateien doppelt angegeben werden müssen.
In Batchdateien kommt vor der Auswertung der Umleitungsoperatoren ein
weiterer Schritt, in dem alle %foo% durch den Inhalt der entsprechenden
Variablen ersetzt werden, indem direkt der Befehl textuell umgeschrieben
wird. Das sieht man ja bei "echo on" sehr schön. Dieser Schritt würde
die einzelnen Prozentzeichen von for fressen. Im interaktiven Betrieb
wird dieser Schritt nicht ausgeführt.


Stefan
Joseph Terner
2011-01-12 08:29:33 UTC
Permalink
Post by Stefan Reuther
command.com wertet zuerst die Umleitungsoperatoren aus. Im ersten Fall
sieht sie also, dass da eine Datei 'bar.txt' erzeugt werden soll, im
zweiten Fall eine Datei '%x'. Das notiert sie jetzt irgendwo und geht
dann zur Auswertung des eigentlichen Befehls über, aus dem die Umleitung
ausgeschnitten wurde (dass das Ausschneiden funktioniert, sieht man z.B.
mit "echo foo >bar quux").
Es bleibt also der for-Befehl ohne die Umleitung über. Nur in dem übrig-
bleibenden Text wird der %-Platzhalter ersetzt, da dies eine Funktion
des for-Befehls ist. Der for-Befehl bekommt also das ">> %x" nie zu sehen.
So ist es. Aber es gibt eine Lösung. FreeCOM[1] nämlich (der COMMAND.COM
aus FreeDOS) wertet nämlich

for %X in (0*.txt) do echo. >> %X

exakt wie gewünscht aus. Damit ist er natürlich nicht bug-kompatibel zu
MS-DOS, aber es funktioniert. FreeCOM sollte auch unter MS-DOS laufen.

ciao, Joseph

[1] http://www.freedos.org/freecom/
Ulrich F. Heidenreich
2011-01-12 10:56:51 UTC
Permalink
Post by Stefan Reuther
Post by Ulrich F. Heidenreich
Post by Joseph Terner
Post by Ulrich F. Heidenreich
Dagegen funktioniert ein "for %x in (0*.txt) do echo %x >> textlist" wie
erwartet.
Probier's mal mit einem > anstelle von >> aus. Was steht anschließend in
der Datei?
Dann wird sie ständig überschrieben. Aber darum geht's doch gar nicht.
Offensichtlich wird bei "for %x in (foo.*) do echo %x >> bar.txt" das
%x expandiert, bei "for %x in (foo.*) do echo bar >> %x" das %x nicht.
command.com wertet zuerst die Umleitungsoperatoren aus. Im ersten Fall
sieht sie also, dass da eine Datei 'bar.txt' erzeugt werden soll, im
zweiten Fall eine Datei '%x'. Das notiert sie jetzt irgendwo und geht
dann zur Auswertung des eigentlichen Befehls über, aus dem die Umleitung
ausgeschnitten wurde (dass das Ausschneiden funktioniert, sieht man z.B.
mit "echo foo >bar quux").
Ich sehe es - allerdings mit demselben Schluss :o) - geringfügig anders:

ECHO schreibt an StdOut. Mit "for %x in (foo.*) do echo bar" wird
(je nach Anzahl der "Foo"s) n-mal "bar" nach StdOut geschrieben. Die
Expansion von "%x" geht dabei ins Niemandsland.

CU!
Ulrich
--
Spamschleudern: http://invalid.de/spamsink.html
In 11 Monaten und 13 Tagen ist Weihnachten
RLE93 BLY3A G3HFR AAGZT 6537X 6IQ2F FQ9MF W9I6X AOOCW
Stellt euch vor, es ist Mittwoch und keiner geht hin!
Christoph 'Mehdorn' Weber
2011-01-22 12:22:45 UTC
Permalink
Hallo!
Post by Jens Fittig
Der Fehler sitzt im Teil der Ausgabeumleitung nach dem DO
innerhalb der FOR-Schleife in Verbindung mit ECHO. Diese wird
falsch abgearbeitet.
Sicher, daß das falsch ist? Zumindest bei MS-DOS 5 ist es
dokumentiert, daß es genau so ablaufen soll, wie das hier bei
6.22 aufgetreten ist. (Eine Doku zu 6.22 habe ich gerade nicht
greifbar, aber prinzipiell könnte es dort wegen Kompatibilität
genauso sein.)


Aber in der Hinsicht ist die Bourne Shell schon schöner. Da muß
man sein "for" explizit mit einem done abschließen und je nachdem,
ob man die Umleitung vorher oder hinterher macht, wird sie dem
Befehl in der Schleife oder der Schleife selbst zugeordnet. Aber
das hat eher wenig mit DOS zu tun.

Christoph
--
100MHz Bustakt? Bei uns kommen die nur alle 20 Minuten?!
(Markus Fieber)
Ulrich F. Heidenreich
2011-01-22 14:38:25 UTC
Permalink
Post by Christoph 'Mehdorn' Weber
Post by Jens Fittig
Der Fehler sitzt im Teil der Ausgabeumleitung nach dem DO
innerhalb der FOR-Schleife in Verbindung mit ECHO. Diese wird
falsch abgearbeitet.
Sicher, daß das falsch ist?
Ich bin sicher, daß das richtig (wenn auch nicht unbedingt auf den
ersten Blick zu erwarten) ist:

Der FOR-Befehlt ECHOt in dem Fall keine einzige Expansion seines
%x an StdOut. Eine ">>"-Umleitung des StdOut an %x wird demzufolge
genau das machen, was sie auch tatsächlich tut: StdOut an eine Datei
Namens %x anfügen.

CU!
Ulrich
--
Spamschleudern: http://invalid.de/spamsink.html
In 11 Monaten und 3 Tagen ist Weihnachten
XZ78A C2FZ3 UNWV7 SKEB5 GIP7Q HABDW 6SYC5 03SQI 6U25L
Stellt euch vor, es ist Samstag und keiner geht hin!
Ulrich F. Heidenreich
2011-01-10 16:12:58 UTC
Permalink
Post by Stefan Reuther
Unter Windows XP vielleicht. Nicht unter MS-DOS 6.22. Denn dort wirkt
das '>> %x' (oder in der Batchdatei '>> %%x') tatsächlich auf das FOR,
nicht auf das ECHO, so dass eine Datei namens '%x' angelegt wird.
"Es wirke auf das FOR" ist irgendwie ungeschickt formuliert.

Wie so oft in DOS klappt dort die Output-Redirection wohl nicht
konsequent. Mein Standarkandidat dazu ist immer die Batchdatei WORLD.BAT
in der ein "Echo Hello World" steht. Der Aufruf "WORLD.BAT > EGAL.TXT"
sollte eigentlich[TM] das Hello World in EGAL.TXT und nicht auf dem
Schirm aufschlagen lassen. Tut's aber nicht.

CU!
Ulrich
--
Spamschleudern: http://invalid.de/spamsink.html
In 11 Monaten und 15 Tagen ist Weihnachten
9ZPMX SKX1W QFHFG 8GTAX DVP4F C80PI YGL85 XJBML P4PYL
Stellt euch vor, es ist Montag und keiner geht hin!
Ulrich F. Heidenreich
2011-01-09 17:38:11 UTC
Permalink
Post by Jens Fittig
Post by Joseph Terner
Post by Roland White
for %X in (0*.txt) do echo. >> %X
funktioniert das leider nicht (es wird lediglich eine Datei mit dem
Namen %X erzeugt).
Habe ich BTW gerade berflüffenderweise nachvollziehen können.
Post by Jens Fittig
Post by Joseph Terner
Logisch, denn das >> %X wirkt auf FOR und nicht auf ECHO.
Völliger Unsinn!
Die Erklärung mag vielleicht etwas ungeschickt sein, aber irgendwas geht
das definitiv schief.
Post by Jens Fittig
Es ist lediglich der Fehler mit den "%" da.
Habe es gerade nachvollzogen
for %%X in (0*.txt) do echo. >> %%X
geht wie es der OP will!
Dann mache das mal außerhalb einer Batchdatei mit einfachem % und
wundere Dich genauso wie ich:

|G:\Dokumente\Desktop>for %X in (*.txt) do echo. >> %X
|
|G:\Dokumente\Desktop>echo.
|
|G:\Dokumente\Desktop>echo.
|
|G:\Dokumente\Desktop>echo.
|
|G:\Dokumente\Desktop>echo.
|
|G:\Dokumente\Desktop>echo.
|
|G:\Dokumente\Desktop>echo.
|
|G:\Dokumente\Desktop>echo.
|
|G:\Dokumente\Desktop>echo.

Die for/do-Schleife scheint sich höchst offensichtlich nicht daran zu
scheren, daß ihre Ausgabe eigentlich an %X angehängt gehört, sondern
schreibt die "echo." schön brav an StdOut.

CU!
Ulrich
--
Spamschleudern: http://invalid.de/spamsink.html
In 11 Monaten und 16 Tagen ist Weihnachten
T01FQ B9WN0 A2Z4V WC330 TNFKA 3DHSJ D2AJB 6CQEI NAGE4
Stellt euch vor, es ist Sonntag und keiner geht hin!
Loading...