Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

Batch variablen mit Leerzeichen ohne " ausgeben

user_310340 / 9 Antworten / Baumansicht Nickles

Hallo Leutz

ich möche an eine Batchdatei Datei und Verzeichnissnamen übergeben die Leerzeichen enthalten,
dass das mit batch "langer Dateiname 1" "Verz 1" also doppelte Anführungszeichen geht ist mir soweit klar.

Wenn ich aber nun die Variablen mit z.B.

ECHO dir "%2\%1" >> neu.txt

in eine neue Datei schreibe werden die Anführungszeichen mit eingefügt
und der Inhalt sieht dann so aus

dir ""Verz 1"\"langer Dateiname 1""

wie kann ich die Anführungszeichen aus den Variablen unterdrücken damit ich

dir "Verz 1\langer Dateiname 1"

erhalte ?

schonmal Danke fürs lesen

clag

bei Antwort benachrichtigen
peterson user_310340 „Batch variablen mit Leerzeichen ohne " ausgeben“
Optionen

Was Du da willst, ist mir nicht ganz klar.

Echo ist ein reiner Ausgabebefehl einer Textzeile.

Und das, was da steht, kommt dabei raus, nämlich dieses:

dir "%2\%1"

Und nichts anderes.
Allerdings solltest Du mal Dein ganzes Meisterwerk hier reinschreiben.
Auch wie Du die Variablen gesetzt hast.

bei Antwort benachrichtigen
dalai user_310340 „Batch variablen mit Leerzeichen ohne " ausgeben“
Optionen

Ziemlich einfach: benutze %~1 statt %1. Die Tilde sorgt für die Entfernung vion Anführungszeichen von Positionsparametern.

Aber ich gebe Peterson recht: mehr Infos wären nicht schlecht, denn bei Batch kann man sehr viel falsch machen.

MfG Dalai

Echte Hilfe kann´s nur bei Rückmeldungen geben.
bei Antwort benachrichtigen
staubwolke dalai „Ziemlich einfach: benutze 1 statt 1. Die Tilde sorgt für die Entfernung vion...“
Optionen

hallo ihr Leser und Schreiber Danke ........

hallo dalai,

... dein Tip war die Info die ich suchte und es funktioniert auch prinzipiell,
nur die Schleifte in der ich es so verwenden wollte, verträgt dummerweise das zusätzlich Tildezeichen nicht :(

For /F "tokens=*" %%g IN (C:\alltrack.xxx) DO (
echo %~2\%%g >> %1\-play-...%2.m3u
)

vielleicht hast du ja eine Idee wieso das in der Schleife nicht funktioniert

hier mal der gesamte etwas abgespeckte Code der ohne Tilde genau das erwartete tut
nur das in der generierten *.m3u Datei der Pfad in " " steht,
mit Tilde bricht die Schleife aber einfach ab.....

@echo off
echo.
echo -variable 1
echo %1
echo.
echo -variable 2
echo %2
echo.
echo -variable ~2
echo %~2
echo.
echo.

pause


Rem if exist %1\disc-01\*.flac DIR /B /ON %1\disc-01\*.flac > C:\alltrack.xxx

if exist %1\%2\*.mp3 DIR /B /ON %1\%2\*.mp3 > C:\alltrack.xxx
if not exist C:\alltrack.xxx goto message

For /F "tokens=*" %%g IN (C:\alltrack.xxx) DO (
echo %2\%%g >> %1\-play-...%2.m3u
)

del C:\alltrack.xxx
goto ende

:message
echo.
echo =============================================
echo.
echo .. keine FLAC, APE, WV, WAV, oder mp3 Datei gefunden !
echo.
echo =============================================
echo.
pause

:ende
del C:\alltrack.xxx


Gruß staubwolke

bei Antwort benachrichtigen
dalai staubwolke „hallo ihr Leser und Schreiber Danke ........ hallo dalai, ... dein Tip war die...“
Optionen

Ja, sowas an Batch hab ich schon geahnt... Da sind jede Menge Fehler und Unnötigkeiten drin. Die temporäre Datei - davon abgesehen, dass die überhaupt nichts auf C:\ zu suchen hat - ist überflüssig, weil man die Ausgaben von Befehlen sofort in einer for-Schleife verarbeiten kann.

Ich hab da mal kräftig aufgeräumt und umgebaut, auch wenn mir nicht klar ist, warum du 2 Parameter benutzt. Versuch's mal so:

@echo off

if not exist "%~1\%~2\*.mp3" (
    echo =============================================
    echo.
    echo .. keine FLAC, APE, WV, WAV, oder mp3 Datei gefunden !
    echo.
    echo =============================================
    pause
    goto :EOF
)

for /F "tokens=*" %%g IN ('dir /b /on "%~1\%~2\*.mp3"') DO (
    echo %~2\%%g >> "%~1\-play-...%~2.m3u"
)

Dieses Forum ist leider für Code völlig ungeeignet, weil es keine separaten Tags dafür bietet und auch sonst den eingefügten Text nicht wie geschrieben übernimmt. Pastebin o.ä. Dienste wären wohl geeigneter...

MfG Dalai

Echte Hilfe kann´s nur bei Rückmeldungen geben.
bei Antwort benachrichtigen
staubwolke dalai „Ja, sowas an Batch hab ich schon geahnt... Da sind jede Menge Fehler und...“
Optionen

Hallo Dalai,

erstmal danke für die optimierung der batchdatei.
Habe gestern Abend aber bald ne Kriese gekriegt weil es immer noch nicht richtig lief bzw genauso wie mit meiner Variante,
bis ich dahinter gekommen bin, dass eine schließende Klammer ..).. irgendwo im 2. Parameter dafür sorgt,
das inner halb der Schleife %~2 nicht mehr das gewünschte tut ???; ( {} [] sind aber kein Hinderniss.

Mein Problem war nun, das in meinem zufällig auserwähltem Versuchsverzeichnis also im %2 dummerweise ein ) enthalten war,
ist im Pfad also in %1 ein ) macht das nichts ??? es hat schon ne Weile gedauert bis ich das geschnallt hatte :((

Ohne ) in %2 funktionieren jetzt beide Varianten, allerdings ist Deine mit dem in der Schleife integrierten DIR viel eleganter
und wird jetzt auch so von mir angewendet :))

nur versteh ich noch nicht ganz wie's zusammenspielt

trotzdem fettes Danke

Staubwolke

bei Antwort benachrichtigen
dalai staubwolke „Hallo Dalai, erstmal danke für die optimierung der batchdatei. Habe gestern...“
Optionen
dass eine schließende Klammer ..).. irgendwo im 2. Parameter dafür sorgt,
das inner halb der Schleife %~2 nicht mehr das gewünschte tut

Maskiere sie, entweder mit Anführungszeichen um den gesamten Parameter und/oder mit einem Zirkumflex ^ direkt vor der Klammer.

MfG Dalai
Echte Hilfe kann´s nur bei Rückmeldungen geben.
bei Antwort benachrichtigen
dalai Nachtrag zu: „ Maskiere sie, entweder mit Anführungszeichen um den gesamten Parameter...“
Optionen

Ich merke gerade, dass das auch nicht funktionieren dürfte. Das Problem ist, dass in der for-Schleife die Variable %~2 ohne Anführungszeichen ausgegeben werden muss, denn die sind ja nicht gewünscht in der Playlist. Das führt dazu, dass runde Klammern in %~2 als Syntax ausgewertet werden und nicht dem echo als Ausgabeobjekt dienen.

Es gibt diese Lösungsmöglichkeiten:
- runde Klammern durch eckige oder geschweifte ersetzen, also Datei-/Verzeichnisnamen ändern
- Skript ändern
- Skriptsprache wechseln

Skript ändern hieße z.B., die Schleife so umzubauen:
for /F "tokens=*" %%g IN ('dir /b /on "%~1\%~2\*.mp3"') DO echo %~2\%%g >> "%~1\-play-...%~2.m3u"

Das muss alles auf einer Zeile stehen! Also letztlich nur die Klammern um den echo-Befehl entfernen, alles andere bleibt, wie es ist. Das geht aber nur solange, wie innerhalb der Schleife nur ein Befehl steht. Sobald man mehrere Befehle abarbeiten muss (die zeilenweise getrennt sind), müsste man dann auf ein CALL eines Sprungzieles umsteigen, um die runden Klammern zu vermeiden. Machbar, aber aufwendig.

Skriptsprache ändern hieße, z.B. AutoIt zu verwenden. Ich könnte dir da im Zweifel was zusammenbauen, wenn du Bedarf hast. Aber soweit sind wir ja noch nicht, denke ich.

MfG Dalai

Echte Hilfe kann´s nur bei Rückmeldungen geben.
bei Antwort benachrichtigen
staubwolke dalai „Ich merke gerade, dass das auch nicht funktionieren dürfte. Das Problem ist,...“
Optionen

n'Abend Dalai,

der Vorschlag mit dem einzeilgen Schleifenkonstrukt kommt jetzt auch mit der ) klar, ah-haa!
nun wir mir auch so langsam klar was da im Busche ist/war, die ) aus %~2 hat die Schleife einfach an der Stelle abgewürgt

Da dieser neue Einzeiler doch nicht sooo lang ist, belasse ich es dabei.

Das AutoIt scheint ja recht komfortabel zu sein das werde ich mir mal genauer ansehen.

Nochmal allerbesten Dank für deine ausführliche und konstruktive Hilfe .....

Staubwolke

bei Antwort benachrichtigen
dalai staubwolke „n Abend Dalai, der Vorschlag mit dem einzeilgen Schleifenkonstrukt kommt jetzt...“
Optionen
nun wir mir auch so langsam klar was da im Busche ist/war, die ) aus %~2 hat die Schleife einfach an der Stelle abgewürgt
So ist es. Deswegen bekommt man dann immer die Meldung "xy ist an dieser Stelle syntaktisch nicht verarbeitbar" oder so ähnlich.

Da dieser neue Einzeiler doch nicht sooo lang ist, belasse ich es dabei.
Lang ist er nicht, denn er beinhaltet ja alles, was vorher auch da war - bis auf die Klammern. Aber er hat eben den Nachteil, Befehle nicht wie gewohnt gruppieren zu können.

Ich gebe mal ein Beispiel: gehen wir mal davon aus, du willst innerhalb der Schleife noch andere Befehle abarbeiten und sei es nur die Ausgabe des Dateinamens, der gerade verarbeitet wird. Dann braucht man zwingend entweder die runden Klammern wieder oder man muss mit Sprungzielen arbeiten, die via CALL gerufen werden.

Das AutoIt scheint ja recht komfortabel zu sein
Es ist vor allem in bestimmten Fällen deutlich besser zu gebrauchen als Batch. Dazu kommt noch, dass man mit AutoIt GUIs zusammenschrauben kann, auch wenn das vergleichsweise aufwendig ist.

Nochmal allerbesten Dank für deine ausführliche und konstruktive Hilfe .....
Büdde büdde, gern geschehen.

MfG Dalai
Echte Hilfe kann´s nur bei Rückmeldungen geben.
bei Antwort benachrichtigen