Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: alfabravo

alfabravo (Level 1) - Jetzt verbinden

18.01.2011, aktualisiert 22:12 Uhr, 7280 Aufrufe, 7 Kommentare

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:
01.
@echo off 
02.
 
03.
FOR /F "usebackq delims=" %%L in ("Quelle.txt") do call :ProcessLine "%%L"  
04.
 
05.
exit 
06.
 
07.
:ProcessLine 
08.
 
09.
set Line=%~1 
10.
set Line=%Line:&=^&% 
11.
 
12.
echo>> "Ziel.txt" %Line% 
13.
 
14.
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]
Mitglied: mathe172
18.01.2011 um 22:13 Uhr
Hallo alfabravo!

Versuch mal die echo-Zeile durch
01.
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.]
Bitte warten ..
Mitglied: pieh-ejdsch
18.01.2011 um 22:42 Uhr
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.
01.
@echo off 
02.
03.
FOR /F "usebackq delims=" %%L in ("Quelle.txt") do ( 
04.
	echo %%L 
05.
06.
)>"Ziel.txt"
Gruß Phil
Bitte warten ..
Mitglied: jeb-the-batcher
18.01.2011 um 23:20 Uhr
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
01.
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"
01.
@echo off 
02.
<:zwei <nul echo eins & call :zwei 
03.
echo %0
Gruß
jeb
Bitte warten ..
Mitglied: bastla
19.01.2011 um 00:41 Uhr
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?
Ansonsten bin ich, was das "Mitnehmen" der Zeile in das Unterprogramm in einer eigenen Variablen angeht, ganz bei PH ...

Grüße
bastla
Bitte warten ..
Mitglied: alfabravo
19.01.2011 um 09:13 Uhr
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:

01.
@echo off 
02.
 
03.
FOR /F "usebackq delims=" %%L in ("Quelle.txt") do call :ProcessLine "%%L"  
04.
 
05.
exit 
06.
 
07.
:ProcessLine 
08.
 
09.
set Line=%~1 
10.
set Marker=%Line:~4,1% 
11.
set Line=%Line:&=^&% 
12.
 
13.
IF %Marker% == 4 echo>> "Ziel1.txt" %Line% 
14.
IF %Marker% == 5 echo>> "Ziel2.txt" %Line% 
15.
 
16.
goto :eof
Codevorschläge sind herzlich Willkommen.
Bitte warten ..
Mitglied: bastla
19.01.2011 um 10:37 Uhr
Hallo alfabravo!

Etwa so:
01.
@echo off & setlocal 
02.
set "Quelle=D:\Quelle.txt" 
03.
set "Ziel4=D:\Ziel1.txt" 
04.
set "Ziel5=D:\Ziel2.txt" 
05.
 
06.
>"%Ziel4%" findstr /b "....4" "%Quelle%" 
07.
>"%Ziel5%" findstr /b "....5" "%Quelle%"
Grüße
bastla
Bitte warten ..
Mitglied: alfabravo
19.01.2011 um 13:49 Uhr
Hallo bastla,

das funktioniert super. Schön kompakt und tut was es soll. Vielen Dank !
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Echo in Batch schreibt vorab eine 1 (1)

Frage von chappy72 zum Thema Batch & Shell ...

LAN, WAN, Wireless
gelöst Router Switch zwei APs Verbindung klappt nicht (16)

Frage von c3t1n57 zum Thema LAN, WAN, Wireless ...

Batch & Shell
gelöst BATCH: Minuszeichen in set-Befehl (3)

Frage von Schottenrock zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...