73603
Goto Top

zufällige Dateien mit Leerzeichen im Namen per Batch kopieren

Hallo zusammen,

ich war auf der Suche nach einer Möglichkeit eine Anzahl zufällig ausgewählter Dateien (in meinem Fall mp3s) von einem bestimmten Verzeichniss auf z.B. einen USB-Stick zu kopieren. Dabei bin ich über eine kleine Batch-Lösung von Biber gestolpert...

Zufällige Auswahl an Dateien per Batch kopieren

 ::------snipp LottoCopy3ofX2.bat
@echo off & setlocal EnableDelayedExpansion
:: CHANGE_THIS:
Set "quell=D:\temp" & set "target=x:\wecker"  
:: Ich wende das auf mein Verzeichnis d:\temp an...ÄNDERN!!
Set /a "max=0, lfdnr=0"  
for /f %%i in ('dir /b /a:-d %quell%') do set /a "max+=1"  
:: Variable max==Anzahl Dateien im Verzeichnis; einmal ermitteln
For %%i in (datei1, datei2, datei3) do set /a "%%i=!random!%%%max%"  
:: Die Variablen datei1, datei2, datei3 halten drei Zufallszahlen >0 und <= %max%
for /f %%i in ('dir /b /a:-d %quell%') do (  
    set /a "lfdnr+=1"  
    @for %%a in (datei1, datei2, datei3) do (
      if !%%a!==!lfdnr! @ECHO !%%a! of %max% copy /y %quell%\%%~nxi %target%\%%a.dat
    ))
::------snapp LottoCopy3ofX2.bat

Diese Batch ist eigentlich genau, dass was ich gesucht habe, allerdings ergibt sich bei mir ein Problem, da meine Dateien Leerzeichen enthalten. Ich vermute mal, dass die zu kopierenden Dateien nicht gefunden werde, da %%~nxi den Dateinamen beim ersten Leerzeichen abbricht. (Bin absoluter Batch-Neuling, aber relativ begeistert davon face-smile )
Nun meine Frage:

Wie muss ich die Schleife anpassen (eventuell mit "delims=" ?), damits funktioniert?

Vielen Dank schon mal
Ben

Content-ID: 105381

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

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

Biber
Biber 07.01.2009 um 13:08:29 Uhr
Goto Top
Moin Ben1986,

willkommen im Forum.
Ich habe es jetzt nur flüchtig überflogen und nicht getestet, aber ich denke diese kleinere Änderung sollte reichen:
Streiche : ... copy /y %quell%\%%~nxi %target%\%%a.dat
Setze : ... copy /y "%quell%\%%~nxi" "%target%\%%a.dat"

Grüße
Biber
73603
73603 07.01.2009 um 13:23:55 Uhr
Goto Top
Hi Biber,

danke für die schnelle Antwort, muss dir aber leider sagen, dass es mit in Anführungszeichen schreiben anscheinend nicht getan ist.
Ich hab mal ein "Pause" am Ende eingefügt und nach dem Durchlaufen des Programms erscheint dreimal "Das System kann die angegebene Datei nicht finden."
Biber
Biber 07.01.2009 um 13:30:56 Uhr
Goto Top
Moin Ben1986,

okay, okay,
jetzt habe ich es noch mal flüchtig überflogen und ergänze:

Erweitere for /f %%i in ('dir /b /a:-d %quell%') do ( ....
in dieses for /f "delims=" %%i in ('dir /b /a:-d %quell%') do ( ...

... wie Du ja selbst schon oben vermutet hast.

Grüße
Biber
73603
73603 07.01.2009 um 14:10:35 Uhr
Goto Top
Also die Dateinamen werden jetzt wohl richtig mit Leerzeichen erkannt.
Die Kopieranweisung lautet richtig "if ... copy /y [quelle]\[Dateiname].mp3 target\dateix.mp3"

Allerdings wird immer noch dreimal angezeigt "Da System konnte die Datei nicht finden."
Sehr seltsam...
73603
73603 07.01.2009 um 14:39:06 Uhr
Goto Top
Ok, es läuft. vielen Dank!

ich hatte bei quell=C:\"Ordner mit Leerzeichen"\... und bei target auch was in der Art angegeben.
Dann stand also in der Kopieranweisung:

if ... copy /y C\"Ordner mit Leerzeichen"\[Dateiname].mp3 target\dateix.mp3
Das System kann die angegebene Datei nicht finden

Also hab folgendes geändert: quell=C:\OrdnerohneLeerzeichen\...
ergebnis:

if ... copy /y C\OrdnerohneLeerzeichen\[Dateiname].mp3 target\dateix.mp3
Syntaxfehler

Also hab ich auch noch den Pfad vom Target verändert, sodass dort auch keine Leerzeichen mehr drinn waren und jetzt funktionierts...

Sorry für die umständliche Umschreibung...
Weißt du warum sich die " " beim setzen der Variable quell und target nicht mit der Schleife inklusive "delims=" und " " um %quell%\%%~nxi und um %target%\%%a.dat nicht vertragen?

Naja nochmal vielen Dank für die Hilfe!!!
Biber
Biber 07.01.2009 um 18:03:00 Uhr
Goto Top
Moin Ben1986,

emmhh, jetzt hast Du mich verloren...
Bitte poste doch mal Deinen kompletten Schnipsel, der jetzt die Fehlermeldungen erzeugt.
Dann kann ich auch etwas dazu sagen.

Grüße
Biber
73603
73603 07.01.2009 um 19:07:45 Uhr
Goto Top
Hi Biber,

ja, dacht ich mir fast face-smile
also die notwendige Änderung, bezüglich der abgeschnittenen Datei-Namen hab ich durchgeführt (Danke nochmal!)

for /f "delims=" %%i in ('dir /b /a:-d %quell%') do (
set /a "lfdnr+=1"
@for %%a in (datei1, datei2, datei3) do (
if !%%a!==!lfdnr! copy /y "%quell%\%%~nxi" "%target%\%%a.dat"

Danach hab ich drei Varianten, wobei die dritte endlich zum funktionierenden Programm geführt hat, ausprobiert

Variante A:
Set "quell=C:\"Eigene Dateien"\Sonstiges" & set "target=C:\"Eigene Dateien"\Weiteres"

Variante B:
Set "quell=C:\EigeneDateien\Sonstiges" & set "target=C:\"Eigene Dateien"\Weiteres"

Variante C:
Set "quell=C:\EigeneDateien\Sonstiges" & set "target=C:\EigeneDateien\Weiteres"

So, die Variante A sagt "Datei nicht gefunden", die Variante B "Syntaxfehler" und mit C funktionierts (yes face-smile)
vllt weißt du ja wo der fehler lag und kannst die Info gebrauchen...

MfG
Ben
Biber
Biber 07.01.2009 um 19:34:15 Uhr
Goto Top
Ahh ja, Ben1986, *sichVornKoppKlatsch*

JETZT verstehe ich, worum es geht.

Dieses halb- bis undokumentierte M$-Geeiere mit DIR-Befehl und "Pfadnamen mit Leerzeichen" führt wahrscheinlich rund um den Globus und auch auf der ISS immer zu abendfüllenden Dialogen.

Der Witz ist, dass WENN Du Teile des Pfadnamens in Anführungszeichen einpackst (was erlaubt ist), keine Anführungszeichen zusätzlich um das ganze Konstrukt herum sein dürfen... ach Quark, das versteht ja keine Sau.

Beispiel:
>dir "C:\"Eigene Dateien"\Sonstiges\*.*" 
--> Das System kann den angegebenen Pfad nicht finden.

>dir "C:\Eigene Dateien\Sonstiges\*.*" 
 Datenträger in Laufwerk ....

 Verzeichnis von C:\Eigene Dateien\Sonstiges
....
-> okay
>dir C:\"Eigene Dateien"\Sonstiges\*.* 

 Datenträger in ....
--> okay

Wenn Du in Deinen Schnipsel einbaust.
...
Set "quell=C:\Eigene Dateien\Sonstiges"   
Set "target=C:\Eigene Dateien\Weiteres"  
....
REM --- und etwas tiefer diese 2 Fragmente änderst:
REM  ....Jetzt: ....('dir /b /a:-d %quell%')   
REM  ...neu: ....('dir /b /a:-d "%quell%"' )  
REM NUR AN DIESEN BEIDEN STELLEN!
....

--> dann sollte es auch bei Dir fliegen.

Grüße
Biber
...
73603
73603 07.01.2009 um 19:57:38 Uhr
Goto Top
perfekt, dann haben wir uns ja wieder....
dass mit der keine doppelten Anführungszeichen macht auch halbwegs Sinn.

So, dann nochmal danke
und bis vllt demnächst
dberens
dberens 08.01.2009 um 14:26:38 Uhr
Goto Top
Hallo zusammen,

bräuchte dieses Script, allerdings mit einer kleinen Änderung. Bei mir soll er die Leerzeichen im Dateinamen durch ein
en Unterstrich (_) ersetzen und dann in den neuen Ordner kopieren / verschieben.

Viele Grüße
Biber
Biber 08.01.2009, aktualisiert am 18.10.2012 um 18:37:35 Uhr
Goto Top
Moin dberens,
bräuchte dieses Script,
Nimm hin...
allerdings mit einer kleinen Änderung.
Bei mir soll er die Leerzeichen im Dateinamen durch einen Unterstrich (_) ersetzen
Habe ich wie es der Zufall will grad vorhin vorgekaspert Leerzeichen in Dateinamen in Unterstrich umbenennen via Batch.
Den Beitrag findest Du sofort - der Benutzer war der erste Neu-User in diesem Jahr, der das ach so schwierige Wort "Umbenennen" richtig schreiben konnte.
Vergleiche auch mit Schreibvariante #389 Brauche ein Script der eine Ordner in Datumformat automatisch umbennent..


Falls es nicht auf Anhieb funktioniert mit dem Schnipsel, bitte DEINEN Jetzt-Stand einmal posten.

Grüße
Biber
dberens
dberens 08.01.2009 um 20:57:17 Uhr
Goto Top
Hallo Biber,

danke für die schnelle Antwort. Sorry für die Anfrage, hätte Sie wohl anders formulieren sollen.
Deine Vorschläge haben ja schon vielen geholfen, hoffe das du mir auch helfen kannst. face-smile

Derzeitige Situation:

Ich habe einen Ordner Test, indem mehrere Unterordner sind. In diesen Unterordner befinden sich PDF-Dateien, die mehrere Leerzeichen im Dateinamen enthalten.

Was ich mir vorstelle:

Durch ein Script will ich die Ordner durchsuchen und die Leerzeichen in den Dateinamen durch einen Unterstrich ersetzen.

Habe versucht dein Script, das an der dritten Stelle im Dateinamen ein Unterstrich einfügt, abzuändern, allerdings bin ich in Sachen Batch absoluter Anfänger.
Vermute das das Problem mit der Stelle %oldname:~0,2% zusammenhängt, das nichts passiert oder liege ich falsch?

Hier das derzeitige Script:

@echo off & setlocal 

Set "myTifDir=H:\test"   

FOR %%i in ( "%myTifDir%\*.pdf) do call: RenameWithUnderscore "%%~nxi"   

goto :eof 

:RenameWithUnderscore Parameter 1 ist der Dateiname 

Set "oldname=%~1"   

Set "OldFirst2Chars=%oldname:~0,2%"   


Set "OldChars3ToEnd=%oldname:~2%"   

IF "%oldname:~2,1%" NEQ "_" (   

ECHO Ren "%mytifDir%\%oldname%" "%OldFirst2Chars%_%OldChars3ToEnd%"   

REM nach dem Testen: Ren "%mytifDir%\%oldname%" "%OldFirst2Chars%_%OldChars3ToEnd%"   

) 
goto :eof

Würde mich über eine Hilfe freuen
Biber
Biber 08.01.2009 um 21:42:21 Uhr
Goto Top
Moin dberens,

okay, in Deinem Fall ist es alles noch viel einfacher:
:: ----------snipp RenameSpaceWithunderscore.bat
@echo off & setlocal 
Set "myTifDir=H:\test"   

FOR %%i in ( "%myTifDir%\* *.pdf") do call :RenameWithUnderscore "%%~nxi"   
goto :eof 

:RenameWithUnderscore Parameter 1 ist der Dateiname 
Set "oldname=%~1"   
Set "newname=%oldname: =_%"  

ECHO Ren "%mytifDir%\%oldname%" "%newname%"   
REM nach dem Testen: Ren "%mytifDir%\%oldname%" "%newname%"   
goto :eof
[habe Deinen Schnipsel als Vorlage genommen]

Ergebnis in meinem "E:\Test"-"Verzeichnis / mit Wildcard "E:\Test\* *.*":
>e:\schnipsel\renameSpaceWithunderscore.bat
Ren "e:\test\IE-aufrufüber vbs.txt" "IE-aufrufüber_vbs.txt"  
[ist dort die einzige Datei mit Leerzeichen im Namen]

....works as designed...

Grüße
Biber
dberens
dberens 08.01.2009 um 21:57:28 Uhr
Goto Top
Hallo Biber,

habe doch gewusst, das du mir helfen kannst. Das mit dem Umbenennen klappt wunderbar. face-smile
Optimal wäre es jetzt wenn er die umbenannte Datei wieder in den Ordner kopiert und die alte löschen würde. Zur Zeit ist noch die alte Datei mit dem Leerzeichen drin.

Grüße
Biber
Biber 08.01.2009 um 22:06:37 Uhr
Goto Top
Moin dberens,

lies bitte nochmal die Zeilen 12 und 13 im obigen Skript.
Im Moment läuft das Skriptchen im ungefährlichen Demo-Modus -
... es wird nur mit ECHO angezeigt, was gemacht werden könnte nach dem Testen.
Kommentier diese "Echo"-Zeile durch ein vorangestelltes "REM " aus.
Entferne das REM in der Zeile darunter.

Aber beides erst, nachdem Du verstanden hast, was da passiert... face-wink

Grüße
Biber
dberens
dberens 09.01.2009 um 12:08:46 Uhr
Goto Top
Hallo Biber,

vielen vielen Dank. Hat alles funktioniert, sowie ich es mir vorgestellt habe.

Wünsche dir ein schönes Wochenende

Grüße