Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen (A bis Z)

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 Auswahl an Dateien per Batch kopieren

Frage Entwicklung Batch & Shell

Mitglied: 26882

26882 (Level 1)

14.03.2006, aktualisiert 22.03.2006, 9360 Aufrufe, 10 Kommentare

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
Mitglied: Biber
14.03.2006 um 13:49 Uhr
Moin Bodo,

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

01.
 ::------snipp LottoCopy3ofX.bat 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
::CHANGE_THIS: 
04.
Set "quell=D:\temp" & set "target=NUL" 
05.
:: Ich wende dasauf 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 
09.
For %%i in (f_1, f_2, f_3) do set /a "%%i=!random!%%%max%" 
10.
:: Die Variablen f_1, f_2, f_3 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 (%f_1%, %f_2%, %f_3%) do ( 
14.
   if %%a==!lfdnr! @ECHO %%a of %max% copy %quell%\%%~nxi %target% 
15.
)) 
16.
::------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?
Bitte warten ..
Mitglied: 26882
14.03.2006 um 13:55 Uhr
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 , 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!
Bitte warten ..
Mitglied: Biber
14.03.2006 um 14:09 Uhr
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
Bitte warten ..
Mitglied: Biber
14.03.2006 um 14:20 Uhr
Na ja,
habe noch mal Deine Anforderung durchgelesen... ist wohl nichts mit PlayList...

Dann also so:
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
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
Bitte warten ..
Mitglied: 26882
16.03.2006 um 10:00 Uhr
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...
Bitte warten ..
Mitglied: Biber
16.03.2006 um 10:54 Uhr
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..

Biber
Bitte warten ..
Mitglied: yashi
21.03.2006 um 13:05 Uhr
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
Bitte warten ..
Mitglied: Biber
21.03.2006 um 14:42 Uhr
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
Bitte warten ..
Mitglied: yashi
22.03.2006 um 12:27 Uhr
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.
Bitte warten ..
Mitglied: Biber
22.03.2006 um 12:44 Uhr
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
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
gelöst Batch Datei zum Kopieren aktueller Dateien erstellen (5)

Frage von daniel011 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Datei Kopieren (17)

Frage von Frager zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch: alle Ordner mit einem bestimmten Namen kopieren (4)

Frage von Remsboys zum Thema Batch & Shell ...

VB for Applications
gelöst VBS Datei Auswahl Dialog (5)

Frage von 133202 zum Thema VB for Applications ...

Neue Wissensbeiträge
Ubuntu

Ubuntu 17.10 steht zum Download bereit

(3)

Information von Frank zum Thema Ubuntu ...

Datenschutz

Autofahrer-Pranger - Bewertungsportal illegal

(8)

Information von BassFishFox zum Thema Datenschutz ...

Windows 10

Neues Win10 Funktionsupdate verbuggt RemoteApp

(8)

Information von thomasreischer zum Thema Windows 10 ...

Microsoft

Die neuen RSAT-Tools für Win10 1709 sind da

(2)

Information von DerWoWusste zum Thema Microsoft ...

Heiß diskutierte Inhalte
Router & Routing
Allnet - VDSL2 Modem - SFP (mini-GBIC) (20)

Frage von Dobby zum Thema Router & Routing ...

Windows 10
Windows 10 Ordnerfreigabe (18)

Frage von Xaero1982 zum Thema Windows 10 ...

Voice over IP
DeutschlandLAN IP Voice Data M Premium, Erfahrung mit Faxgeräte? (17)

Frage von liquidbase zum Thema Voice over IP ...

Monitoring
Netzwerk-Monitoring Software (17)

Frage von Ghost108 zum Thema Monitoring ...