alfabravo
Goto Top

Echo Befehl (Batch) in Verbindung mit Anführungszeichen klappt nicht

Hallo Forum !

Ich möchte bestimmte Zeilen aus der Quelle.txt auslesen und mit echo>> in die Ziel.txt schreiben.
Sobald in einer Zeile der Quelle.txt Anführungzeichen stehen, klappt der echo-Befehl aber nicht mehr.

Dies ist das Skript:
@echo off

FOR /F "usebackq delims=" %%L in ("Quelle.txt") do call :ProcessLine "%%L"   

exit

:ProcessLine

set Line=%~1
set Line=%Line:&=^&%

echo>> "Ziel.txt" %Line%  

goto :eof

Und dies kommt dabei raus:

--- Inhalt der Quelldatei Quelle.txt ---

Diese Zeile soll "kopiert werden".
Diese Zeile soll "kopiert werden".
Diese Zeile soll "kopiert werden".
Diese Zeile soll auch kopiert werden.

--- Inhalt der Zieldatei Ziel.txt ---

Diese Zeile soll "kopiert
Diese Zeile soll "kopiert
Diese Zeile soll "kopiert
Diese Zeile soll auch kopiert werden.

Das "-Zeichen wird offensichtlich als Kommando interpretiert, ähnlich wie beim &-Zeichen, welches man ja wie im Skript escapen kann.
Hat jemand eine Erklärung dafür und weiß, wie sich das "Abhacken" der Zeile verhindern lässt?

Bin für jeden Ratschlag wie immer dankbar !

[Edit Biber] Codeformatierung [/Edit]

Content-Key: 158923

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

Printed on: April 23, 2024 at 23:04 o'clock

Member: mathe172
mathe172 Jan 18, 2011 at 21:13:18 (UTC)
Goto Top
Hallo alfabravo!

Versuch mal die echo-Zeile durch
echo(%Line%>>"Ziel.txt"  
zu ersetzen. Sollte gehen....

Mathe172

[Edit: Der Fehler liegt nicht hier, sondern in der For-Zeile, das "%%L" wird zu "Diese Zeile soll auch "kopiert werden".", was mehreren Parametern entspricht.]
Member: pieh-ejdsch
pieh-ejdsch Jan 18, 2011 at 21:42:55 (UTC)
Goto Top
moin alphabravo,

erstmal setz bitte Deinen Code in CodeTags so hier
<code>
Meine Codezeilen
</code>
zweitens in der Forschleife
call :ProcessLine "%%L"
wird niemalsnicht in der Sub :ProcessLine den Paramter %~1 so Komplett empfangen können
sowas nimmt man nur (vorzugsweise bastla) wenn Pfad- und Dateinamen verarbeitet werden. Da sind nämlich keine Anführungszeichen drinnen.
hier was zum testen in der CMD-Line
(echo @echo Parameter1 %~1.&echo @echo Parameter2 %~2.&echo @echo Parameter3 %~3.)>Test.cmd&test.cmd "Diese Zeile soll "kopiert werden"."
da kommst Du besser, Du setzt die komplette Zeile in eine Variable machst dann den call und in der Sub arbeitest Du mit der Variable direkt weiter.
wenn Du die Variable mit der Verzögerten Variablenauflösung darstellst dann klappst auch mit dem echo davor - und Du brauchst auch keine SonderZeichen extra zu maskieren.
drittens
echo>> "Ziel.txt" %Line%
wat dat denn? Schreibfehler? Das Meinst Du dann ehern so hier, wenn Du vorher setlocal enabledelayedexpansion benutzt.
>"Ziel.txt" echo !Line!
und somit entfällt Deine MaskierungsZeile

Ich möchte bestimmte Zeilen aus der Quelle.txt auslesen und mit echo>> in die Ziel.txt schreiben.
und welche Zeilen sollen das sein?
ich bin ja so direkt kein Verfechter der call :Prozesslines "%%l" bei Textverarbeitung. Da arbeite ich den ganzen Schrutz meist in der Forschleife so ab.
was aber so keinen Sinn hätte - ausser die LeerZeilen zu löschen.
@echo off
(
FOR /F "usebackq delims=" %%L in ("Quelle.txt") do (  
	echo %%L
)
)>"Ziel.txt"  

Gruß Phil
Member: jeb-the-batcher
jeb-the-batcher Jan 18, 2011 at 22:20:55 (UTC)
Goto Top
Hallo alphabravo,

@pieh-ejdsch: Da schreib ich hier den Text, und wer ist schneller ....

[200 Lines deleted]


Zitat von @pieh-ejdsch:
echo>> "Ziel.txt" %Line%
wat dat denn? Schreibfehler? Das Meinst Du dann ehern so hier, wenn Du vorher setlocal enabledelayedexpansion benutzt.

Kein Schreibfehler, ist vollkommen erlaubt und immer noch besser als
echo %Line%>> "Ziel.txt"  
Weil das fehlschlägt wenn das letzte Zeichen in %Line% eine Zahl ist.

Allgemein gilt, Redirections kann man praktisch an jede Stelle packen und auch beliebig viele davon.

Daher klappt auch sowas einfaches wie die kleine ...

"drei.bat"
@echo off
<:zwei <nul echo eins & call :zwei
echo %0

Gruß
jeb
Member: bastla
bastla Jan 18, 2011 at 23:41:05 (UTC)
Goto Top
Hallo @all!

Vielleicht nur, um nicht die eigentliche Zielsetzung aus den Augen zu verlieren: Ob wohl ein oder mehrere (je nachdem, wie letztlich die Zeilen "bestimmt" werden)
>>Ziel.txt findstr "Zeile" Quelle.txt
schon reichen würden? face-wink
Ansonsten bin ich, was das "Mitnehmen" der Zeile in das Unterprogramm in einer eigenen Variablen angeht, ganz bei PH ...

Grüße
bastla
Member: alfabravo
alfabravo Jan 19, 2011 at 08:13:42 (UTC)
Goto Top
Zunächst einmal vielen Dank für die Resonanz!! Leider bin ich trotz Eurer Vorschläge noch nicht weitergekommen, was aber an meinen quasi nicht vorhandenen Programmierkenntnissen liegt.
Das obige Skript hatte ich etwas gekürzt um das ganze übersichtlich zu machen. Da aber schon die Frage aufkam, wie die zu kopierenden Zeilen überhaupt bestimmt werden, hier mal das komplette "Konzept":

Ziel ist, die Datei "Quelle.txt" zu splitten.
Die Zeilen, in denen an der 5. Stelle die Ziffer "4" steht sollen in die Ziel1.txt geschrieben werden.
Die Zeilen, in denen an der 5. Stelle die Ziffer "5" steht sollen in die Ziel2.txt geschrieben werden.

Also:

--- Quelle.txt ---
10004 Diese Zeile soll "kopiert werden".
20004 Diese Zeile soll "kopiert werden".
30005 Diese Zeile soll auch "kopiert werden".
40005 Diese Zeile soll auch "kopiert werden".
50004 Diese Zeile soll "kopiert werden".

Gewünschtes Ergebnis:

--- Ziel1.txt ---
10004 Diese Zeile soll "kopiert werden".
20004 Diese Zeile soll "kopiert werden".
50004 Diese Zeile soll "kopiert werden".

--- Ziel2.txt ---
30005 Diese Zeile soll auch "kopiert werden".
40005 Diese Zeile soll auch "kopiert werden".

Bisheriges Skript:

@echo off

FOR /F "usebackq delims=" %%L in ("Quelle.txt") do call :ProcessLine "%%L"   

exit

:ProcessLine

set Line=%~1
set Marker=%Line:~4,1%
set Line=%Line:&=^&%

IF %Marker% == 4 echo>> "Ziel1.txt" %Line%  
IF %Marker% == 5 echo>> "Ziel2.txt" %Line%  

goto :eof

Codevorschläge sind herzlich Willkommen.
Member: bastla
bastla Jan 19, 2011 at 09:37:36 (UTC)
Goto Top
Hallo alfabravo!

Etwa so:
@echo off & setlocal
set "Quelle=D:\Quelle.txt"  
set "Ziel4=D:\Ziel1.txt"  
set "Ziel5=D:\Ziel2.txt"  

>"%Ziel4%" findstr /b "....4" "%Quelle%"  
>"%Ziel5%" findstr /b "....5" "%Quelle%"  
Grüße
bastla
Member: alfabravo
alfabravo Jan 19, 2011 at 12:49:59 (UTC)
Goto Top
Hallo bastla,

das funktioniert super. Schön kompakt und tut was es soll. Vielen Dank !