26882
Goto Top

Zufällige Auswahl an Dateien per Batch kopieren

Hallo zusammen,

ich habe ein Verzeichnis A (Quellverzeichnis), in dem 100 Dateien mit ganz unterschiedlichen Dateienamen abgelegt sind.

Nun sollen 3 Dateien daraus zufällig ausgewählt werden und in ein Verzeichnis B (Zielverzeichnis) kopiert werden. Dabei sollen genau diese Dateien aber auch umbenannt werden in Datei1.dat, Datei2.dat, Datei3.dat.

Beispiel:

Quellverzeichnis A: a.xyz, b.xyz, c.xyz, d.xyz, ....
Drei Dateien werden zufällig ausgewählt und unter den Namen
Datei1.dat, Datei2.dat, Datei3.dat im Zielverzeichnis B abgelegt. Bereits existierende Dateien in B werden überschrieben. Die Dateien in A bleiben so erhalten wie sie sind.

Geht das überhaupt mit nem Batch?

Danke
Bodo

Content-ID: 28146

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

Ausgedruckt am: 23.11.2024 um 01:11 Uhr

Biber
Biber 14.03.2006 um 13:49:11 Uhr
Goto Top
Moin Bodo,

wenn Du uns erzählst, was zu dieser Anforderung geführt hat, helfe ich gern.

 ::------snipp LottoCopy3ofX.bat
@echo off & setlocal EnableDelayedExpansion
::CHANGE_THIS:
Set "quell=D:\temp" & set "target=NUL"  
:: Ich wende dasauf 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
For %%i in (f_1, f_2, f_3) do set /a "%%i=!random!%%%max%"  
:: Die Variablen f_1, f_2, f_3 halten drei Zufallszahlen >0 und <= %max%
for /f %%i in ('dir /b /a:-d %quell%') do (  
  set /a "lfdnr+=1"  
  @for %%a in (%f_1%, %f_2%, %f_3%) do (
   if %%a==!lfdnr! @ECHO %%a of %max% copy %quell%\%%~nxi %target%
))
::------snapp LottoCopy3ofX.bat
Wenn der obige Schnipsel läuft, zeigt er (bei mir) folgendes an:
LottoCopy3ofX.bat
9 of 80 copy D:\temp\cc.xml NUL
32 of 80 copy D:\temp\maennervorsaetze-05.ppt NUL
53 of 80 copy D:\temp\Saulwarrior_bewert.bmp NUL
(=13:42:44 E:\=)
LottoCopy3ofX.bat
20 of 80 copy D:\temp\extract.bat NUL
29 of 80 copy D:\temp\K001_012_20050201_ NUL
40 of 80 copy D:\temp\patching1.jpg NUL

Zum Scharfmachen einfach in der letzten Zeile
@echo %%a of %max% --------->LÖSCHEN
Es bleibt stehen:
if %%a==!lfdnr! copy %quell%\%%~nxi %target%

Und %quell% und %target% bitte auf Deine Bedürfnisse ändern.

HTH
Biber
~~~~~
P.S.
Geht das überhaupt mit nem Batch?
Gibt es außer Brotschneiden irgendetwas, das NICHT mit Batch geht?
26882
26882 14.03.2006 um 13:55:05 Uhr
Goto Top
Super, werde ich gleich heute Abend mal probieren...

Die Anforderung entstand wie folgt:

Ich habe ein Programm, welches der Reihe nach 3 Lieder abspielt (simuliert die Musik beim Einsteigen von Passagieren in ein Flugzeug).

Nu ist das aber immer die gleiche Musik (er spielt erst die Nummer1, dann die Nummer2, dann die Nummer3).

Ich will aber, dass das Ding immer wieder mal was anderes spielt (geht mir nämlich sonst auf den Wecker). Bisher habe ich die Musik, wenn ich es nicht mehr nervlich ausgehalten habe face-smile, händisch ausgetauscht. Nun wollte ich das aber automatisch haben.

Also: Ein Randomizer muss her. Am besten mit nem schnellen Batch und fertig. Und den habe ich ja gerade von dir bekommen...

Danke tausendmal dafür!
Biber
Biber 14.03.2006 um 14:09:26 Uhr
Goto Top
Ach soooo... *lacht*

Dann würde es aber wahrscheinlich reichen, mit diesen 3 (oder x) Dateinamen eine PlayList zu schreiben, wenn Dein Abspielprogramm das vorgesehen hat.
Dann sparst Du dir die Kopiererei.
Wenn das nicht geht, musst Du noch eine Zeile einbauen, die das Zielverzeichnis &target% vorher wieder löscht ("del /y %target%\*.*").

Gruß
Biber
Biber
Biber 14.03.2006 um 14:20:44 Uhr
Goto Top
Na ja,
habe noch mal Deine Anforderung durchgelesen... ist wohl nichts mit PlayList...

Dann also so:
 ::------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
Erzeugt bei mir:

LottoCopy3ofX2.bat
38 of 80 copy /y D:\temp\overwork.wmv x:\wecker\datei3.dat
69 of 80 copy /y D:\temp\TestCopytemplates.bat x:\wecker\datei1.dat
70 of 80 copy /y D:\temp\uniCSVed.zip x:\wecker\datei2.dat
(=14:17:14 E:\=)
LottoCopy3ofX2.bat
9 of 80 copy /y D:\temp\cc.xml x:\wecker\datei1.dat
37 of 80 copy /y D:\temp\oratest.reg x:\wecker\datei3.dat
75 of 80 copy /y D:\temp\Week.vbs x:\wecker\datei2.dat

Dürfte also noch besser passen bei Dir.

Gruß
Biber
26882
26882 16.03.2006 um 10:00:53 Uhr
Goto Top
Super, danke.
In der Tat ist mit Playlist nix... das Programm spielt immer erst Musik1.wav, dann Musik2.wav, Musik3.wav. Feddisch. Sonst nix.

Daher...

Wie gesagt, danke nochmal...
Biber
Biber 16.03.2006 um 10:54:36 Uhr
Goto Top
Dafür nich'...
...wie wir in Bremen sagen.

Ich setze mal den Beitrag auf gelöst und verschiebe ihn von "Programmiersprachen" nach "Batch & Shell".

Bis zum nächsten Batch.. face-wink

Biber
yashi
yashi 21.03.2006 um 13:05:05 Uhr
Goto Top
geniale lösung vom biber ^^ (wieder mal)

aber eine frage hätte ich da noch:
was passiert, wenn eine zahl 2 mal "gewürfelt" wird ?


mfg
Biber
Biber 21.03.2006 um 14:42:42 Uhr
Goto Top
Thx yashi,

stimmt, das kann passieren mit den "doppelten" Zufallszahlen..

Auch hier wieder mehrere Lösungswege..
Langfristig: Die Titelauswahl erhöhen... Statt aus 100 Titeln besser aus 500 oder 1001 Titeln wählen..
Wäre ja ohnehin mal interessant, ab wieviel Dateien pro Unterverzeichnis Windows wieder abwinkt.
Die %random%-"Funktion" jedenfalls könnte ja aus Zahlen zwischen 0 und 32767 einen Zufallswert holen.
Ob so viele (also ca 32000) Musiktitel in ein Verzeichnis passen... test it.. *gg

Aber wenn Du auch bei den vorhandenen Titeln "doppelte" vermeiden willst...dann müssen müssen wir halt prüfen, ob die numerischen Variablen %datei1%, %datei2% und %datei% unterschiedliche Werte haben.
Und ggf den Zufalls-FOR..IN..DO..-Generator nochmal durchstarten.

Ich schreib es noch mal verbal... ich will prüfen:
Ist %datei1% gleich %datei2% -oder-
Ist %datei1% gleich %datei3% -oder-
Ist %datei2% gleich %datei3% ---mit Werten wie z.B.

set datei
datei1=89
datei2=83
datei3=89

Wenn zwei Werte gleich sind, will ich per "goto :again" zurück zu einer Sprungmarke vor die FOR-Random-Anweisung.

Ist entweder mit einer unleserlichen "If ...else...else... goto"-Konstruktion machbar:

if %datei1%==%datei2% (goto Again) else if %datei1%==%datei3% (goto again) else If %datei3%==%datei2% goto again
--> würde übersetzt werden zu:
if 89==83 (goto Again) else if 89==89 (goto Again) else If 89==83 goto Again

-oder- (etwas wartbarer), wenn das Produkt aller Differenzen Null ist->dann sind zwei der Zahlen gleich.

Set /a DupCheck=(%datei1%-%datei2%)*(%datei2%-%datei3%)*(%datei1%-%datei3%)
--> würde mit den obigen Beispielwerten übersetzt werden zu:
echo Set /a DupCheck=(%datei1%-%datei2%)*(%datei2%-%datei3%)*(%datei1%-%datei3%)
Set /a DupCheck=(89-83)*(83-89)*(89-89)
---> wenn hier 0 herauskommt, waren Zufalls-Zahlen "doppelt" vorhanden.
oder, auf bätschisch:
If %DupCheck%==0 goto Again


In die letzte Batchvariante eingebaut sähe das so aus::
...

:Again
For %%i in (datei1, datei2, datei3) do set /a "%%i=!random!%%%max%"
:: Die Variablen datei1, datei2, datei3 halten drei Zufallszahlen >0 und <= %max%

Set /a DupCheck=(%datei1%-%datei2%)*(%datei2%-%datei3%)*(%datei1%-%datei3%)
If %DupCheck%==0 goto Again

...

(Habs nicht getestet, bin aber zuversichtlich)

Grüße
Biber
yashi
yashi 22.03.2006 um 12:27:03 Uhr
Goto Top
Also das mit dem Produkt aller Differenzen ist ja wohl selten genial !! Ich hätte es sicherlich auf die umständliche Tour gemacht ;)
btw. hab ich schon erwähnt, dass du gut erklären kannst ?
Weiter so und Danke an der Stelle !


JETZT ist das Thema wirklich gelöst. hehe.


mfg.
Biber
Biber 22.03.2006 um 12:44:02 Uhr
Goto Top
THX nochmal, yashi,

JETZT ist das Thema wirklich gelöst. hehe.

Na, dann schließe ich den Beitrag jetzt aber mal ganz schnell.

Grüße zurück
Biber