Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

zufällige Dateien mit Leerzeichen im Namen per Batch kopieren

Frage Entwicklung Batch & Shell

Mitglied: 73603

73603 (Level 1)

07.01.2009, aktualisiert 18.10.2012, 9061 Aufrufe, 16 Kommentare

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...

http://www.administrator.de/index.php?content=28146

01.
 ::------snipp LottoCopy3ofX2.bat 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
:: CHANGE_THIS: 
04.
Set "quell=D:\temp" & set "target=x:\wecker" 
05.
:: Ich wende das auf mein Verzeichnis d:\temp an...ÄNDERN!! 
06.
Set /a "max=0, lfdnr=0" 
07.
for /f %%i in ('dir /b /a:-d %quell%') do set /a "max+=1" 
08.
:: Variable max==Anzahl Dateien im Verzeichnis; einmal ermitteln 
09.
For %%i in (datei1, datei2, datei3) do set /a "%%i=!random!%%%max%" 
10.
:: Die Variablen datei1, datei2, datei3 halten drei Zufallszahlen >0 und <= %max% 
11.
for /f %%i in ('dir /b /a:-d %quell%') do ( 
12.
    set /a "lfdnr+=1" 
13.
    @for %%a in (datei1, datei2, datei3) do ( 
14.
      if !%%a!==!lfdnr! @ECHO !%%a! of %max% copy /y %quell%\%%~nxi %target%\%%a.dat 
15.
    )) 
16.
::------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 )
Nun meine Frage:

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

Vielen Dank schon mal
Ben
Mitglied: Biber
07.01.2009 um 13:08 Uhr
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
Bitte warten ..
Mitglied: 73603
07.01.2009 um 13:23 Uhr
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."
Bitte warten ..
Mitglied: Biber
07.01.2009 um 13:30 Uhr
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
Bitte warten ..
Mitglied: 73603
07.01.2009 um 14:10 Uhr
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...
Bitte warten ..
Mitglied: 73603
07.01.2009 um 14:39 Uhr
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!!!
Bitte warten ..
Mitglied: Biber
07.01.2009 um 18:03 Uhr
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
Bitte warten ..
Mitglied: 73603
07.01.2009 um 19:07 Uhr
Hi Biber,

ja, dacht ich mir fast
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 )
vllt weißt du ja wo der fehler lag und kannst die Info gebrauchen...

MfG
Ben
Bitte warten ..
Mitglied: Biber
07.01.2009 um 19:34 Uhr
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:
01.
>dir "C:\"Eigene Dateien"\Sonstiges\*.*" 
02.
--> Das System kann den angegebenen Pfad nicht finden. 
03.
 
04.
>dir "C:\Eigene Dateien\Sonstiges\*.*" 
05.
 Datenträger in Laufwerk .... 
06.
 
07.
 Verzeichnis von C:\Eigene Dateien\Sonstiges 
08.
.... 
09.
-> okay 
10.
>dir C:\"Eigene Dateien"\Sonstiges\*.* 
11.
 
12.
 Datenträger in .... 
13.
--> okay
Wenn Du in Deinen Schnipsel einbaust.
01.
... 
02.
Set "quell=C:\Eigene Dateien\Sonstiges"  
03.
Set "target=C:\Eigene Dateien\Weiteres" 
04.
.... 
05.
REM --- und etwas tiefer diese 2 Fragmente änderst: 
06.
REM  ....Jetzt: ....('dir /b /a:-d %quell%')  
07.
REM  ...neu: ....('dir /b /a:-d "%quell%"' ) 
08.
REM NUR AN DIESEN BEIDEN STELLEN! 
09.
....
--> dann sollte es auch bei Dir fliegen.

Grüße
Biber
...
Bitte warten ..
Mitglied: 73603
07.01.2009 um 19:57 Uhr
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
Bitte warten ..
Mitglied: dberens
08.01.2009 um 14:26 Uhr
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
Bitte warten ..
Mitglied: Biber
08.01.2009, aktualisiert 18.10.2012
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
Bitte warten ..
Mitglied: dberens
08.01.2009 um 20:57 Uhr
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.

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:

01.
@echo off & setlocal  
02.
 
03.
Set "myTifDir=H:\test"  
04.
 
05.
FOR %%i in ( "%myTifDir%\*.pdf) do call: RenameWithUnderscore "%%~nxi"  
06.
 
07.
goto :eof  
08.
 
09.
:RenameWithUnderscore Parameter 1 ist der Dateiname  
10.
 
11.
Set "oldname=%~1"  
12.
 
13.
Set "OldFirst2Chars=%oldname:~0,2%"  
14.
 
15.
 
16.
Set "OldChars3ToEnd=%oldname:~2%"  
17.
 
18.
IF "%oldname:~2,1%" NEQ "_" (  
19.
 
20.
ECHO Ren "%mytifDir%\%oldname%" "%OldFirst2Chars%_%OldChars3ToEnd%"  
21.
 
22.
REM nach dem Testen: Ren "%mytifDir%\%oldname%" "%OldFirst2Chars%_%OldChars3ToEnd%"  
23.
 
24.
)  
25.
goto :eof
Würde mich über eine Hilfe freuen
Bitte warten ..
Mitglied: Biber
08.01.2009 um 21:42 Uhr
Moin dberens,

okay, in Deinem Fall ist es alles noch viel einfacher:
01.
:: ----------snipp RenameSpaceWithunderscore.bat 
02.
@echo off & setlocal  
03.
Set "myTifDir=H:\test"  
04.
 
05.
FOR %%i in ( "%myTifDir%\* *.pdf") do call :RenameWithUnderscore "%%~nxi"  
06.
goto :eof  
07.
 
08.
:RenameWithUnderscore Parameter 1 ist der Dateiname  
09.
Set "oldname=%~1"  
10.
Set "newname=%oldname: =_%" 
11.
 
12.
ECHO Ren "%mytifDir%\%oldname%" "%newname%"  
13.
REM nach dem Testen: Ren "%mytifDir%\%oldname%" "%newname%"  
14.
goto :eof
[habe Deinen Schnipsel als Vorlage genommen]

Ergebnis in meinem "E:\Test"-"Verzeichnis / mit Wildcard "E:\Test\* *.*":
01.
>e:\schnipsel\renameSpaceWithunderscore.bat 
02.
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
Bitte warten ..
Mitglied: dberens
08.01.2009 um 21:57 Uhr
Hallo Biber,

habe doch gewusst, das du mir helfen kannst. Das mit dem Umbenennen klappt wunderbar.
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
Bitte warten ..
Mitglied: Biber
08.01.2009 um 22:06 Uhr
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...

Grüße
Biber
Bitte warten ..
Mitglied: dberens
09.01.2009 um 12:08 Uhr
Hallo Biber,

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

Wünsche dir ein schönes Wochenende

Grüße
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...