progfreund
Goto Top

Batch Dateipfad mit Leerzeichen als einen Parameter mit anderen Parametern an call Sprungmarke übergeben und mit FOR-Schleife verarbeiten

Hallo.
Ich suche nach einer Lösung, um Leerzeichen im Pfad im Script unten
eingeben zu können, ohne dass die Ziel.txt mit halbem Namen oder ohne
Inhalt erstellt wird.


Code:
@echo off
setlocal EnableDelayedExpansion

set /p "varSpeicherpfad=Bitte geben Sie einen Speicherpfad ein: "  
set /p "varSpeichername=Bitte geben Sie einen Speichernamen ein: "  
call :DoppelteAusgabe "!varSpeicherpfad!"\"!varSpeichername!".txt echo.  
call :DoppelteAusgabe "!varSpeicherpfad!"\"!varSpeichername!".txt echo Test.  
goto :Ende

:DoppelteAusgabe
REM in der zweiten FOR-Schleife: %%b=Parameterzeile abzüglich %1
for /F "tokens=1*" %%a in ("%*") do (  
for /F "tokens=1* delims=:" %%x in ('^(%%b^) 2^>^&1 ^| findstr /n $') do (echo.%%y)>>%1&echo.%%y  
)
exit /b 0

:Ende
echo.
echo Hier ist Ende.
endlocal
pause

Wenn ein Dateiname für !varSpeichername!.txt eingegeben ist, wird die Funktion :DoppelteAusgabe
aufgerufen, die echo. und echo Test. in die !varSpeichername!.txt speichert und am Bildschirm
ausgibt.

Das Problem ist, dass der übergebene Parameter trotz Leerzeichen bei Verarbeitung an der Stelle
der vorhandenen Leerzeichen geteilt wird.

Würde mich über Tipps freuen. face-smile
LG

Content-ID: 169097

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

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

bastla
bastla 04.07.2011 um 21:47:28 Uhr
Goto Top
Hallo Progfreund!

Der tiefere Sinn der ganzen Aktion ist mir zwar noch nicht klar (schließlich könntest Du den Zieldateipfad ja bereits vor der Schleife in einer Variablen zusammensetzen und müsstest ihn dann gar nicht als Parameter übergeben), aber im Zweifelsfall würde ich mich nicht auf das Leerzeichen als Trennzeichen versteifen, sondern das etwa so versuchen:
@echo off
setlocal EnableDelayedExpansion
set "Delim=§"  

set /p "varSpeicherpfad=Bitte geben Sie einen Speicherpfad ein: "  
set /p "varSpeichername=Bitte geben Sie einen Speichernamen ein: "  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%Delim%echo.  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%Delim%echo Test.  
goto :Ende

:DoppelteAusgabe
REM in der zweiten FOR-Schleife: %%b=Parameterzeile abzüglich %1
for /F "tokens=1* delims=%Delim%" %%a in ("%*") do (  
    for /F "tokens=1* delims=:" %%x in ('^(%%b^) 2^>^&1 ^| findstr /n $') do (echo.%%y)>>%%a&echo.%%y  
)
exit /b 0

:Ende
echo.
echo Hier ist Ende.
endlocal
pause
Anstelle der Variablen %Delim% kannst Du natürlich auch einen konstanten Wert eintragen, und es muss auch nicht "§" sein, sondern nur ein Zeichen, das im Dateinamen und im Ausgabetext nicht vorkommt - "optisch" wäre zB "_" auch ganz nett ...

Grüße
bastla
Progfreund
Progfreund 05.07.2011 um 17:48:46 Uhr
Goto Top
Hallo, bastla.
Danke, dein Code funktioniert.

Die Ausgabe in der .txt Datei hat nach jeder geschriebenen
Zeile sowie bei jeder Leerzeile durch echo. ein zusätzliches Zeichen:
 
Wie kommt es zu dieser Zeichensetzung und wie kann ich das Zeichen
als Ascii Code ermitteln und rausfiltern?
bastla
bastla 05.07.2011 um 19:57:21 Uhr
Goto Top
Hallo Progfreund!

"Das" Zeichen sind "die" Windows-Standardzeichen für das Zeilenende Chr(13) und Chr(10) ...

Ermitteln lassen sich solche und andere in einer Datei enthaltene Zeichen (soferne das der von Dir verwendete Text-Editor nicht ohnehin unterstützt) unter Verwendung eines Hex-Editors (wie zB Tiny Hexer) oder mit zB VBScript, welches ich auch für das "Rausfiltern" von unter Batch eher unhandlichen Sonderzeichen verwenden würde.

Grüße
bastla
Progfreund
Progfreund 06.07.2011 um 11:17:37 Uhr
Goto Top
Ich möchte die beim call Aufruf als Parameter übergebenen echo [Text] als Variablen setzen.
Dann sollen durch den Aufruf call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable1%"
die übergebenen Parameter Verzeichnis, Verzeichnisname und echo [Text] verarbeitet werden.

Das Problem: die Ausgabe gibt für alle 18 Code Zeilen Fehler wieder:

  • Der Befehl " " ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
... (weitere ausgelassen)
  • Der Befehl "Eingegebenes" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
... (weitere ausgelassen)
  • Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung
ist falsch.

Wer kennt die Ursache?


:DatumAusgabeVariablenSetzen
set "varDatumAusgabeVariable1=."  
set "varDatumAusgabeVariable2= Eingegebenes Datum:  "!varDatum!""  
set "varDatumAusgabeVariable3= Formatiertes Datum:   "!varDatumTageszahl!.!varDatumMonatszahl!.!varDatumJahrhundertszahl!!varDatumJahreszahl!""  
set "varDatumAusgabeVariable4= Reste von"  
set "varDatumAusgabeVariable5=     Tag:                          "!varTagesRest!""  
set "varDatumAusgabeVariable6=     Monat:                      "!varMonatsRest!""  
set "varDatumAusgabeVariable7=     Jahrhundert:             "!varJahrhundertsRest!""  
set "varDatumAusgabeVariable8=     Jahr:                         "!varJahresRest!""  
set "varDatumAusgabeVariable9=."  
set "varDatumAusgabeVariable10= Schaltjahr:                    "!varSchaltjahr!""  
set "varDatumAusgabeVariable11= Schaltjahrsrelevanz:     "!varSchaltjahrsMoeglichkeit!""  
set "varDatumAusgabeVariable12= Schaltjahrparameter:   "!varSchaltjahrparameter!""  
set "varDatumAusgabeVariable13= Summanden:                 "!varTagesRest!+!varMonatsRest!+!varJahrhundertsRest!+!varJahresRest!+!varSchaltjahrparameter!""  
set "varDatumAusgabeVariable14= Summe:                         "!varWochentagsRest1!""  
set "varDatumAusgabeVariable15= Rest der Summe:          "!varWochentagsRest2!""  
set "varDatumAusgabeVariable16= Wochentag:                  "!varWochentag!""  
set "varDatumAusgabeVariable17=."  
set "varDatumAusgabeVariable18=."  

:Speichern
set "varDelim=_"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable1%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable2%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable3%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable4%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable5%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable6%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable7%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable8%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable9%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable10%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable11%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable12%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable13%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable14%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable15%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable16%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable17%"  
call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable18%"  
goto :AusgabeUndAbfrage

:DoppelteAusgabe
REM in der zweiten FOR-Schleife: %%b=Parameterzeile abzüglich %1
for /F "tokens=1* delims=%varDelim%" %%a in ("%*") do (  
for /F "tokens=1* delims=:" %%x in ('^(%%b^) 2^>^&1 ^| findstr /n $') do (echo%%y)>>%%a&echo%%y)  
exit /b 0
bastla
bastla 06.07.2011 um 12:45:06 Uhr
Goto Top
Hallo Progfreund!

Abgesehen davon, dass Du vielleicht erklären könntest, wozu das Ganze gut sein soll:
Ich möchte die beim call Aufruf als Parameter übergebenen echo [Text] als Variablen setzen.
Setzt Du doch schon vor dem Aufruf ...
Dann sollen durch den Aufruf call :DoppelteAusgabe "!varSpeicherpfad!\!varSpeichername!.txt"%varDelim%"%varDatumAusgabeVariable1%"
die übergebenen Parameter Verzeichnis, Verzeichnisname und echo [Text] verarbeitet werden.
Welchen Sinn hat die Übergabe als Parameter, wenn doch die Variablen ohnehin schon existieren (bzw, was den Speicherort angeht, vorweg erstellt werden könnten)? Die Variablen stehen ja im Unterprogramm zur Verfügung und könnten auch mit einer "for /f"-Schleife nacheinander angesprochen werden, etwa:
for /f "tokens=1* delims==" %%i in ('set varDatumAusgabeVariable') do @echo Inhalt von %%i: %%j
Dazu wäre es sinnvoll, die Nummern der Variablen durchgängig zweistellig zu schreiben, also etwa:
set "varDatumAusgabeVariable01=."
Und: Wozu überhaupt die einzelnen Zeilen erst in Variable schreiben, anstatt gleich direkt in die Zieldatei?

Grüße
bastla