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

Frage Entwicklung Batch & Shell

Mitglied: 26882

26882 (Level 1)

14.03.2006, aktualisiert 22.03.2006, 9142 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 ?


Mit freundlichen Grüßen
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.


Mit freundlichen Grüßen.
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 ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (29)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (20)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...