26882
14.03.2006, aktualisiert am 22.03.2006
12609
10
0
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 28146
Url: https://administrator.de/contentid/28146
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
10 Kommentare
Neuester Kommentar
Moin Bodo,
wenn Du uns erzählst, was zu dieser Anforderung geführt hat, helfe ich gern.
Wenn der obige Schnipsel läuft, zeigt er (bei mir) folgendes an:
32 of 80 copy D:\temp\maennervorsaetze-05.ppt NUL
53 of 80 copy D:\temp\Saulwarrior_bewert.bmp NUL
(=13:42:44 E:\=)
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.
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
LottoCopy3ofX.bat
9 of 80 copy D:\temp\cc.xml NUL32 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 NUL29 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?
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
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
Na ja,
habe noch mal Deine Anforderung durchgelesen... ist wohl nichts mit PlayList...
Dann also so:
Erzeugt bei mir:
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:\=)
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
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
LottoCopy3ofX2.bat
38 of 80 copy /y D:\temp\overwork.wmv x:\wecker\datei3.dat69 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.dat37 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
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.
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:
---> 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
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=89datei2=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