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
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 ???
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
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 ???
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 231342
Url: https://administrator.de/contentid/231342
Ausgedruckt am: 16.11.2024 um 11:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo RaidMan!
Glaub Chris doch, wenn er Dir Anführungszeichen empfiehlt ...
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?
Glaub Chris doch, wenn er Dir Anführungszeichen empfiehlt ...
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
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?
Hallo RaidMan!
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
Grüße
bastla
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) ... 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%"
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
Hallo RainMan!
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
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 ...kann einige Zeichen wie sie in jedem beliebigen Text vorkommen können schlicht nicht weiter verarbeiten!?
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 - 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 (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
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 beihohen 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.
Gruß Phil
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
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
Hallo PH!
Ich schau mal, ob ich noch ein W2000 zum Testen auftreibe ...
Grüße
bastla
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:\>
Grüße
bastla