Batch Nur bestimmte Dateien umbenennen (Drag & Drop / sendto)

Desdinova

Cadet 1st Year
Registriert
Mai 2014
Beiträge
8
Hallo!

Ich versuche mich gerade ein bisschen in Batch reinzufuchsen und komme bis jetzt auch gut mit den Sachen zurecht, die ich hier und sonstwo im Netz finde. Allerdings habe ich jetzt ein Problem, für das ich keine Lösung finde.
Aktuell wird in meinem Script durch Nutzereingaben ein Prefix erstellt und Dateien umbenannt. Die Zeile dazu sieht so aus und funktioniert auch:
Code:
for %%a in (*) do rename "%%a" "%DB%_%ID%_%QU%_%TYP%_%FSK%_%SV%_%%a"
Die umzubenennenden Files übergebe ich entweder per Drag & Drop an das Batchfile oder per sendto über das Kontextmenü. Das Batch-File liegt dabei nicht im selben Ordner wie die zu bearbeitenden Dateien. Mein Problem ist jetzt, dass immer alle Dateien des Ordners aus welchem die Dateien stammen umbenannt werden und nicht nur die, die ich zugewiesen habe. Ich lasse mir am Anfang die Dateien auch listen und dort werden die richtigen angezeigt.
Code:
echo %*
Ich vermute einfach mal, dass ich dem Script irgendwo sagen muss mit welchen Dateien es arbeiten soll. Wichtig wäre die sendto oder Drag & Drop Arbeitsweise beibehalten zu können.

Hat hier jemand einen Tipp für mich?

Danke schon mal ;)
 
Desdinova schrieb:
Mein Problem ist jetzt, dass immer alle Dateien des Ordners aus welchem die Dateien stammen umbenannt werden und nicht nur die, die ich zugewiesen habe.

Kein Wunder, denn mit
Desdinova schrieb:
Code:
for %%a in (*); do


[/QUOTE
hast Du ja auch alle Dateien angesprochen. Du mußt da nicht das generelle wildcard nutzen, sondern den Parameter. also in etwa
Code:
 for FILES in $@; do
(nur eben für DOS, nicht bash. Obiges ist sh script.)

Hier wird's ganz gut erklärt: Batch Parameter

Es ist, wie miac sagte.
Code:
for %%a in (%*); do
 
Zuletzt bearbeitet: (Link hinzugefügt)
Danke für die schnelle Hilfe!

Durch das %* bekomme ich jetzt allerdings einen Syntaxfehler beim ausführen. Wenn ich das richtig verstanden habe, sollte die Zeile doch nun so aussehen, oder?
Code:
for %%a in (%*); do rename "%%a" "%DB%_%ID%_%QU%_%TYP%_%FSK%_%SV%_%%a"
 
Nimm mal das semikolon raus.
 
Auch da bekomme ich einen Syntaxfehler.
Code:
for %%a in (%*) do rename "%%a" "%DB%_%ID%_%QU%_%TYP%_%FSK%_%SV%_%%a"
 
Habe gerade mal ausprobiert:
Code:
for %%a in (%*) do (echo "%%a")

funktioniert einwandfrei
 
Der Logik zufolge müsste dann der Fehler im Gebrauch des "rename"-Befehles sein, bzw. in der Verknüpfung mit der FOR-Schleife.
@TE: Und wenn Du, wie miac auch, den "rename"-Befehl in Klammern setzt?
btw: ich hoffe, Du hast die Variablen in Deinem rename vorher auch definiert?
 
Vielleicht bin ich dem Fehler jetzt auf der Spur. Den Rename-Befehl in Klammern zu setzen hat nichts gebracht und es gab wieder einen Syntaxfehler. Daraufhin habe ich jetzt auch mal mit echo probiert, um zu sehen ob sich da was tut. Also:
Code:
for %%a in (%*) do echo "%%a" "%DB%_%ID%_%QU%_%TYP%_%FSK%_%SV%_%%a"
Bewusst ohne () um den echo Befehl um zu sehen ob es daran liegt. Hier bekomme ich dann auch keinen Syntaxfehler, aber das Ergebnis entspricht auch nicht meiner Erwartung: ""C:\Users\xxx.xxx\Desktop\--IN--\Batch\Files\test (6).pdf"" "f_9798789_h_trail
er_x_hd_"C:\Users\xxx.xxx\Desktop\--IN--\Batch\Files\test (6).pdf""


Das Prefix steht nun nicht vor dem Dateinamen, sondern vor dem kompletten Dateipfad, was auch erklären würde warum rename nicht funktioniert. Greift %* im Vergleich zu * auf den kompletten Pfad zu bzw. muss ich den Dateinamen an sich speziell ansprechen?

Edit:
Die Variablen habe ich definiert. Hier der gesamte Code zum erschrecken ;)
Code:
@echo off
title Alles nur Test
rem listet die Dateien
echo %*
echo ------------------------------------------------------
echo                       DATENBANK
echo ------------------------------------------------------
echo  An welche Datenbank soll der Clip verlinkt werden?
echo.
echo   a = Adressen
echo   f = Film / Video
echo   s = Spiele
echo   t = Termin
echo   m = Musik
echo   p = Personen
echo   mv = Musik (Clip)
echo.
set /p DB=" Bitte den Buchstaben fuer die Datenbank eingeben: "Eingabe:
echo.
echo.
echo ------------------------------------------------------
echo                          ID
echo ------------------------------------------------------
echo.
set /p ID=" Bitte die ID hier eintragen: "Eingabe:
echo.
echo.
echo ------------------------------------------------------
echo                       Qualitaet
echo ------------------------------------------------------
echo  Welche Qualitaet hat das Video?
echo.
echo  h = High (keine Artefakte)
echo  l = Low (Artefakte / sehr gerine Aufloesung)
echo.
set /p QU=" Bitte hier das Kuerzel eingeben: "Eingabe:
echo.
echo.
echo ------------------------------------------------------
echo                        Cliptyp
echo ------------------------------------------------------
echo  Um welchen Cliptyp handelt es sich?
echo.
set /p TYP=" Bitte hier den Cliptyp eintragen: "Eingabe:
echo.
echo.
echo ------------------------------------------------------
echo                        Freigabe
echo ------------------------------------------------------
echo  Welche Altersfreigabe hat der Clip?
echo.
echo  x = ableiten (falls keine FSK vorhanden)
echo  0, 6, 12, 16, 18 = Werte auf spio.de recherchiert
echo  m0, m6, ..., m99 = manuelle Freigabe (bei m99 komplett gesperrt)
echo.
set /p FSK=" Bitte die Freigabe hier eintragen: "Eingabe:
echo.
echo.
echo ------------------------------------------------------
echo                     Seitenverhaeltnis
echo ------------------------------------------------------
echo  Welches Seitenverhaeltnis hat das Video?
echo.
echo  HD = 720p / 1080p
echo  WS = 16:9 PAL
echo  43 = 4:3 PAL
echo  LB = 4:3 PAL mit 16:9 Inhalt (Letterbox)
echo.
set /p SV="Bitte das Kuerzel für das Seitenverhaeltnis angeben: "Eingabe:
echo.
echo.
echo  Der Dateiname wird um folgenden Prefix ergaenzt: %DB%_%ID%_%QU%_%TYP%_%FSK%_%SV%
echo.
echo.
echo  Dateien umbenennen?
echo.
@Pause
for %%a in (%*) do echo "%%a" "%DB%_%ID%_%QU%_%TYP%_%FSK%_%SV%_%%a"
echo  Ordner erstellen?
@Pause
rem Ordner erstellen
rem md "%Typ%_%ID%"
@Pause
 
Zuletzt bearbeitet:
Ich bin mir nicht wirklich sicher, aber ich glaube, Deine Verwendung von "set" ist nicht syntaxkonform.
set /p SV="Bitte das Kuerzel für das Seitenverhaeltnis angeben: "Eingabe:

Andere Sache: Du solltest dann wohl auch nur den Dateinamen erweitern statt dem vollen Pfad bzw. jeden Parameter in Pfad und Dateiname trennen, dateinamen ändern, und dann wieder zusammenfügen. Was passiert, wenn Du das nicht machst, hast Du ja mittlerweile gesehen.
 
Zuletzt bearbeitet:
Hm, kann das daran liegen? Ich konnte die Dateien ja schon wie gewünscht umbenennen, nur hat es eben immer den gesamten Ordnerinhalt erwischt. Den Fehler bekomme ich auch erst ab Zeile 78 und diese Code-Zeile hat mit der selben Verwendung von set funktioniert:
Code:
for %%a in (*) do rename "%%a" "%DB%_%ID%_%QU%_%TYP%_%FSK%_%SV%_%%a"
Edit:
Ok, dann versuche ich mal Pfad und Dateiname zu trennen. Hab da auf der von dir empfohlenen Seite schon was darüber gesehen. Mich wundert nur, dass es mit (*) nur die Dateien umbenannt hat und das einigermaßen funktioniert hat. Danke schon mal für die Mühe!
 
Zuletzt bearbeitet:
Desdinova schrieb:
Mich wundert nur, dass es mit (*) nur die Dateien umbenannt hat und das einigermaßen funktioniert hat.

Das liegt daran, daß das Script nicht die angegebenen Parameter verwendet hat, sondern den Ordnerinhalt des Ordners, in dem das Script aufgerufen wurde.

Ehrlich gesagt, habe ich kaum noch Erinnerung an Batch-Scripting. Ich arbeite eher in bash, und würde spätestens jetzt tools wie sed, awk, etc vermissen.
 
Ok, verstehe. Dann sehe ich mir das mit dem Trennen des Pfads jetzt einfach mal an. Das hätte ich wahrscheinlich ohnehin tun müssen, weil ein paar Funktionen des Batchs später auch in die Richtung gehen.

Bash ist ja laut Wikipedia (ja, so gut kenne ich mich damit aus :rolleyes:) nur unter Linux verfügbar und hier im Arbeitsumfeld muss ich mich leider nach den Gegebenheiten richten. Für maximale Kompatibilität kam da eben nur Batch in Frage, was mir aber jetzt auch sehr umständlich erscheint. Muss ich dir Recht geben.
 
Gibt auch eine Möglichkeit, die bash unter windows zu nutzen (cygwin), allerdings weiß ich nicht, wie gut dieser Port ist, noch, ob der gesamte Funktionsumfang portiert wurde, würde ich aber nicht von ausgehen. Sachen wie less, tail, head, awk, etc. existieren schließlich losgelöst davon.


Was für Dich evtl. noch interessant sein könnte, wäre die Powershell, die wohl ein wenig mehr kann als der altehrwürdige DOS-Befehlszeileninterpreter.

Zu den Zeiten, als ein 80286er noch state-of-the-art schien, habe auch ich noch recht viel mit batch-Dateien gemacht, aber selbst mit Hilfsprogrammen lässt sich das nicht wirklich mit den Möglichkeiten von shells wie der zsh oder eben auch der bash vergleichen, nicht wirklich.
 
cygwin ist mir vorhin auch begegnet als ich mich über Bash informiert habe. Ein Problem ist nur unsere sehr restriktive IT (großer Konzern mit ausgeprägtem Beamtentum), die die Installation einer dll auf mehreren Rechnern nicht durchführen würde. Daher bin ich auf Möglichkeiten angewiesen, die jeder Windows-Rechner von vornherein mitbringt. Batch sieht da im ersten Moment auch sehr sympatisch aus, wenn man von Programmieren wenig Ahnung hat, nur kommt man für relativ einfache Sachen eben schnell in einen Wust an Work-Arounds. Dagegen sieht Powershell eigentlich ganz gut aus. Das sehe ich mir morgen auf jeden Fall mal an!
 
Verwende einfach den Modifizierer:
Code:
for %%a in (%*) do (echo "%%~nxa")

Edit:
Du kannst weitere finden mit
for /? in der Eingabezeile
 
Zuletzt bearbeitet:
Jetzt klappts :)
Code:
for %%a in (%*) do rename "%%~nxa" "%DB%_%ID%_%QU%_%TYP%_%FSK%_%SV%_%%~nxa"

Vielen Dank euch beiden für die Hilfe!
Die Powershell sehe ich mir trotzdem noch an und werde versuchen das Script darin nachzubauen, wenn ich es in Batch fertiggestellt habe. So bekomme ich ein bisschen Übung und einen kleinen Überblick über die Herangehensweisen.

Edit:
Guter Tipp übrigens mit for /?
Das ist ja überraschend gut dokumentiert.
 
Zuletzt bearbeitet:
Zurück
Oben