in mehreren Dateien Anführungszeichen entfernen
Hallo allerseits,
ich bin neu im Forum und ein absoluter anfänger in batch
mein problem:
ich möchte aus mehreren Dateien Anführungszeichen entfernen. WIe ich dies für eine Datei mache habe ich mittlerweile hinbekommen.
Ich möchte es jetzt aber mit mehreren Dateien machen und das möglichst als schleife ausführen.
Lieder scheitere ich an der übergabe des entsprechenden dateinnamen. ich bekomme es leider nicht vernünftig hin eine variable zwischen zwei batchdateien zu übergeben.
kann mir jemand helfen
(sorry ich weiß das Problem nicht so kompliziert, aber ich habe es versucht und bin kläglich gescheitert und mir läuft momentan die Zeit davon.... )
vielen dank für die Mühe
ich bin neu im Forum und ein absoluter anfänger in batch
mein problem:
ich möchte aus mehreren Dateien Anführungszeichen entfernen. WIe ich dies für eine Datei mache habe ich mittlerweile hinbekommen.
Ich möchte es jetzt aber mit mehreren Dateien machen und das möglichst als schleife ausführen.
Lieder scheitere ich an der übergabe des entsprechenden dateinnamen. ich bekomme es leider nicht vernünftig hin eine variable zwischen zwei batchdateien zu übergeben.
kann mir jemand helfen
(sorry ich weiß das Problem nicht so kompliziert, aber ich habe es versucht und bin kläglich gescheitert und mir läuft momentan die Zeit davon.... )
vielen dank für die Mühe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 86515
Url: https://administrator.de/forum/in-mehreren-dateien-anfuehrungszeichen-entfernen-86515.html
Ausgedruckt am: 22.04.2025 um 08:04 Uhr
15 Kommentare
Neuester Kommentar
In der ersten Batchdatei gehst du jede Datei durch indem du die zweite dann so aufrufst:
In der Datei Verarbeite.bat kanst du dann den, als Parameter übergebenen Dateinamen dann mit der Variable %1 abholen.
Also in der Datei entweder direkt als %1 ansprechen oder in der Form:
FOR /F "delims=" %%i in ('dir /B C:\Verzeichnis\*.*') do call Verarbeite.bat "%%~fi"
So werden nun die einzelnen dateinamen der Verarbeite.bat übergeben. Natürlich kann der Filter *.* angepast werden.In der Datei Verarbeite.bat kanst du dann den, als Parameter übergebenen Dateinamen dann mit der Variable %1 abholen.
Also in der Datei entweder direkt als %1 ansprechen oder in der Form:
set Dateiname=%1
Moin zweehh,
willkommen im Forum.
Ein klein bissi abstrakt für eine Frage zu einem Skriptproblem ist Deine Beschreibung schon, hmm?
Aber egal, ich kann ja auf der selben Ebene antworten.
Wenn "ScrapQuotes.cmd D:\Eine\Textdatei.xyz" der Batch-Aufruf ist, der aus einer Textdatei die Anführungszeichen entfernt,
dann würden mehrere Dateien so abgefackelt werden können (Bsp am CMD-Prompt):
Für konkretere Antworten bitte konkreteren Sachverhalt posten.
Grüße
Biber
willkommen im Forum.
Ein klein bissi abstrakt für eine Frage zu einem Skriptproblem ist Deine Beschreibung schon, hmm?
Aber egal, ich kann ja auf der selben Ebene antworten.
Wenn "ScrapQuotes.cmd D:\Eine\Textdatei.xyz" der Batch-Aufruf ist, der aus einer Textdatei die Anführungszeichen entfernt,
dann würden mehrere Dateien so abgefackelt werden können (Bsp am CMD-Prompt):
For %i in (D:\Viele\Textdateien*.*) do ScrapQuotes "%i"
Für konkretere Antworten bitte konkreteren Sachverhalt posten.
Grüße
Biber
Moin zweehh,
ich würde es in einen Batch statt in zwei packen.
Bei Deinem Schnipsel ist ein Problem, dass Du in der ersten FOR-Anweisung EINEN Dateinamen als Parameter übergibst...
Du kannst beide FOR-Einzelzeilen (in Deinem Posting) jeweils am CMD-Prompt testen
Bsp:
Grüße
Biber
[Edit] "EnableDelayedExpansion" nachgetragen, s.u. [/Edit]
ich würde es in einen Batch statt in zwei packen.
@echo off & setlocal EnableDelayedExpansion
FOR /F "delims=" %%i in ('dir /B E:\test\*.txt') do (
FOR /F "delims=" %%j in ("%%~i") do set "line=%%j" & echo !line:"=!
)
Bei Deinem Schnipsel ist ein Problem, dass Du in der ersten FOR-Anweisung EINEN Dateinamen als Parameter übergibst...
do call verarbeite.bat "%%~fi"
...und im verarbeite.bat aber an diesen Parameter1 noch eine Endung .txt anhängst.Du kannst beide FOR-Einzelzeilen (in Deinem Posting) jeweils am CMD-Prompt testen
- indem Du alle doppelten Prozentzeichen auf einfache änderst
- und statt "DO .." zum Testen "DO @echo ...." schreibst
Bsp:
FOR /F "delims=" %i in ('dir /B E:\test\*.txt') do @echo call verarbeite.bat "%~fi"
Grüße
Biber
[Edit] "EnableDelayedExpansion" nachgetragen, s.u. [/Edit]
Liegt hier vielleicht das Problem?
nein... ist eher eins meiner Montagmorgens-Probleme*rotwerd* ...
Ergänze bitte die erste Zeile in Deinem Batch
Von JETZT GUT:
@echo off & Setlocal
Auf GUTER:
@echo off & Setlocal EnableDelayedExpansion
Ich trag es auch oben nach.
[Erst damit interpretiert die CMD.exe die !var! (Variablen in Ausrufezeichen richtig.
Ich habe es bei mir am Rechner als Standardeinstellung, deshalb habe ich nicht daran gedacht.
Sorry
Biber
Moin zweeHH,
Du gehst bei irgendwo im Internet geposteten Schnipseln davon aus, dass sie weniger als zwei Fehler pro Zeile enthalten und dass Du nach einem schnellen Copy & Paste heute mal zeitig Feierabend machen kannst....
Okay, das ist wirklich nicht so - ich habe in dem (wieder mal!) nicht getesteten Anderthalbzeiler gleich mehrere Bugs versteckt.
Aber jetzt hab ich die Zeile wenigstens mal vom CMD-Prompt aus getestet und behaupte bis auf weiteres:
Funktionierende Version:
Diese eine ergänzte Option "usebackq" bewirkt, dass die Anführungszeichen in der zweiten FOR /F -Anweisung nicht als Wort-Begrenzer gewertet (und entfernt) werden, sondern dass diese Anführungszeichen in diesem Fall mit zu dem Namen einer Datei gehören.
Etwas weniger abstrakt ein Beispiel am CMD-Prompt:
Im ersten Fall wird "x.txt" einfach nur als Text blind durchgereicht... ich hätte ebensogut ein "Hallo" oder ein "Merkel" statt "x.txt" verwenden können.
Im zweiten Fall wird dagegen nach dem Inhalt von "x.txt", also nach einer Datei x.txt gesucht.
Und die paar enthaltenen Zeilen Inhalt angezeigt (s.o.).
Wenn keine Datei da wäre, dann wäre das Ergebnis:
Und das ich überhaupt Anführungszeichen um alle Dateiangaben herumgewickelt habe ist in den vielen Windows-Pfad- und Dateinamen begründet, die "Leerzeichen im Namen" haben.
Diese müssen bei fast allen CMD-Befehlen in Anführungszeichen gesetzt werden, um als "ein Parameter aus mehreren Worten bestehend" erkannt zu werden.
Grüße
Biber
ich hab zwischen zeitlich aufgegeben und die Dateien per Hand geändert.
Das tut mir leid.Nun packt mich doch noch mein Ergeiz und ich würd gern wissen wie es geht.
Das wiederum finde ich gut.Was mach ich falsch?
Hmm - eigentlich machst Du nur den beliebtesten Programmierer-Fehler:Du gehst bei irgendwo im Internet geposteten Schnipseln davon aus, dass sie weniger als zwei Fehler pro Zeile enthalten und dass Du nach einem schnellen Copy & Paste heute mal zeitig Feierabend machen kannst....
Okay, das ist wirklich nicht so - ich habe in dem (wieder mal!) nicht getesteten Anderthalbzeiler gleich mehrere Bugs versteckt.
Aber jetzt hab ich die Zeile wenigstens mal vom CMD-Prompt aus getestet und behaupte bis auf weiteres:
Funktionierende Version:
@echo off & setlocal EnableDelayedExpansion
FOR /F "delims=" %%i in ('dir /B E:\test\*.txt') do (
FOR /F "usebackq delims=" %%j in ("%%~i") do set "line=%%j" & echo !line:"=!
)
Diese eine ergänzte Option "usebackq" bewirkt, dass die Anführungszeichen in der zweiten FOR /F -Anweisung nicht als Wort-Begrenzer gewertet (und entfernt) werden, sondern dass diese Anführungszeichen in diesem Fall mit zu dem Namen einer Datei gehören.
Etwas weniger abstrakt ein Beispiel am CMD-Prompt:
>for /f %i in ("x.txt") do @echo %i
x.txt
>for /f "usebackq" %i in ("x.txt") do @echo %i
A
800
TERRAIN
BASE_TEX_NOWRAP
Im zweiten Fall wird dagegen nach dem Inhalt von "x.txt", also nach einer Datei x.txt gesucht.
Und die paar enthaltenen Zeilen Inhalt angezeigt (s.o.).
Wenn keine Datei da wäre, dann wäre das Ergebnis:
>for /f "usebackq" %i in ("y.txt") do @echo %i
Die Datei "y.txt" kann nicht gefunden werden.
Und das ich überhaupt Anführungszeichen um alle Dateiangaben herumgewickelt habe ist in den vielen Windows-Pfad- und Dateinamen begründet, die "Leerzeichen im Namen" haben.
Diese müssen bei fast allen CMD-Befehlen in Anführungszeichen gesetzt werden, um als "ein Parameter aus mehreren Worten bestehend" erkannt zu werden.
Grüße
Biber
Moin zweeHH,
"wie er es in direkt in die Datei schreibt" ist nicht ganz die richtige Formulierung.
In dieselbe Datei schreiben geht nicht bzw,. nur über den kleinen Umweg, erst eine neue Datei zu erzeugen und diese dann unter dem ursprünglichen Namen zu speichern.
--> Aber das machen wir erst, wenn alles stabil läuft.
Der jetzt sinnvolle Schritt --> Für jede "Quelldatei*.txt" eine "Quelldatei*_OA.txt erzeugen.
Die Ergänzung >>"%%~dpni_OA.txt" heißt übersetzt:
Löse von der Variablen %%i die Details d,p,n (Drive, Path, Name) auf und hänge "_OA.txt" an.
Und dahin (also z.B "E:\Test\QuelldateiXy_OA.txt") leite die Bildschirmausgabe um.
So in etwa wäre die Skizze... ob Du die Dateien-ohne-Anführungszeichen nun im selben Verzeichnis anlegst
oder im %Temp%-Verzeichnis und ob der Zusatz "_OA" sinnvoll bzw. ästhetisch ist....
das ist sicherlich nochmal zu überdenken.
Ich würde wahrscheinlich alle Quelldateien ("E:\test\*.txt") unverändert lassen und alle Dateien ohne Anführungszeichen unter demselben Namen in ein anderes Verzeichnis schreiben.
Bsp: alle "neuen" Dateien nach "E:\Test\OhneAnf" schreiben:
[wobei das Ziel-Verzeichnis vorher da sein sollte]
Grüße
Biber
"wie er es in direkt in die Datei schreibt" ist nicht ganz die richtige Formulierung.
In dieselbe Datei schreiben geht nicht bzw,. nur über den kleinen Umweg, erst eine neue Datei zu erzeugen und diese dann unter dem ursprünglichen Namen zu speichern.
--> Aber das machen wir erst, wenn alles stabil läuft.
Der jetzt sinnvolle Schritt --> Für jede "Quelldatei*.txt" eine "Quelldatei*_OA.txt erzeugen.
@echo off & setlocal EnableDelayedExpansion
FOR /F "delims=" %%i in ('dir /B E:\test\*.txt') do (
FOR /F "usebackq delims=" %%j in ("%%~i") do (
set "line=%%j"
echo !line:"=! >>"%%~dpni_OA.txt"
))
Die Ergänzung >>"%%~dpni_OA.txt" heißt übersetzt:
Löse von der Variablen %%i die Details d,p,n (Drive, Path, Name) auf und hänge "_OA.txt" an.
Und dahin (also z.B "E:\Test\QuelldateiXy_OA.txt") leite die Bildschirmausgabe um.
So in etwa wäre die Skizze... ob Du die Dateien-ohne-Anführungszeichen nun im selben Verzeichnis anlegst
oder im %Temp%-Verzeichnis und ob der Zusatz "_OA" sinnvoll bzw. ästhetisch ist....
das ist sicherlich nochmal zu überdenken.
Ich würde wahrscheinlich alle Quelldateien ("E:\test\*.txt") unverändert lassen und alle Dateien ohne Anführungszeichen unter demselben Namen in ein anderes Verzeichnis schreiben.
Bsp: alle "neuen" Dateien nach "E:\Test\OhneAnf" schreiben:
@echo off & setlocal EnableDelayedExpansion
FOR /F "delims=" %%i in ('dir /B E:\test\*.txt') do (
FOR /F "usebackq delims=" %%j in ("%%~i") do (
set "line=%%j"
echo !line:"=! >>"E:\Test\OhneAnf\%%~nxi"
))
Grüße
Biber
Moin zweeHH,
keine Angst, wir tasten uns näher ran....
Die CMD.exe kommt jetzt mit der Anzahl Anführungszeichen un der Echo-Zeile durcheinander
Bitte ergänze/ändere die Zeile
entweder so:
- oder so:
Grüße
Biber
keine Angst, wir tasten uns näher ran....
Die CMD.exe kommt jetzt mit der Anzahl Anführungszeichen un der Echo-Zeile durcheinander
Bitte ergänze/ändere die Zeile
echo !line:"=! >>"E:\Test\OhneAnf\%%~nxi"
entweder so:
(echo !line:"=!) >>"E:\Test\OhneAnf\%%~nxi"
- oder so:
>>"E:\Test\OhneAnf\%%~nxi" (echo !line:"=!)
Grüße
Biber
Moin zweeHH,
Etwas platter ausgedrückt: Damit sagst Du der CMD.exe: "Das nächste Zeichen mimm als normalen Buchstaben ohne tiefere Bedeutung".
Noch eine letzte ungetestete Alternative, die eigentlich auch funktionieren müsste, wie alle anderen geposteten Varianten auch:
Grüße
Biber
echo !line:^"=!>>"E:\Test\neu\%%~nxi":
ich bin mir nicht ganz sicher was das ^ bedeutet, aber es funktioniert.
Das Caret ("^") dient am CMD-Prompt als Maskierungszeichen für Steuerzeichen.ich bin mir nicht ganz sicher was das ^ bedeutet, aber es funktioniert.
Etwas platter ausgedrückt: Damit sagst Du der CMD.exe: "Das nächste Zeichen mimm als normalen Buchstaben ohne tiefere Bedeutung".
Ich möchte mich nochmals für die Geduld bedanken!
Gern geschehen. Ich unterstütze auch gern, wenn der Frsgesteller selbst so viel "mitarbeitet", wie Du es getan hast. Danke auch für deine Geduld.Noch eine letzte ungetestete Alternative, die eigentlich auch funktionieren müsste, wie alle anderen geposteten Varianten auch:
...
set "line=%%j"
Set line=%line:"=%
echo !line:!>>"E:\Test\OhneAnf\%%~nxi"
....
Grüße
Biber