raidman
Goto Top

Findstr stolpert über das UND Zeichen

hallo und guten Abend,

habe mir eine Batch datei gebaut zum umsortieren und korrigieren von Textdateien, das funktioniert auch soweit,
aber wen in der Variablen für "Pfad\Datei" ein & enthalten ist interpretiert findstr das & als Befehlsteil und versagt den Dienst face-sad

Was kann ich tun damit ein & im Pfad/Dateinamen, von findstr verarbeitet wird?

also:
set file="G:\Das Verzeichnis\mein ein & alles\jungens.txt"
findstr liebe %file% =FEHLER


hmmm sorry scheint doch nicht am "&" zu liegen
habe testweise das & rausgenommen hat nichts geändert hängt sich nach wie vor an der/den Dateien auf ???

Content-ID: 231342

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

Ausgedruckt am: 16.11.2024 um 11:11 Uhr

Sheogorath
Sheogorath 28.02.2014 um 19:58:35 Uhr
Goto Top
Moin,

was dir fehlt sind Anführungszeichen. bzw. du solltest die woanders hinsetzen. So sollte es klappen:
set "file=G:\Das Verzeichnis\mein ein & alles\jungens.txt"  
findstr /C:"liebe" "%file%"  

Gruß
Chris
RaidMan
RaidMan 28.02.2014 aktualisiert um 23:17:23 Uhr
Goto Top
Hallo Chris und alle Anderen
Danke für deine Antwort
aber es gibt da leider noch mehrere Probleme mit dem "&"

hier der erste Teil wo es hakt
FOR /f "delims=" %%i IN ('FINDSTR . %quell_datei%') DO (  
SET zeile=%%i &CALL :ersetzen !zeile!
)
GOTO :weiter

:ersetzen
REM innerhalb der Variable "zeile" ersetzen  
SET zeile=!zeile:%gesucht01%=%ersetze01%!

%%i zeigt die ganze Zeile mit dem &

dies hier
SET zeile=!zeile:%gesucht01%=%ersetze01%!
funktioniert nicht wenn ein & in %zeile% enthalten ist
denn die %zeile% ist anschließenf leer face-sad

wie kann man das lösen?
bastla
bastla 28.02.2014 um 22:30:24 Uhr
Goto Top
Hallo RaidMan!

Glaub Chris doch, wenn er Dir Anführungszeichen empfiehlt ... face-wink
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (  
    SET "zeile=%%i" & CALL :ersetzen  
)
GOTO :weiter

:ersetzen
REM innerhalb der Variable "zeile" ersetzen  
SET "zeile=!zeile:%gesucht01%=%ersetze01%!"  
goto :eof
Grüße
bastla

P.S.: ... und findest Du nicht auch, dass ein Batch mit passender Formatierung (lässt sich auch nachträglich hinzufügen) gleich viel besser aussieht?
RaidMan
RaidMan 28.02.2014 aktualisiert um 23:48:09 Uhr
Goto Top
hey Ihr face-smile

an keiner Stelle habe ich behauptet " machen keinen Sinn, allerdings sollte man schon wissen was man tut ;)
also ich hatte da schon etliche Varianten erfolglos probiert, dein jetziger Vorschlage war bereits darunter.
Es bleibt dabei, wenn %zeile% ein & enthält funktioniert das ersetzen nicht mehr und es gibt eine leere Zeile zurück face-sad

FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (  
echo 1 %%i
SET "zeile=%%i" &CALL :ersetzen      rem !zeile!  
pause
)

GOTO :weiter

:ersetzen
REM innerhalb der Variable "zeile" ersetzen  
echo 2 %zeile%
SET "neuzeile=!zeile:%gesucht01%=%ersetze01%!"  
SET "neuzeile=!zeile:%gesucht02%=%ersetze02%!"  
SET "neuzeile=!zeile:%gesucht03%=%ersetze03%!"  
SET "neuzeile=!zeile:%gesucht04%=%ersetze04%!"  
echo 3 %neuzeile%
pause

REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben  
IF [!zeile!] EQU  (ECHO.>>"%ziel_datei%") ELSE (ECHO !zeile!>>"%ziel_datei%")  
GOTO :eof

:weiter

so sieht der jetzt Teil aus, funktioniert aber leider immer noch nicht s.o.
bei einer %zeile% ohne & wird bei den Echos 1-3 jeweil der string ausgegeben

bei einer %zeile% mit & wird nur bei dem Echos 1 der string ausgegeben
ECHO 2+3 zeigen dann nichts
bastla
bastla 01.03.2014 um 01:48:25 Uhr
Goto Top
Hallo RaidMan!
an keiner Stelle habe ich behauptet " machen keinen Sinn, allerdings sollte man schon wissen was man tut ;)
Behauptet nicht, aber verwendet hast Du sie auch nicht (oft genug) ... face-wink
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (  
    echo 1 "%%i"  
    SET "zeile=%%i" & CALL :ersetzen  
    pause
)

GOTO :weiter

:ersetzen
REM innerhalb der Variable "zeile" ersetzen  
echo 2 %zeile%
echo 2 "%zeile%"  
echo 2 !zeile!
SET "neuzeile=!zeile:%gesucht01%=%ersetze01%!"  
SET "neuzeile=!zeile:%gesucht02%=%ersetze02%!"  
SET "neuzeile=!zeile:%gesucht03%=%ersetze03%!"  
SET "neuzeile=!zeile:%gesucht04%=%ersetze04%!"  
echo 3 %neuzeile%
echo 3 "%neuzeile%"  
echo 3 !neuzeile!
pause

REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben  
ECHO(!neuzeile!>>"%ziel_datei%"  
GOTO :eof

:weiter
type "%ziel_datei%"  
Anmerkung zur Zeile 24:
Abgesehen davon, dass Du vermutlich !neuzeile! in die Zieldatei schreiben möchtest, brauchst Du auf Leerzeilen hier keine Rücksicht zu nehmen, da in der for-Schleife Leerzeilen ohnehin ignoriert werden. Trotzdem habe ich eine Schreibweise gewählt, mit der auch Leerzeilen ausgegeben würden, wobei anstelle der Klammer (diese wird von @jeb-the-batcher empfohlen) auch "." oder "\" oder "+" oder verschiedene weitere Zeichen dafür sorgen würden, dass kein ECHO ist eingeschaltet (ON). ausgegeben wird.

Grüße
bastla
RaidMan
RaidMan 01.03.2014 aktualisiert um 10:45:43 Uhr
Goto Top
Moin zusammen, Hi bastla

hmmm wie es scheint bzw was ich jetzt hier rauslese ist
ECHO ein Befehl der Textausgaben zeigen soll,
kann einige Zeichen wie sie in jedem beliebigen Text vorkommen können schlicht nicht weiter verarbeiten!?

oh man das ist wieder MS Sch...
Oh Herr erlöse die Welt von der MS Geißel und lass bald einen intelligenten nicht geldgeilen Menschen ein sinniges OS erstellen

Welche Zeichen sind es denn konkret, die Echo nicht kann?
so ein Käse ich hatte die Batch shon auf etliche Verzeichnisse lossgelassen,
die Dateien kann ich jetz alle manuell prüfen was da kaputt ist, schönen Dank aber auch!
Ich wollte mal schnell aufräumen und jertzt steh ich erstmal vor Schadensbegrenzung!
Das heißt ja Batches für windows Filesystem wo "&" auch schon lange verwendet wird sind alle riskant bis untauglich?

Ist dieses %Magicecho% die einzige Lösung?
Also jede Batch die Filenamen oder Text irgendwie mit ECHO verarbeitet braucht %MagicEcho%

Gibt es einen vernünftigen Batchersatz ohne die MS Krankheiten?
bastla
bastla 01.03.2014 aktualisiert um 12:50:41 Uhr
Goto Top
Hallo RainMan!
ich hatte die Batch shon auf etliche Verzeichnisse lossgelassen
Optimismus in Ehren, aber einen un- bzw nicht ausreichend getesteten Batch lasse ich nicht mal auf 2 Dateien los, geschweige denn auf etliche Verzeichnisse ...
ECHO ein Befehl der Textausgaben zeigen soll,
kann einige Zeichen wie sie in jedem beliebigen Text vorkommen können schlicht nicht weiter verarbeiten!?
Das stimmt so nur bedingt (wie die Beispiele oben Dir eigentlich zeigen sollten) - abgesehen davon ist allerdings (CMD) Batch hinsichtlich der Manipulation von Text tatsächlich etwas beschränkt im Vergleich zu anderen Scriptsprachen wie VBS oder PowerShell ...
Welche Zeichen sind es denn konkret, die Echo nicht kann?
Es geht nicht darum, dass echo die Sondrezeichen &|<> nicht "könnte", sondern dass diese eben in CMD eine besondere Bedeutung haben - damit sie als "gewöhnliche" Zeichen verstanden (und daher nicht "interpretiert") werden, kannst Du sie - erraten face-wink - unter Anführungszeichen setzen oder eben per delayedExpansion (und dann mit der Variablenschreibweise !neuzeile! anstatt %neuzeile%) verwenden beziehungsweise, wenn sie direkt ausgegeben werden sollen, durch Voranstellen eines ^ "escapen".
Das heißt ja Batches für windows Filesystem wo "&" auch schon lange verwendet wird sind alle riskant bis untauglich?
... außer Du machst es richtig face-wink (für Dateioperationen brauchst Du ja ohnehin kein echo) ...
Was Du übrigens mit %Magicecho% meinst weiß ich zwar nicht, aber in vielen Fällen reicht die vorhin beschriebene Vorgangsweise und in anderen Fällen greife ich ( @colinardo zB ist mehr up to date und tendiert daher zur PowerShell ) zu VBS.

Grüße
bastla
RaidMan
RaidMan 01.03.2014 aktualisiert um 13:37:23 Uhr
Goto Top
Hallo bastla,

ehrlich gesagt bin ich absoluter Gelegenheit-batchschreiber und mit den so wichtigen Feinheiten nicht vertraut,
allein der Unterschied % " ! ist mit schon nicht wirklich klar face-sad

Optimismus in Ehren, aber einen un- bzw nicht ausreichend getesteten Batch
na ich hatte schon etliche Tests aber eben ohne ein "&"

Was Du übrigens mit %Magicecho% meinst weiß ich zwar nicht
so nannte "jeb the batcher" sein "hilfscode" auf den du velinkt hast
pieh-ejdsch
pieh-ejdsch 01.03.2014, aktualisiert am 02.03.2014 um 15:49:10 Uhr
Goto Top
Moin,

echo macht genau was es soll und die Befehlszeile wird auch genaus so ausggeführt, wie erwartet. manche Zeichen sind Steuerzeichen und verhalten sich in einer in Prozentzeichen aufgelösten Variable wie sie in die Variable eingegeben wurden.
Nur werden häufig beim setzen der Variable diese mit Anführungszeiche3n versehen aber beim Echo wieder "vergessen".
Ausnahmen bilden da nur Laufvariablen von Forschleifen bzw Mit Verzögerter Variablenauflösung in Ausrufezeichen gesetzte Variablen.

Daher sollten bei hohen Datenmengen allen Daten ein gewisser Satz als Testdaten genommen und auch angesehen werden. Also Kopien erzeugt werden bzw im Supergau die Datensicherung zurückspielen.

Wenn eine leere Variable durch ersetzung verändert wird, kommt Grütze raus.
Daher bei Leerzeilenmitnahme immer sicherstellen, das vor einer zu ersetzenden Variable immer etwas drin ist.
Ob danach noch Inhalt in der Variable ist spielt keine Rolle.
echo on
setlocal disabledelayedexpansion
set "Quelldatei=G:\Das Verzeichnis\mein ein & alles\jungens.txt"  
set "suche=Rein"  
set "ersetz=Raus"  
set "T=%temp%\tmp.txt"  
findstr /n "^" "%Quelldatei%" >"%t%"  
call :Out 3>"%Quelldatei%-kopie.txt"  
exit /b
:Out
for /f "usebackq delims=" %%i in ("%t%") do (set Line=%%i  
  setlocal enabledelayedexpansion
  set "Line=!Line:%suche%=%ersetz%!"  
  >&3 echo(!Line:*:=!
  endlocal
)
exit /b

Gruß Phil
RaidMan
RaidMan 01.03.2014 aktualisiert um 15:12:49 Uhr
Goto Top
hallo zusammen

danke für Eure Hilfe
gestern stand ich noch am progiertechnischen Abgrund, jetzt bin ich einen Schritt weiter ;)

Also: das Hauptproblem ist jetzt das ersetzen der Teilstrings

 set "Line=!Line:%suche%=%ersetz%!"   

liefert eine leeren string zurück wenn !line! eine Zeichenfolge mit & enthält

set "suche=Auto"  
set "ersetz=Bahn"  

set "line=ich fahre Auto + Fahrrad"  
set "Line=!Line:%suche%=%ersetz%!"  
echo !line! = ich fahre Bahn + Fahrrad

set "line=ich fahre Auto & Fahrrad"  
set "Line=!Line:%suche%=%ersetz%!"  
echo !line! = 

raidman
pieh-ejdsch
pieh-ejdsch 01.03.2014 um 16:04:35 Uhr
Goto Top
wenn ein echo in die Datei erfolgt ist sowieso kein text zu sehen.
Was für eine CMD-Version benutzt Du?

Gruß Phil
bastla
bastla 01.03.2014 um 19:11:51 Uhr
Goto Top
Hallo PH!
Was für eine CMD-Version benutzt Du?
Die von XP dürfte es nicht sein - auch damit sieht das nämlich so aus:
D:\>type Ersetzen.cmd
@echo off & setlocal enabledelayedexpansion
set "suche=Auto"
set "ersetz=Bahn"

set "line=ich fahre Auto + Fahrrad"
set "Line=!Line:%suche%=%ersetz%!"
echo !line! = ich fahre Bahn + Fahrrad

set "line=ich fahre Auto & Fahrrad"
set "Line=!Line:%suche%=%ersetz%!"
echo !line! = ich fahre Bahn ^& Fahrrad

D:\>Ersetzen
ich fahre Bahn + Fahrrad = ich fahre Bahn + Fahrrad
ich fahre Bahn & Fahrrad = ich fahre Bahn & Fahrrad

D:\>
Ich schau mal, ob ich noch ein W2000 zum Testen auftreibe ... face-wink

Grüße
bastla
RaidMan
RaidMan 01.03.2014 aktualisiert um 19:46:06 Uhr
Goto Top
guten Abend und hallo zusammen,

@bastla
oh vielen dank aber die Aktion kannst du dir sparen

das Problem hat scheinbar die ganze Zeit blind vor dem Monitor gesessen
nach dem ich noch einmal alles neu geschrieben habe funktioniert die Batch plötzlich

was doof ist, ich habe nicht raus gefunden wo ich den Fehler gemacht hatte
ohhh raidman was für ne Pleite

Aber ihr habt mir ja sehr beharlich Unterstützung gewährt dafür ein ganz dickes Danke

Also jetzt tut die batch was sie soll, übrigens auf einem XP Rechner ;)

Allen ein schönes rest WE
wünscht raidman


hier mal der ganze Teil der Sektion Zeilen ändern

@ECHO off
SETLOCAL enabledelayedexpansion

rem braucht Quell-Pfad als %1 
rem und Quell-Verzeichnis als %2

FOR /f "delims=" %%a IN ('dir /b "%~1%~2\*.url"') DO (  
set "quell_datei=%~1%~2\%%a"  
)
set "ziel_datei=%quell_datei:~0,-3%txt"	  

SET "gesucht01=Full			*"  
SET "ersetze01=originalName		*"  
SET "gesucht02=Name			*"  
SET "ersetze02=clean-Name		*"  
SET "gesucht03=Name2		*"  
SET "ersetze03=given-Name		*"  
SET "gesucht04=Date			*"  
SET "ersetze04=createDate		*"  

REM Quell-Datei zeilenweise auslesen 
REM und in Variable "zeile" schreiben	  
rem setlocal enabledelayedexpansion 

FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (  
SET "zeile=%%i"   
CALL :ersetzen 
)
GOTO :weiter

:ersetzen
REM innerhalb der Variable "zeile" ersetzen  
SET zeile=!zeile:%gesucht01%=%ersetze01%!
SET zeile=!zeile:%gesucht02%=%ersetze02%!
SET zeile=!zeile:%gesucht03%=%ersetze03%!
SET zeile=!zeile:%gesucht04%=%ersetze04%!
REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben  
IF [!zeile!] EQU  (ECHO.>>"%ziel_datei%") ELSE (ECHO !zeile!>>"%ziel_datei%")  
GOTO :eof

:weiter
del "%quell_datei%"  
move /y "%ziel_datei%" "%quell_datei%"