6. Batchproblem nach Benutzen von For-Befehlen

Vieleicht kennen sie das Problem: Sie schrieben eine Batch und haben nach Verwendung ein Probleme mit einem Space-Zeichen wie z. B. diesem Befehl:

for %%I in (.) do echo %%~sI >zyx.txt oder ich hatte das Problem bei einer Stapelverarbeitung und hörte, dass ähnliche Probleme bei einer CSV im Export von Excel entstehen.

Es kommt dann der Pfad und das tödliche Space-Zeichen (Hex 20) und weiterhin ein 0D 0A (D steht für Carriage return und A für Line feed ) heraus.


---
Vorsicht: Zur Demonstration habe ich hier geschummelt: Hinter dem %%~si habe ich bewusst ein Leerzeichen gesetzt, bevor das Ausgabezeichen > kommt.

Dadurch entsteht die Kombination für ein Leerzeichen mit zwei unsichtbaren Zeichen 0D 0A dahinter, welches einem Satzendezeichen entspricht. Fortan ist für die Batch der vollständige String inklusive Leerzeichen und zwei unsichtbaren Satzendezeichen - sie können das mit einem Hexeditor überprüfen.

---

Die letzten beiden Zeichen bekommen Sie nur über eine Betrachtung über einen Hexeditor wie z. B. diesen XV132 heraus.

Das Schlimme ist, dass sie ohne Bereinigung beim Batchschreiben Probleme bekommen, denn spätestens ein weiterer for Befehl sieht dann das Wort mit dem Space und den beiden unsichtbaren Zeichen als eine Einheit an.

Das heißt, egal ob sie Pfade zusammensetzen wollen oder einen Dateinamen erstellen wollen, da ist immer so ein blödes Space - Zeichen am Ende und die Bearbeitung ist erledigt...einige Befehle im Copy und dir Bereich liegen dann auch darnieder.

Daher: Entfernen Sie dieses Zeichen bzw. bereinigen sie es: Mit dem o. a. weg können sie nur eine Zeile bereinigen!!!

Mit ein wenig Stringmanipulation bekommen Sie diese Kombination leicht gebrochen, vielleicht mal hier ein angepasster Text einer Probebatch (irgendeinname.bat), wo der grüne Text nur als Beispiel verwendet wird und der blaue Text eine Valide Lösung für viele Probleme darstellt - egal ob beim Datum einer Batch oder eine sonstige Reihe, die universale Lösung hilft ihnen weiter:

for %%I in (.) do echo %%~sI >zyx.txt
for %%I in (.) do echo %%~sI >>zyx.txt
@echo off
FOR /F "tokens=*" %%i IN (zyx.txt) DO call:beginn "%%i"
goto eof

:beginn
set str=%1%
echo.%str%
set str=%str: =%
echo.%str%>>toll.txt
goto :eof

So, dann ein wenig Erklärung: In den ersten zwei gründen Reihen stelle ich ein Textdokument her (zyx.txt) her, in dem zweimal derselbe Eintrag dann untereinandersteht (ob da nun ein, zwei, drei oder hundert Einträge gleicher Art stehen, ist egal).

Es steht also dort  der aktuelle Pfad und zum Ärger die o. a. Kombination, also ist der Pfad ziemlich nutzlos, weil wenn ich im nächsten Schritt z. B. eine Dateiendung anhänge, dann ist da immer ein Leerzeichen zwischen, also c:\irgendeinverzeichnisLEERZEICHEN \*.mps.

Sie können den Pfad also nicht verlängern und damit ist das für viele Anwendungen nutzlos - oder Sie haben eine Jahresliste von Dateien und da steht dann immer 2016LEERZEICHEN 

So, was macht also die Batch?

@echo off
FOR /F "tokens=*" %%i IN (zyx.txt) DO call:beginn "%%i"
goto eof

Der erste Block ruft die Bearbeitung der Stapelverarbeitung auf und sorgt dafür, dass der vollständige Inhalt in einem Stück  "tokens=*" ausgegeb wird, also beim ersten Durchlauf die erste Zeile. Diese ruft (call) einen weiteren Streckenabschnitt auf: call ist also eine Art "goto-Befehl".

Dem  Zielpunkt (:beginn) übergebe ich die Variable %%i in Anführungszeichen, der wird dann so gesehen zur Variable, die man als %1% händeln kann.

:beginn
set str=%1%
echo.%str%
set str=%str: =%
echo.%str%>>toll.txt
goto :eof

Ja, die Syntax ist nicht so leicht, aber unser gesetzter Strin str=%1% entspricht nun %%i.

Der wird nun nochmals einem echo unterzogen un in der roten Zeile wird set str=  der gesamt strin bis auf einem LEERZEICHEN nach dem Doppelpunkt gleichgesetzt = mit nichts, denn das Prozentzeichen nach dem String ist nur das Begrenzungszeichen des neu geschaffenen Stringes: set str=%str: =\%  würde also ein \ einfügen, welches irgendwo auch einen Sinn hätte...

Der neue String wird dann in einen toll.txt weitergegeben und hier bitte >> verwenden, weil nur ein > destruktives überschreiben zur Folge hätte.

Die Batch schließt sich nach getaner Arbeit: Zur Not rufen Sie eben eine andere Batch auf..., dass geht auch mit dem call Befehl...

Es gibt auch andere Methoden und letztlich muss man sehen, ob man z. B. nicht schon beim Export von z. B. einer Exceltabelle ins CSV-Format z. B. andere Seperatoren als Leerzeichen nimmt oder bereits in Excel bereinigt.

Das war nur ein Beispiel und eine Lösungsvariante...

Nachtrag : Es gibt natürlich noch eine bessere Variante, wie sie nur das letzte Leerzeichen löschen:

for %%I in (.) do echo %%~sI >>zyx.txt
@echo off
FOR /F "tokens=*" %%i IN (zyx.txt) DO call:beginn "%%i"
goto eof

:beginn
set weg=%1%
echo.%weg%
set weg=%weg:~1,-2%
echo.%weg%>>toll.txt
goto :eof

Was ist hier anders, eigentlich nur eine Zeile und die muss ich ein klein wenig erklären: Ich übergebe ja den Pfad mit Anführungszeichen und muss dann, wenn ich den String manipulieren will, eine Mid-String-Manipulation machen: Ich nehme also in der roten Zeile ein Anführungszeichen am Anfang weg und am Ende ein Anführungszeichen mit dem Leerzeichen. Ich breche also die Anführungszeichen auf: Genauso kann ich mit set weg=%weg:~1,-3% dann die letzten zwei Zeichen wegnehmen, nur weg=%weg:~0,-1% funktioniert dann nicht, weil ich dann nicht die anführungszeichen aufbreche

Das ist eine Lösung die zu 100 % funktioniert oder die Antwort auf die Frage: Wie entferne ich ein Leerzeichen mit einer Batch aus sämtlichen untereinanderstehenden Zeilen?

Ich weiß, das ist wieder so ein Minderheitsartikel, aber wenn sich niemand die Mühe macht, solche Probleme zu dokumentieren und anderen zugänglich zu machen, dann frustiert das Batchschreiber...

Impressum