zweehh
Goto Top

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

Content-Key: 86515

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

Ausgedruckt am: 29.03.2024 um 02:03 Uhr

Mitglied: miniversum
miniversum 27.04.2008 um 19:14:00 Uhr
Goto Top
In der ersten Batchdatei gehst du jede Datei durch indem du die zweite dann so aufrufst:
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
Mitglied: Biber
Biber 27.04.2008 um 19:20:52 Uhr
Goto Top
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):
For %i in (D:\Viele\Textdateien*.*) do ScrapQuotes "%i"  

Für konkretere Antworten bitte konkreteren Sachverhalt posten.

Grüße
Biber
Mitglied: zweehh
zweehh 28.04.2008 um 08:19:49 Uhr
Goto Top
Hallo allerseits,

ja ich wiß mein erste Posting war nicht sehr aufschlussreich. Ich versuch nochmal genauer zu schreiben, wo es bei mir hackt.
Vorerst mal möchte ich mich für die ersten Vorschläge bedanken. Leider hat es immer noch nicht geklappt.
momentan habe ich eine bat-datei start.bat mit folgenden Inhalt:

FOR /F "delims=" %%i in ('dir /B E:\test\*.txt') do call verarbeite.bat "%%~fi"

und eine zweite verarbeite.bat

set dateiname=%1
for /f "delims=" %%i in (%dateiname%.txt) do ( set "line=%%i" echo !line:"=!)

Mein Ziel ist das alles txt-Dateien im Ordner Test nacheinander angesprochen werden und die Anführungszeichen gelöscht werden. Leider öffnet sich lediglich ein neues Eingabefenster und das wars.

Weiß jemand Rat.
Mitglied: Biber
Biber 28.04.2008 um 09:21:38 Uhr
Goto Top
Moin zweehh,

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]
Mitglied: zweehh
zweehh 28.04.2008 um 09:52:15 Uhr
Goto Top
Hallo Biber,

vielen Dank für die Antwort und die Tipps.

Ich hab es wie du vorgeschlagen hast jetzt in eine Batch Datei gepackt.
Leider klappt es immer noch nicht.
Nach dem Aufruf erscheint im Eingabefenster lediglich folgender Text:

!line:"=!
!line:"=!
!line:"=!
...

(ANzahl entspricht der Anzahl der vorhandenen Textdateien)

Die Textdateien selbst haben aber immer noch sämtliche Anführungszeichen drin...

In den Textdateien steht der Text in diesem Format :

"Fx_1 = -405.32"
"Fy_1 = 0.37"
Liegt hier vielleicht das Problem?
Mitglied: Biber
Biber 28.04.2008 um 11:42:13 Uhr
Goto Top
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
Mitglied: zweehh
zweehh 29.04.2008 um 22:03:09 Uhr
Goto Top
Hallo Biber,

ich hab zwischen zeitlich aufgegeben und die Dateien per Hand geändert. Nun packt mich doch noch mein Ergeiz und ich würd gern wissen wie es geht.

Momentan habe ich batch.bat folgenden Zeilen:

@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:"=!
)

Wenn ich Batch.bat nun aufrufe, erscheint jedoch nur der Name der entsprechenden Textdateien im Verzeichnis. Die Anführungszeichen aus den Dateien werden jedoch nicht gelöscht.

Was mach ich falsch?

Grüße ZweeHH
Mitglied: Biber
Biber 29.04.2008 um 22:59:34 Uhr
Goto Top
Moin zweeHH,

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 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:
>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
Mitglied: zweehh
zweehh 30.04.2008 um 08:56:32 Uhr
Goto Top
Hallo Biber,

vielen Dank für die Geduld. Zeitig Feierabend wäre schön.

Ich habe nochmal den geposteten Schnipsel kopiert und es läuft.
Er gibt die entsprechenden Zeilen auf dem Bildschirm ohne ANfürhungszeichen aus.

Nun müßte ich nochmals dumm fragen, wie er es direkt in die Datei schreibt.

Grüße ZweeHH
Mitglied: Biber
Biber 30.04.2008 um 10:10:44 Uhr
Goto Top
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.

@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"  
))
[wobei das Ziel-Verzeichnis vorher da sein sollte]

Grüße
Biber
Mitglied: zweehh
zweehh 30.04.2008 um 11:38:05 Uhr
Goto Top
Hallo Biber,

danke für die Erläuterung zu ~dpn. Habe ich jetzt verstanden.
Leider klappt es mit der Umleitung in die neue Datei noch nicht.
Die Ausgabe erscheint lediglich auf dem Bildschirm ...

xxxxx >>"E:\test\dateiname_OA.txt"

xxx ist die entsprechende Textzeile aus der Datei ohne Anführungszeichen

Eine neue Datei wird nicht erzeugt und somit auch keine Text ohne Anführungszeichen.

Grüße
Mitglied: Biber
Biber 30.04.2008 um 12:14:45 Uhr
Goto Top
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
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
Mitglied: zweehh
zweehh 30.04.2008 um 22:22:02 Uhr
Goto Top
Hallo Biber,

die beiden Zeilen funktionieren leider nicht...

grüße ZweeHH
Mitglied: zweehh
zweehh 01.05.2008 um 18:38:36 Uhr
Goto Top
Hallo Biber,

ich glaube ich hab die Lösung.

ich habe die Zeile wie folgt geändert:

echo !line:^"=!>>"E:\Test\neu\%%~nxi"

ich bin mir nicht ganz sicher was das ^ bedeutet, aber es funktioniert.

Ich möchte mich nochmals für die Geduld bedanken!

Grüße ZweeHH
Mitglied: Biber
Biber 01.05.2008 um 22:08:14 Uhr
Goto Top
Moin zweeHH,
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.
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