Epub-Datein mit Name des Autor und Titel in angelegte Ordner einsortieren
Hallo,
Ich habe einen Ordner mit ganz vielen Epub Dateien. F:\EBooks\Unsortiert.
Dann habe ich den Ordner F:\EBooks\Autoren.
Darunter habe ich schon mal viele Ordner händisch angelegt.
Die Ordner haben den Namen des Autoren. Sie können so aussehen:
z.B:
Adams, Melody
Aiken, L. Roy
Finlay, Charles Coleman
Saint-Saens, Charles-Camille
Salis-Seewis, Johann Gaudenz von
Schenkendorf, Max von
Armentrout, Jennifer L
Cast, P. C
Ein "." Punkt am Ende des Ordnernamen geht nicht. Wird von Windows entfernt.
Die Dateinamen sehen folgendermaßen aus:
Adams, Melody - Titel.epub
Aiken, L. Roy - Titel.epub
Finlay, Charles Coleman - Titel.epub
Saint-Saens, Charles-Camille - Titel.epub
Salis-Seewis, Johann Gaudenz von - Titel.epub
Schenkendorf, Max von - Titel.epub
Armentrout, Jennifer L. - Titel.epub
Cast, P. C. - Titel.epub
Im Dateinamen ist der "." Punkt vorhanden.
Was immer gleich ist das zwischen dem Namen und dem Titel ein Bindestrich zwischen 2 Leerzeichen ist.
Ich würde gerne mit einer Batchscript die Dateien in die entsprechenden Ordner verschieben. Und sollte ein Ordner nicht da sein wäre es
schön wenn er angelegt werden könnte.
Ich habe natürlich schon mal geschaut und etwas begonnen. Aber die For-Schleife weiß ich nicht zu erstellen falls ich überhaupt eine brauche.
Ich habe hier im Forum schon geschaut aber was ich brauche mit den vielen Varrianten von Namen ist hier im Forum auch nicht zu finden.
Und obendrein bin ich mit den Befehlen tokens, delims usw. auf Kriegsfuß ich verstehe Sie nicht.
Könnte mir einer von Euch bitte helfen. Ich weiß nicht mehr weiter. Vielen Dank im voraus.
Mfg Tommylik
Ich habe einen Ordner mit ganz vielen Epub Dateien. F:\EBooks\Unsortiert.
Dann habe ich den Ordner F:\EBooks\Autoren.
Darunter habe ich schon mal viele Ordner händisch angelegt.
Die Ordner haben den Namen des Autoren. Sie können so aussehen:
z.B:
Adams, Melody
Aiken, L. Roy
Finlay, Charles Coleman
Saint-Saens, Charles-Camille
Salis-Seewis, Johann Gaudenz von
Schenkendorf, Max von
Armentrout, Jennifer L
Cast, P. C
Ein "." Punkt am Ende des Ordnernamen geht nicht. Wird von Windows entfernt.
Die Dateinamen sehen folgendermaßen aus:
Adams, Melody - Titel.epub
Aiken, L. Roy - Titel.epub
Finlay, Charles Coleman - Titel.epub
Saint-Saens, Charles-Camille - Titel.epub
Salis-Seewis, Johann Gaudenz von - Titel.epub
Schenkendorf, Max von - Titel.epub
Armentrout, Jennifer L. - Titel.epub
Cast, P. C. - Titel.epub
Im Dateinamen ist der "." Punkt vorhanden.
Was immer gleich ist das zwischen dem Namen und dem Titel ein Bindestrich zwischen 2 Leerzeichen ist.
Ich würde gerne mit einer Batchscript die Dateien in die entsprechenden Ordner verschieben. Und sollte ein Ordner nicht da sein wäre es
schön wenn er angelegt werden könnte.
Ich habe natürlich schon mal geschaut und etwas begonnen. Aber die For-Schleife weiß ich nicht zu erstellen falls ich überhaupt eine brauche.
@echo off & setlocal ENABLEDELAYEDEXPANSION
:: Quellordner
set "quelle=F:\EBooks\Unsortiert"
:: Zielordner
set "ziel= F:\EBooks\Autoren\"
:: Durchlaufe die Dateinen....?
for /f "tokens=1,2 delims=," %%a in (?????) DO @(
:: Wenn der Ordner noch nicht existiert, erstelle ihn
if not exist "!zielordner!" md "!zielordner!"
:: Verschiebe Datei in den neuen Ordner
move "%quelle%\!file!" "!zielordner!"
)
Ich habe hier im Forum schon geschaut aber was ich brauche mit den vielen Varrianten von Namen ist hier im Forum auch nicht zu finden.
Und obendrein bin ich mit den Befehlen tokens, delims usw. auf Kriegsfuß ich verstehe Sie nicht.
Könnte mir einer von Euch bitte helfen. Ich weiß nicht mehr weiter. Vielen Dank im voraus.
Mfg Tommylik
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 302556
Url: https://administrator.de/contentid/302556
Ausgedruckt am: 17.11.2024 um 11:11 Uhr
40 Kommentare
Neuester Kommentar
Hi,
so oder so ähnlich könnte es laufen:
wenn alles passt, das echo vor md und copy/(move) in Zeile 15/16 entfernen...
Edit: Da bin ich noch mal mit einem Edit, weil ich gerade gesehen habe, dass Dateien wie Saint-Saens, Charles-Camille - Titel.epub oder Salis-Seewis, Johann Gaudenz von - Titel.epub nicht den richtigen Ordner erstellen... hier eine kleine Anpassung
Ich hoffe, dass es jetzt so ist wie du es haben brauchst.
so oder so ähnlich könnte es laufen:
@echo off & setlocal enabledelayedexpansion
cls
set "Verzeichnis=%~dp0"
set "Typ=*.epub"
set "ZielVerzeichnis=F:\EBooks\Autoren\"
pushd %Verzeichnis% || goto :eof
for /f "delims=" %%i in ('dir /b /a-d "%Typ%"') do (
for /f "delims=- tokens=1" %%j in ("%%i") do (
set "DateiName=%%j"
set "DateiName=!DateiName:~0,-1!"
echo Erstelle: "!DateiName!"
echo md "%ZielVerzeichnis%!Dateiname!" 2>nul
echo copy "%%i" "%ZielVerzeichnis%!Dateiname!"
)
)
pause>nul
wenn alles passt, das echo vor md und copy/(move) in Zeile 15/16 entfernen...
Edit: Da bin ich noch mal mit einem Edit, weil ich gerade gesehen habe, dass Dateien wie Saint-Saens, Charles-Camille - Titel.epub oder Salis-Seewis, Johann Gaudenz von - Titel.epub nicht den richtigen Ordner erstellen... hier eine kleine Anpassung
@echo off & setlocal enabledelayedexpansion
cls
set "Verzeichnis=%~dp0"
set "Typ=*.epub"
set "ZielVerzeichnis=F:\EBooks\Autoren\"
pushd %Verzeichnis% || goto :eof
for /f "delims=" %%i in ('dir /b /a-d "%Typ%"') do (
set "Datei=%%i"
set "Datei=!Datei: - =#!"
for /f "delims=# tokens=1" %%j in ("!Datei!") do (
set "DateiName=%%j"
echo Erstelle: "!DateiName!"
echo md "%ZielVerzeichnis%!Dateiname!" 2>nul
echo copy "%%i" "%ZielVerzeichnis%!Dateiname!"
echo.
)
)
pause>nul
Hi,
du könntest einfach den dir Befehl um eine weiteren Suchkriterium erweitern, sprich ein Komma muss vorhanden sein, zb.:
Sucht nach allen Dateien mit der Endung .epub und einem , in Dateiname, alle Dateien ohne , werden übersprungen.
Du kannst den oberen Code um
ergänzen (Zeile 02), bzw. ändern (Zeile 04).
du könntest einfach den dir Befehl um eine weiteren Suchkriterium erweitern, sprich ein Komma muss vorhanden sein, zb.:
...
('dir /b /a-d "*,*.epub"')
...
Du kannst den oberen Code um
...
set "Suchstring=*,"
...
for /f "delims=" %%i in ('dir /b /a-d "%Suchstring%%Typ%"') do (
...
Moin.
Und wer es als Powershell mit allen genannten Bedingungen braucht, bidde :
Gruß jodel32
Und wer es als Powershell mit allen genannten Bedingungen braucht, bidde :
$quelle = 'F:\EBooks\Unsortiert'
$ziel = 'F:\EBooks\Autoren'
# Verarbeite alle ePub Dateien die dem Muster entsprechen
gci $quelle -Filter '*.epub' | ?{$_.Basename -match '^(.+?,.+?)\.? - (.*)$'} | %{
# setze neuen Pfad mit dem Submatch der Regular Expression zusammen
$dest = "$ziel\$($matches[1])"
# wenn Ordner nicht existiert erstelle ihn
if (!(Test-Path $dest)){md $dest -Force | out-null}
# verschiebe Datei
move-item $_.Fullname -Destination $dest -Force
}
Hi,
das kannst du per:
mache, das echovor ren muss du entfernen wenn alles passt.
Den Stück Code einfach vor dem oberen stellen, damit wird zuerst umbenannt, dann kopiert/verschoben.
das kannst du per:
for /f "delims=" %%i in ('dir /b /a-d "*.epub"^|findstr /V "[,]"') do (
for /f "tokens=1,2*" %%j in ("%%i") do (
echo Umbenenne: "%%i" zu "%%j, %%k %%l"
echo ren "%%i" "%%j, %%k %%l"
echo.
)
)
pause>nul
Den Stück Code einfach vor dem oberen stellen, damit wird zuerst umbenannt, dann kopiert/verschoben.
Habe oben Kommentare hinzugefügt.
Die Essenz ist hier ist der Filter welcher nur Dateien nimmt die deinen Vorgaben entsprechen.
Mit diesem Teil hier
werden nur Dateien selektiert die am Namensanfang des Dateinamens (ohne Dateiendung->Basename!) vor dem ' - ' mindestens ein Komma besitzen.
Zusätzlich wird ein "eventuell" vorhandener Punkt welcher aber nicht vorhanden sein muss (siehe das Fragezeichen), ausgefiltert \.?. Die Klammern bezeichnen einen Regular-Expression Submatch auf den man später mit der globalen Variablen $matches[Submatchnummer] zugreifen kann. $matches[1] enthält dann nur den Teil den du für den Ordnernamen benutzen willst. Das zweite Klammernpaar hat jetzt bei deiner Aufgabe keine Relevanz aber damit könntest du in deinem Fall jetzt den Titel für eine andere Aufgabe extrahieren welcher jetzt jeweils in der Variablen $matches[2] stünde.
So ist das ganze ziemlich effizient und man hat mit RegularExpressions eine viel feinere Kontrolle was man extrahieren will. Regex ist sehr mächtig und lässt sich in so gut wie jeder Programmiersprache anwenden, es lohnt sich definitiv diese zu lernen, denn damit eröffnen sich dir Text-Extrahierungsmöglichkeiten die sonst nie möglich wären.
Die Dateien die nicht dem Muster entsprechen verbleiben dann einfach in dem Ordner und du kannst sie manuell umbenennen.
https://www.windowspro.de/andreas-kroschel/powershell-scripts-ausfuehren
Gruß jodel32
Die Essenz ist hier ist der Filter welcher nur Dateien nimmt die deinen Vorgaben entsprechen.
Mit diesem Teil hier
?{$_.Basename -match '^(.+?,.+?)\.? - (.*)$'}
Zusätzlich wird ein "eventuell" vorhandener Punkt welcher aber nicht vorhanden sein muss (siehe das Fragezeichen), ausgefiltert \.?. Die Klammern bezeichnen einen Regular-Expression Submatch auf den man später mit der globalen Variablen $matches[Submatchnummer] zugreifen kann. $matches[1] enthält dann nur den Teil den du für den Ordnernamen benutzen willst. Das zweite Klammernpaar hat jetzt bei deiner Aufgabe keine Relevanz aber damit könntest du in deinem Fall jetzt den Titel für eine andere Aufgabe extrahieren welcher jetzt jeweils in der Variablen $matches[2] stünde.
So ist das ganze ziemlich effizient und man hat mit RegularExpressions eine viel feinere Kontrolle was man extrahieren will. Regex ist sehr mächtig und lässt sich in so gut wie jeder Programmiersprache anwenden, es lohnt sich definitiv diese zu lernen, denn damit eröffnen sich dir Text-Extrahierungsmöglichkeiten die sonst nie möglich wären.
Die Dateien die nicht dem Muster entsprechen verbleiben dann einfach in dem Ordner und du kannst sie manuell umbenennen.
Was brauche ich für PowerShell?
Wie man mit Powershell-Skripten anfängt steht hier gut beschrieben:https://www.windowspro.de/andreas-kroschel/powershell-scripts-ausfuehren
Gruß jodel32
Hi,
ja da hast du gut aufgepasst
Also was du noch machen könntest wäre eine ausschließen Datei (zb. auslassen.txt) zu erstellt, mit Begriffen die ausgelassen werden sollen und so das ganze ausschließen.
Inhalt der auslassen.txt
ja da hast du gut aufgepasst
Also was du noch machen könntest wäre eine ausschließen Datei (zb. auslassen.txt) zu erstellt, mit Begriffen die ausgelassen werden sollen und so das ganze ausschließen.
...
for /f "delims=" %%i in ('dir /b /a-d "*.epub"^|findstr /v /g:"auslassen.txt"') do (
...
- Scotch
- Boyle
- Phillips
- Roy
Hi,
ja, du liegst da richtig, wenn Phillips in einer filter datei drin ist, dann werden selbsverständlich alle Dateinamen die ein Phillips drin haben, gefiltert.
So, ich hab mir das alles jetzt noch mal angeschaut und bin zum dem Schluss gekommen, dass man es besser in Teilen verarbeiten sollte. Zuerst werden dreistellige Namen (Jennifer L. Armentrout - Titel.epub), dann zweistellige Namen (Adams Melody - Titel.epub) nach deinem Muster "normalisiert", anschließen wird das ganze verschoben.
Das ganze sieht dann so aus:
Ich habe das ganze lediglich mit:
Problem sehe ich bei Namen wie Johann Wolfgang von Goethe (wenn es überhaupt ein Problem ist!) den das wird zu Goethe, Johann Wolfgang von.
Ich weiß nicht wie da die Formatierung aussehen soll, von Goethe, ... oder Goethe, ...
Gegenbefalls muss du noch eine weitere for /f Schleife davor setzten, die solchen Namen richtig filtert und zerlegt.
Das könnte (wird) jedoch mit der dreistelligen Schliefe kollidieren, man könnte diese Dateien zuerst z. B. in ein Von Verzeichnis verschieben und später extra verarbeiten, die Möglichkeiten sind da vielfältig.
wie immer nicht vergessen es scharf zu stellen
Schöne Grüße
Nachtrag: Vierstellige Namen wie Ernst Theodor Amadeus Hoffmann oder John Ronald Reuel Tolkien werden falsch zerlegt, da muss du noch eine weitere for /f Schleife davor stellen, die vierstellig filtert und diese Namen richtig zerlegt, orientieren kannst du dich da an der dreistelligen und zweistelligen for /f Schleife
ja, du liegst da richtig, wenn Phillips in einer filter datei drin ist, dann werden selbsverständlich alle Dateinamen die ein Phillips drin haben, gefiltert.
So, ich hab mir das alles jetzt noch mal angeschaut und bin zum dem Schluss gekommen, dass man es besser in Teilen verarbeiten sollte. Zuerst werden dreistellige Namen (Jennifer L. Armentrout - Titel.epub), dann zweistellige Namen (Adams Melody - Titel.epub) nach deinem Muster "normalisiert", anschließen wird das ganze verschoben.
Das ganze sieht dann so aus:
@echo off & setlocal enabledelayedexpansion & title %~n0
cls
REM Verzeichnisse angeben
set "Verzeichnis=%~dp0"
set "Typ=*.epub"
set "ZielVerzeichnis=%Verzeichnis%Autoren\"
set "Backup=%Verzeichnis%Backup.txt
pushd %Verzeichnis% || goto :eof
dir /b /a-d "*.epub">%Backup%
REM dreistellige Namen
set "Suchstring=?* ?* ?*-"
for /f "delims=" %%i in ('dir /b /a-d "%Suchstring%%Typ%"') do (
for /f "tokens=1,2,3*" %%j in ("%%i") do (
echo Aus: "%%i" Zu: "%%l, %%j %%k %%m"
echo ren "%%i" "%%l, %%j %%k %%m"
echo.
)
)
echo wir legen eine Pause ein
echo.
pause>nul
REM zweistellige Namen
set "Suchstring=?* ?*-"
for /f "delims=" %%i in ('dir /b /a-d "%Suchstring%%Typ%"^|findstr /V "\,"') do (
for /f "tokens=1,2*" %%j in ("%%i") do (
echo Aus: "%%i" Zu: "%%k, %%j %%l"
echo ren "%%i" "%%k, %%j %%l"
echo.
)
)
echo wir legen eine Pause ein
echo.
pause>nul
REM Dateinamen ins vorgegebenen Verzeichnis verschieben
REM ein , muss in Dateinamen vorhanden sein
set "Suchstring=*,"
for /f "delims=" %%i in ('dir /b /a-d "%Suchstring%%Typ%"') do (
set "Datei=%%i"
set "Datei=!Datei: - =#!"
for /f "delims=# tokens=1" %%j in ("!Datei!") do (
set "DateiName=%%j"
echo Erstelle: "!DateiName!"
echo md "%ZielVerzeichnis%!Dateiname!" 2>nul
echo move "%%i" "%ZielVerzeichnis%!Dateiname!"
echo.
)
)
pause>nul
- Aus: "Aiken L. Roy - Titel.epub" Zu: "Roy, Aiken L. - Titel.epub"
- Aus: "Jennifer L. Armentrout - Titel.epub" Zu: "Armentrout, Jennifer L. - Titel.epub"
- Aus: "Salis-Seewis Johann Gaudenz von - Titel.epub" Zu: "Gaudenz, Salis-Seewis Johann von - Titel.epub"
- Aus: "Scotch Winn Allison - Titel.epub" Zu: "Allison, Scotch Winn - Titel.epub"
- Aus: "Susan Elizabeth Phillips - Titel.epub" Zu: "Phillips, Susan Elizabeth - Titel.epub"
- Aus: "T. C. Boyle - Titel.epub" Zu: "Boyle, T. C. - Titel.epub"
- Aus: "Adam Nevill - Der letzte Tag.epub" Zu: "Nevill, Adam - Der letzte Tag.epub"
- Aus: "Adams Melody - Titel.epub" Zu: "Melody, Adams - Titel.epub"
- Aus: "Haas Wolf - Titel.epub" Zu: "Wolf, Haas - Titel.epub"
- Aus: "Maik Phillips - Titel.epub" Zu: "Phillips, Maik - Titel.epub"
- Aus: "Saint-Saens Charles-Camille - Titel.epub" Zu: "Charles-Camille, Saint-Saens - Titel.epub"
Problem sehe ich bei Namen wie Johann Wolfgang von Goethe (wenn es überhaupt ein Problem ist!) den das wird zu Goethe, Johann Wolfgang von.
Ich weiß nicht wie da die Formatierung aussehen soll, von Goethe, ... oder Goethe, ...
Gegenbefalls muss du noch eine weitere for /f Schleife davor setzten, die solchen Namen richtig filtert und zerlegt.
for /f "delims=" %%i in ('dir /b /a-d "*von*.epub"') do
wie immer nicht vergessen es scharf zu stellen
Schöne Grüße
Nachtrag: Vierstellige Namen wie Ernst Theodor Amadeus Hoffmann oder John Ronald Reuel Tolkien werden falsch zerlegt, da muss du noch eine weitere for /f Schleife davor stellen, die vierstellig filtert und diese Namen richtig zerlegt, orientieren kannst du dich da an der dreistelligen und zweistelligen for /f Schleife
Hi,
ja das ist ein Problem.
Meine Meinung nach wird das sehr schwierig jede Möglichkeit per batch abzufangen.
Ich habe das jetzt noch mal etwas erweitert bzw. angepasst, jetzt wird dein Fall ignoriert.
Dateien wie Johann Wolfgang von Goethe - Titel.epub oder Salis-Seewis Johann Gaudenz von - Titel.epub werden mit dem Script ignoriert, weil ein 'von' im Dateinamen vorliegt und das Script es weg filtert.
Dateinamen wie:
Das gleiche gilt für:
wie immer nicht vergessen es scharf zu stellen ;)
Nachtrag: angepasst
Mit freundlichen Grüßen
ja das ist ein Problem.
Meine Meinung nach wird das sehr schwierig jede Möglichkeit per batch abzufangen.
Ich habe das jetzt noch mal etwas erweitert bzw. angepasst, jetzt wird dein Fall ignoriert.
@echo off & setlocal enabledelayedexpansion & title %~n0
cls
set "Verzeichnis=%~dp0"
set "Typ=*.epub"
set "ZielVerzeichnis=%Verzeichnis%Autoren\"
set "Liste=%Verzeichnis%Liste.txt
pushd %Verzeichnis% || goto :eof
dir /b /a-d "*.epub">%Liste%
REM vierstellige Namen, Dateinamen die ein 'von' enthalten werden gefiltert
set "Suchstring=?* ?* ?* ?*-"
for /f "delims=" %%i in ('dir /b /a-d "%Suchstring%%Typ%"^|findstr /v /r "von"^|findstr /v /r "[A-Z]-[A-Z]"') do (
for /f "tokens=1,2,3,4*" %%j in ("%%i") do (
echo Von: "%%i" Zu: "%%m, %%j %%k %%l %%n"
echo ren "%%i" "%%m, %%j %%k %%l %%n"
echo.
)
)
echo wir legen eine Pause ein
echo.
pause>nul
REM dreistellige Namen, Dateinamen mit einem ',' und die ein 'von' enthalten werden gefiltert
set "Suchstring=?* ?* ?*-"
for /f "delims=" %%i in ('dir /b /a-d "%Suchstring%%Typ%"^|findstr /V "\,"^|findstr /v /r "von"^|findstr /v /r "[A-Z]-[A-Z]"') do (
for /f "tokens=1,2,3*" %%j in ("%%i") do (
echo Von: "%%i" Zu: "%%l, %%j %%k %%m"
echo ren "%%i" "%%l, %%j %%k %%m"
echo.
)
)
echo wir legen eine Pause ein
echo.
pause>nul
REM zweistellige Namen, Dataeinamen mit einem ',' und die ein 'von' enthalten werden gefiltert
set "Suchstring=?* ?*-"
for /f "delims=" %%i in ('dir /b /a-d "%Suchstring%%Typ%"^|findstr /V "\,"^|findstr /v /r "von"^|findstr /v /r "[A-Z]-[A-Z]"') do (
for /f "tokens=1,2*" %%j in ("%%i") do (
echo Von: "%%i" Zu: "%%k, %%j %%l"
echo ren "%%i" "%%k, %%j %%l"
echo.
)
)
echo wir legen eine Pause ein
echo.
pause>nul
REM Dateinamen ins vorgegebenen Verzeichnis verschieben
REM ein , muss in Dateinamen vorhanden sein
set "Suchstring=*,"
for /f "delims=" %%i in ('dir /b /a-d "%Suchstring%%Typ%"') do (
set "Datei=%%i"
set "Datei=!Datei: - =#!"
for /f "delims=# tokens=1" %%j in ("!Datei!") do (
set "DateiName=%%j"
echo Erstelle: "!DateiName!"
echo md "%ZielVerzeichnis%!Dateiname!" 2>nul
echo move "%%i" "%ZielVerzeichnis%!Dateiname!"
echo.
)
)
pause>nul
Dateinamen wie:
- Isabell Schmitt-Egner - Habitat - im Toedlichen Gehege.epub
- Saint-Saens Charles-Camille - Titel.epub
Das gleiche gilt für:
- Salis-Seewis Johann Gaudenz von - Titel.epub
- Johann Wolfgang von Goethe - Titel.epub
wie immer nicht vergessen es scharf zu stellen ;)
Nachtrag: angepasst
Mit freundlichen Grüßen
Leude, warum macht ihr es euch so kompliziert und lest den Autor und Titel nicht direkt aus der ePub informations-Datei aus ?? Dort stehen die Infos schön getrennt in der XML-Datei content.opf drin, das ePub ist nämlich in der Struktur ein ZIP-File. Wie das geht hatten wir gerade erst hier.
Lösung gesucht: aus epub METADATA title leeren. eBookReader soll dadurch nach Dateinamen sortieren bzw. diese anzeigen
Und mit Regex und Powershell ist das zerlegen dann ein Kinderspiel, s. Erläuterungen oben.
Lösung gesucht: aus epub METADATA title leeren. eBookReader soll dadurch nach Dateinamen sortieren bzw. diese anzeigen
Und mit Regex und Powershell ist das zerlegen dann ein Kinderspiel, s. Erläuterungen oben.
Hi,
damit bekommst du den zweiten und dritten " - " weg. Erklärung habe ich jeweils dazu gelegt.
getstet mit:
wie immer nicht vergessen es scharf zu stellen ;)
@114757 viele Wege führen nach Rom
mfg
damit bekommst du den zweiten und dritten " - " weg. Erklärung habe ich jeweils dazu gelegt.
@echo off & setlocal enabledelayedexpansion
cls
set "Verzeichnis=%~dp0"
set "Typ=*.epub"
pushd %Verzeichnis% || goto :eof
set "Suchstring=?*-?*-?*"
for /f "delims=" %%i in ('dir /b /a-d "%Suchstring%%Typ%"^|findstr /V "\,"') do (
set "Dateiname=%%i"
REM zum Testen sind echos an jeder Stelle vorhanden
REM damit kannst du mein Gedankengang nachvollziehen
echo Org. Dateiname: !Dateiname!
REM Hier werden alle " - " zu # umgewandelt (ohne "" versteht sich)
REM notwendig um später die Teile zu extrahieren! Mit " - " kann man
REM schlecht arbeiten ;-)
set "Dateiname=!Dateiname: - =#!"
echo Dateiname ohne " - " !Dateiname!
REM hier wird der erste Teilstück (Token) aus dem Dateiname (%%i)
REM bis zu erste # extrahiert und zu Namen geformt
for /f "tokens=1* delims=#" %%a in ("!Dateiname!") do (
set "Name=%%a"
echo nur Name: !Name!
)
REM Hier wird der zweite, dritte und vierte Teil bis anschließend
REM Ende aus dem Dateiname (%%i) extrahiert und wieder zusammen gesetzt
REM das ganze ergibt dann den Titel, Teilstück immer bis nächste #
for /f "tokens=2,3,4* delims=#" %%e in ("!Dateiname!") do (
set "Titel=%%e %%f %%g"
echo nur Titel: !Titel!
)
REM Hier wird der Teilstück Name und Teilstück Titel zusammen gefügt,
REM das ganze ergibt dann, den neuen Dateinamen inq. der Endung .epub
REM der Bindestrich müssen jetzt noch einfügt werden, da alle # weg sind
set "DateiNa=!Name! - !Titel!"
echo Zusammengesetzt: "!DateiNa!"
echo.
REM hier wird umbenannt
echo ren "%%i" "!DateiNa!"
echo.---------
)
pause>nul
- aus F. Paul Wilson - Widersacher - Zyklus 01 - das Kastell.epub wird F. Paul Wilson - Widersacher Zyklus 01 das Kastell.epub
- aus Gabriele Keiser - Franca Mazzari 02 - Gartenschläfer.epub wird Gabriele Keiser - Franca Mazzari 02 Gartenschläfer.epub
- aus Isabell Schmitt-Egner - Habitat - im Toedlichen Gehege.epub wird Isabell Schmitt-Egner - Habitat im Toedlichen Gehege.epub
wie immer nicht vergessen es scharf zu stellen ;)
@114757 viele Wege führen nach Rom
mfg
Vor die Schleife setzen
dir /b /a-d "%Suchstring%%Typ%" | findstr /V "\," >nul 2>&1 || echo Nichts gefunden
Hi,
nun da gibt es viele Möglichkeiten
Man könnte es per for /f Schleife entfernen lassen:
Man holt den ersten Token bis Ausrufungszeichen und da es das letzte Zeichen ist, sollte es passen
Man könnte es auch einfach mit nichts ersetzten:
Der Ausrufungszeichen muss in ' ' rein sonst funktioniert es nicht.
Funktioniert auch wenn andere Zeichen noch dahinter stehen.
Man könnte auch das letzte Zeichen abschneiden, sofern es ein Ausrufungszeichen ist, zu viel arbeit
Mit freundlichen Grüßen
nun da gibt es viele Möglichkeiten
Man könnte es per for /f Schleife entfernen lassen:
@echo off & setlocal enabledelayedexpansion
cls
set "dname=das ist nur ein test!"
for /f "delims=!" %%i in ("!dname!") do echo ausgabe: %%i
Man könnte es auch einfach mit nichts ersetzten:
@echo off & setlocal enabledelayedexpansion
cls
set "dname=das ist nur ein test!"
set name=!dname:'!'=!
echo Name: !name!
Funktioniert auch wenn andere Zeichen noch dahinter stehen.
Man könnte auch das letzte Zeichen abschneiden, sofern es ein Ausrufungszeichen ist, zu viel arbeit
Mit freundlichen Grüßen
Hi,
nein es ist kein Zufall, du kannst es natürlich auch mit Prozenten als %variable% machen, nur wird das in einer verschachtelten Schleife nicht funktionieren, dafür brauchst du "setlocal enabledelayedexpansion" und da stehen variable in Ausrufungszeichen anstatt Prozenten.
Ich habe es so gemacht damit du es gleich in dein Script einbauen kannst.
Hier ein ganz einfaches Bsp.:
Zeile 3 tauscht ! mit nichts, weil hinter Gleichheitszeichen kein Zeichen angegeben ist.
Hätte man z.B. set variable=%variable:!=#%, dann wurde Ausrufezeichen mit Rautezeichen (oder halt einem anderen Zeichen) ersetzt.
In dem oberen Script verwende ich set "Dateiname=!Dateiname: - =#!" hier wird Leerzeichen Bindestrich Leerzeichen durch Rautezeichen ersetzt
Tutorial zur FOR-Schleife
Mit freundlichen Grüßen
nein es ist kein Zufall, du kannst es natürlich auch mit Prozenten als %variable% machen, nur wird das in einer verschachtelten Schleife nicht funktionieren, dafür brauchst du "setlocal enabledelayedexpansion" und da stehen variable in Ausrufungszeichen anstatt Prozenten.
Ich habe es so gemacht damit du es gleich in dein Script einbauen kannst.
Hier ein ganz einfaches Bsp.:
@echo off
set "string=das ist nur ein test!"
set string=%string:!=%
echo %string%
pause
Hätte man z.B. set variable=%variable:!=#%, dann wurde Ausrufezeichen mit Rautezeichen (oder halt einem anderen Zeichen) ersetzt.
In dem oberen Script verwende ich set "Dateiname=!Dateiname: - =#!" hier wird Leerzeichen Bindestrich Leerzeichen durch Rautezeichen ersetzt
Tutorial zur FOR-Schleife
Mit freundlichen Grüßen
Hi,
ich denke es liegt an den Ausrufezeichen, sie werden gar nicht verarbeitet, wenn sie in einem Dateinamen vorhanden sind, deshalb der Syntaxfehler (ich nehme es an!).
Nur wieso, weshalb das so ist, dafür bin ich viel zu viel ein Laie, dass ich dir das erklären könnte.
Wegen DelayedExpansion hier eine sehr informative Antwort dazu, vielleicht hilft es dir ein wenig.
ich denke es liegt an den Ausrufezeichen, sie werden gar nicht verarbeitet, wenn sie in einem Dateinamen vorhanden sind, deshalb der Syntaxfehler (ich nehme es an!).
Nur wieso, weshalb das so ist, dafür bin ich viel zu viel ein Laie, dass ich dir das erklären könnte.
Wegen DelayedExpansion hier eine sehr informative Antwort dazu, vielleicht hilft es dir ein wenig.
Du musst es nur escapen weil es sonst von der verzögerten Variablenerweiterung gefressen wird.
http://www.robvanderwoude.com/escapechars.php
Gruß jodel32
set "name=!dname:^^!=!"
Gruß jodel32
@echo off
set "QuellVerzeichnis=%~dp0"
powershell -Executionpolicy ByPass -Command "gci '%quellverzeichnis%*.epub' | ?{$_.Name -match '!' -and $_.Name -notmatch ','} | rename-item -NewName {$_.name.replace('!','')} -Force"
Ja
Wenn ja dann kann ich es nicht nutzen. Ich habe kein Zugriff auf Powershell.
Du armer. Verstehe die Admins nicht, da lassen sie die Jungs mit VBS und Batch skripten obwohl sich damit genau so viel böses anstellen lässt. Ich bekomme in roter Schrift angezeigt das irgendwas mit dem command Befehl nicht in Ordnung ist.
Ja das bekommst du wenn bei euch die Powershell deaktiviert wurde.
Gar nüscht, läuft direkt in einer normalen Batch out-of-the-box
Mit Batch gebe ich mich bei solchen Aufgabe gar nicht mehr ab, PS ist da einfach zuverlässiger in der Hinsicht., aber viele sind einfach zu bequem mal eine zukunftsfähige Skriptsprache zu lernen. Batch ist tot und gehört mit seine diversen Bugs und nicht zu Ende gedachten Features endlich in den Ruhestand geschickt...
Mit Batch gebe ich mich bei solchen Aufgabe gar nicht mehr ab, PS ist da einfach zuverlässiger in der Hinsicht., aber viele sind einfach zu bequem mal eine zukunftsfähige Skriptsprache zu lernen. Batch ist tot und gehört mit seine diversen Bugs und nicht zu Ende gedachten Features endlich in den Ruhestand geschickt...
Zitat von @Tommylik:
Ich habe nun da ich ja mich nicht auskenne dein Script als cmd Datei abgespeichert und ein Doppelklick drauf gemacht. Es hat sich die Windows Powershell geöffnet.
Mehr ist nicht passiert. Muss ich jetzt noch was machen?
Ich habe nun da ich ja mich nicht auskenne dein Script als cmd Datei abgespeichert und ein Doppelklick drauf gemacht. Es hat sich die Windows Powershell geöffnet.
Mehr ist nicht passiert. Muss ich jetzt noch was machen?
- Befindet sich die cmd direkt im Ordner der *.epub Dateien ? Das wird ja durch die Variable festgelegt.
- Wurde die Execution-Policy in einer Admin-Konsole angepasst Set-Executionpolicy RemoteSigned ?
Wenn das beachtet wurde geht das einwandfrei, getestet!
Ansonsten greift die Freischaltung der Policy bei dir noch nicht.
p.s. Das Skript gibt keine Infos aus.
Zum Debugging kannst du aber den Verbose-Parameter hinzufügen:
@echo off
set "QuellVerzeichnis=%~dp0"
powershell -Executionpolicy ByPass -Command "gci '%quellverzeichnis%*.epub' | ?{$_.Name -match '!' -and $_.Name -notmatch ','} | rename-item -NewName {$_.name.replace('!','')} -verbose -Force"
pause
Also, die Zeile macht folgendes:
Das
ist in diesem Fall in einer Batch dazu da, den Powershell-Code zwischen den Anführungszeichen auszuführen.
Schritt 1:
gci ein Alias für Get-Childitem und holt sich die Liste der *.epub Dateien des aktuellen Verzeichnisses
Schritt 2:
Nun wird diese Liste per Pipe "|" an das nächste CMDLet ?{} übergeben. Dieses Konstrukt ist eine Abkürzung für where-object, also eine Funktion die bestimmte Dateien aus der Liste ausfiltert. Du könntest dieses CMDLet als IF-Abfrage interpretieren. In diesem Fall werden nur Dateien übernommen die ein Ausrufezeichen im Dateinamen haben und die kein Komma enthalten, das habe ich deinem obigen Skript so entnommen. Das $_ ist eine Variable mit der man die Dateien und deren Eigenschaften anspricht. Man könnte also z.B. auch die Größe einer Datei checken ($_.Length) usw.
Schritt 3:
Die nun ausgefilterten Dateien benennen wir nun um und zwar indem wir dem Parameter -NewName den Ursprünglichen Dateinamen übergeben von welchem aber vorher noch das Ausrufezeichen durch nichts ersetzt wird. Das Verbose zeigt nur detailliert an was die PS macht. Das -Force erzwingt das Umbenennen falls eine Datei z.B. als ReadOnly markiert ist.
das war die ganze Magie
Um nun alle deine Sonderzeichen zu ersetzen werden wir das ganze um die Liste deiner Zeichen ergänzen und im Umbenennungsvorgang statt mit einem einfachen Replace mit einem Regular-Expressions-Replace arbeiten:
Da wir hier in einem RegEx Ausdruck bestimmte Zeichen Sonderzeichen sind und somit spezielle Bedeutung haben müssen wir diese mit einem Backslash escapen.
Das öffnende [ und das Schließende ] bedeuten das irgendein Zeichen das darin enthalten ist, durch die Regex-Engine "gecaptured" wird. D.h. also wenn irgendeines dieser Zeichen in deinem Dateinamen vorkommt dieses entfernt wird.
Mehr zu Regular-Expressions kannst du auf diversen Internetseiten und Tutorials wie z.B. diesem nachlesen, denn das Thema ist sehr vielfältig.
So, ich hoffe das hat etwas Licht in die ganze Sache gebracht und hoffentlich auch deine Neugierde auf die PS geweckt , denn Dinge die in Batch teilweise Irre Verrenkungen erfordern sind damit in 90% der Fälle als Einzeiler zu bewerkstelligen.
Gruß jodel32
Das
powershell -Executionpolicy ByPass -Command ""
Schritt 1:
gci ein Alias für Get-Childitem und holt sich die Liste der *.epub Dateien des aktuellen Verzeichnisses
gci '%quellverzeichnis%*.epub'
Nun wird diese Liste per Pipe "|" an das nächste CMDLet ?{} übergeben. Dieses Konstrukt ist eine Abkürzung für where-object, also eine Funktion die bestimmte Dateien aus der Liste ausfiltert. Du könntest dieses CMDLet als IF-Abfrage interpretieren. In diesem Fall werden nur Dateien übernommen die ein Ausrufezeichen im Dateinamen haben und die kein Komma enthalten, das habe ich deinem obigen Skript so entnommen. Das $_ ist eine Variable mit der man die Dateien und deren Eigenschaften anspricht. Man könnte also z.B. auch die Größe einer Datei checken ($_.Length) usw.
?{$_.Name -match '!' -and $_.Name -notmatch ','}
Die nun ausgefilterten Dateien benennen wir nun um und zwar indem wir dem Parameter -NewName den Ursprünglichen Dateinamen übergeben von welchem aber vorher noch das Ausrufezeichen durch nichts ersetzt wird. Das Verbose zeigt nur detailliert an was die PS macht. Das -Force erzwingt das Umbenennen falls eine Datei z.B. als ReadOnly markiert ist.
rename-item -NewName {$_.name.replace('!','')} -verbose -Force
Um nun alle deine Sonderzeichen zu ersetzen werden wir das ganze um die Liste deiner Zeichen ergänzen und im Umbenennungsvorgang statt mit einem einfachen Replace mit einem Regular-Expressions-Replace arbeiten:
@echo off
set "QuellVerzeichnis=%~dp0"
powershell -Executionpolicy ByPass -Command "gci '%quellverzeichnis%*.epub' | ?{$_.Name -match '[&\(\)/_!\?\[\]]' } | rename-item -NewName {$_.name -replace '[&\(\)/_!\?\[\]]',''} -verbose -Force"
pause
[&\(\)/_!\?\[\]]
Mehr zu Regular-Expressions kannst du auf diversen Internetseiten und Tutorials wie z.B. diesem nachlesen, denn das Thema ist sehr vielfältig.
So, ich hoffe das hat etwas Licht in die ganze Sache gebracht und hoffentlich auch deine Neugierde auf die PS geweckt , denn Dinge die in Batch teilweise Irre Verrenkungen erfordern sind damit in 90% der Fälle als Einzeiler zu bewerkstelligen.
Gruß jodel32
Zitat von @Tommylik:
Und von dieser Datei nicht.
Rudolf Glos G. - Netzwerke - (V)Dsl, Wlan, [Nas], Mediaplayer Und _Co!.epub
Kann ich absolut nicht nachvollziehen, geht hier mit beiden Skripten einwandfrei bei allen möglichen Kombinationen.Und von dieser Datei nicht.
Rudolf Glos G. - Netzwerke - (V)Dsl, Wlan, [Nas], Mediaplayer Und _Co!.epub
Muss der PS Code ein Einzeiler sein oder muss an bestimmten Stellen ein Umbruch sein?
Bei der Variante in der Batch muss es ein Einzeiler sein, und er läuft hier einwandfrei. Du solltest mal deine Powershell upgraden.Ich bin jetzt hier raus, das wird mit jetzt echt zu blöd für diese Kinkerlitzchen so viel Zeit zu investieren, sorry.
Viel Erfolg noch.
Ciao jodel