2 votes

Tri aléatoire des listes de lecture de fichiers par lots

J'ai créé un petit programme pour créer une liste de lecture.

@echo off
DIR /S /o:n /b *.avi > Playlist.m3u

Existe-t-il un moyen de modifier cette fonction de manière à ce qu'elle soit triée dans un ordre aléatoire à chaque fois qu'elle est exécutée ?

1voto

Nate Hekman Points 6131

C'est possible, mais ce ne sera pas joli ! Pouvez-vous utiliser une meilleure plate-forme que les fichiers batch ? C'est peut-être l'occasion que vous attendiez pour apprendre Powershell :-)

Toutefois, si vous insistez sur le lot, voici l'approche générale que j'adopterais si je devais essayer :

  1. Comptez le nombre de fichiers .avi dans votre dossier.
  2. Choisissez un nombre aléatoire entre 0 et ce nombre. Par exemple, set /a randomLineNum=%random% %% 10 définira %randomLineNum% comme un nombre de 0 à 9.
  3. Utilisez quelque chose comme for /f "skip=%randomLineNum%" %%L in ('dir /s /o:n /b *.avi') ... pour saisir cette ligne aléatoire, et echo %%L > Playlist.m3u .
  4. Retournez au numéro 2.

Cette approche simpliste aboutira à des doublons, et je n'ai pas prévu de moyen de sortir de la boucle. Je vous laisse le soin de résoudre ces problèmes (ou de les poser dans une prochaine question) :-)

0voto

Magoo Points 22274
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
::
:: establish a tempfile name
::
:temploop
SET tempfile="%temp%\temp%random%.tmp"
IF EXIST %tempfile% GOTO temploop
::
:: Write the list of filenames with each
:: prefixed by a random number and a colon
::
(FOR /f "delims=" %%i IN (
  'dir /s/b *.avi'
 ) DO ECHO !random!:%%i
)>%tempfile% 
::
:: Write the playlist.
:: sort the tempfile (which places it 
:: in random order) and remove the number:
::
(FOR /f "tokens=1*delims=:" %%i IN (
  ' sort ^<%tempfile% ') DO ECHO %%j
) >playlist.m3u
::
:: and delete the tempfile.
::
DEL %tempfile% 2>NUL

Devrait fonctionner - mais il sera avoir des difficultés si vos noms de fichiers/pathnoms contiennent !

Documentation dans le code.

0voto

Endoro Points 34982

Solution sans fichier TEMP :

@echo off &setlocal
set "playlist=Playlist.m3u"
del %playlist% 2>nul
set /a files=0
for %%i in (*.avi) do set /a files+=1
if %files% equ 0 (echo No AVI found&goto:eof) else echo %files% AVI's found.
set /a cnt=%files%-1
for /l %%i in (0,1,%cnt%) do for /f "delims=" %%a in ('dir /b /a-d *.avi^|more +%%i') do if not defined $avi%%i set "$avi%%i=%%a"
:randomloop
set /a rd=%random%%%%files%
call set "avi=%%$avi%rd%%%"
if not defined avi goto :randomloop
set "$avi%rd%="
>>%playlist% echo %avi%
set /a cnt-=1
if %cnt% geq 0 goto:randomloop
echo Done!
endlocal

Il n'utilise pas DelayedExpansion, et peut donc gérer les fichiers dont le nom contient un point d'exclamation. Elle prend un peu plus de temps, mais n'a pas besoin d'un fichier temporaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X