IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

Création d'une liste aléatoire en parcourant un fichier *.M3U


Sujet :

VBScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Points : 24
    Points
    24
    Par défaut Création d'une liste aléatoire en parcourant un fichier *.M3U
    Bonjour à tous,

    Suite au sujet BATCH je renouvelle ma demande en VBS cette fois pour le problème suivant:

    Je voulais en parcourant un fichier d'enregistrements de ma bibliothèque musicale appelé Musique.m3u créer une liste aléatoire Alealiste.m3u du contenu de ce fichier, car à l'origine, le contenu du fichier m3u est classé en suivant l'arborescence du dossier Ma Musique. Ma Musique\Artiste\Album\Musique.mp3 ou autres formats.

    Donc j'ai un batch qui génère le fichier Musique.m3u.
    Ici, il faudrait quelque chose de ce genre mais en VBS et non en batch, mais je ne connais rien au VBS . Ce batch est très bien fait, mais pose un problème de lenteur dans le cas d'un fichier Musique.m3u volumineux (Supérieur à 4000 lignes).


    Le code BATCH ci-dessous est de Monsieur Sachadee, que je salut au passage, c'est un code très bien fait affichant deux compteurs pour afficher l'avancement du traitement aléatoire pour l'enrichissement de out.txt que je transforme ensuite en Alealiste.m3u.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    @echo off
    setlocal enabledelayedexpansion
    SET "nblines="
    set "$cc=1"
     
    del out.txt 2>nul
     
    FOR /F "delims=" %%I IN (Musique.m3u) DO SET /a nblines+=1
     
     
    for /l %%a in (1=1=%nblines%) do (
    	set /a $random=!random! %%%nblines% +1
    	call:TestRandom %%a)
     
    move out.txt Musique.m3u 2>nul
    exit/b
     
    :TestRandom
    if defined ##!$random! (
       set /a $random=!random! %%%nblines% +1
       goto:TestRandom
    ) else (cls&echo Traitement de [!$cc!/%nblines%]
    		set ##!$random!=1
    		set $c=1
            for /f "delims=" %%b in (Musique.m3u) do (
                if !$random!==!$c! echo %%b>>out.txt
    		    set /a $c+=1
            )
    		set /a $cc+=1
    		)
    Si un génie du code VBS pouvait m'aider, ce serait super.
    Merci par avance de l'aide apporté.

  2. #2
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 067
    Points : 17 155
    Points
    17 155
    Par défaut
    Salut

    Depuis ce post qui permet de créer une série de chiffre aléatoire dans une plage donnée, sans doublon, tu pourrais créer un tableau pour indexer cette suite aléatoire.
    Une fois ta liste lut dans le répertoire, le premier fichier, tu lui donnes pour index TableauFinal(i - MinI), ainsi de suite jusqu’à i = Nbr de fichier du répertoire.
    En modifiant la dernière boucle débutant ligne 45 For i ..... Next i
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Membre à l'essai
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Points : 24
    Points
    24
    Par défaut
    Bonsoir ProgElecT ,

    Merci pour cette info !

    Par contre, je suis un boulet en VBS. Donc il faut m'expliquer quelques bricoles dont je ne saisis pas la subtilité:

    1) A quelle endroit je renseigne le fichier source à analyser? Dans mon cas, Musique.m3u.

    2) Quelle est le fichier de sortie?

    3) Une bibliothèque musicale pouvant varier d'un pc à l'autre, comment définir la valeur MAX propre à chacun?

    4) Tu me suggère de remplacer la ligne 45
    For i = MinI To MaxI
    par
    For i ..... Next i
    c'est bien ça?

    Merci des éclaircissements que tu pourras m'apporter.

  4. #4
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 067
    Points : 17 155
    Points
    17 155
    Par défaut
    Salut

    Je suis partie d'un fichier nommé FichierSourceM3u.Txt
    Musique1
    Musique2
    Musique3
    Musique4
    Musique5
    Musique6
    Musique7
    Musique8
    Musique9
    Musique10
    vers un résultat dans un fichier d'une ligne nommé Alealiste.txt
    Musique3,Musique9,Musique4,Musique10,Musique2,Musique8,Musique6,Musique5,Musique7,Musique1
    Il te faut bien sûr adapter ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    Dim Msg 'pour vérification
    Dim FichieMusiqueM3u 'Fichier source non aléatoire
    Dim TblFichieMusiqueM3u 'tableau du fichier source non aléatoire
    Dim TableauFinal()'tableau d'index aléatoires
     
    '---------------------------------------Procédures--------------------------------------------
    Sub RecupeFichier(CheminFichierM3u)
    Const ForReading = 1
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject" )
    Set f = fso.OpenTextFile(CheminFichierM3u, ForReading)
    FichieMusiqueM3u = f.readAll
    f.Close
    End Sub
    '--------------------------------------------------------------------------------------------
    Sub SauveFichier(CheminFichierM3u)
    Const ForWriting = 2
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject" )
    Set f = fso.OpenTextFile(CheminFichierM3u, ForWriting, True)
    'ecriture en agglomérant les noms de musique aléatoires, séparé par une virgule
    f.Write Join(Alealiste,",")
    f.Close
    End Sub
    '--------------------------------------------------------------------------------------------
    Sub TirageAleatoire(MinI,MaxI)
    Dim i, Ch, Nb, NbAleatoire
    'i pour boucle For ..... Next
    'Ch pour créer une chaine de chiffre aléatoire
    'Nb = Variant pour splitter la chaine contenant les nombres à choisir
    'NbAleatoire = Indice aléatoire pour choisir un élément de la chaine contenant les nombres
     
    ReDim TableauFinal(MaxI - MinI)
    'On va générer une chaine partant du premier au dernier chiffre (donc de MinI à MaxI),
    'les chiffres étant séparés par une virgule
    'Par défaut on aura donc Ch = "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" Etc...
    Ch = MinI
    For i = MinI + 1 To MaxI: Ch = Ch & "," & i: Next
    'On met les chiffres dans un tableau issu du split de la chaine contenant tous les nombres
    Nb = Split(Ch, ",")
    'On tire un nombre x parmi les n éléments
    'Si ce nombre n'est pas le dernier de la liste, le nombre d'indice x devient le nombre d'indice n
    'Par exemple au premier tirage on tire le 7ème nombre parmi les 20, donc 7 pour mon exemple
    'Dans le tableau Nb, on remplace 7 par 24
    'Puis on tire un nombre x parmi les n - 1 éléments (donc parmi les 24 de mon tableau Nb),
    'ça ne peut pas être 7 puisqu'il a été remplacé par le 24ème
    'Si ce nombre n'est pas le n - 1  de la liste, le nombre d'indice x devient le nombre d'indice n - 1
    'Etc...
    Randomize 'Initialise le générateur de nombres aléatoires
    For i = MaxI - MinI To 0 Step -1
      NbAleatoire = Int((i + 1) * Rnd)
      TableauFinal(MaxI - MinI - i) = Nb(NbAleatoire)
      If NbAleatoire < i Then Nb(NbAleatoire) = Nb(i)
    Next
    End Sub
    '--------------------------------------------------------------------------------------------
     
    ' *************************** partie principale *********************************************
    Dim Alealiste(), T
    RecupeFichier "C:\PersoFrancis\En VBScript et HTA\Tirage aleatoire\FichierSourceM3u.txt"
     
    'tableau issu du split du fichier contenant les nom de musiques non triées
    TblFichieMusiqueM3u = Split(FichieMusiqueM3u, vbCrLf) 'séparateur = nouvelle ligne
     
    'création d'un tableau d'indice numérique aléatoire
    TirageAleatoire 0,UBound(TblFichieMusiqueM3u)
     
     
    'tableau pour les noms de musiques aléatoires
    Redim Alealiste (UBound(TblFichieMusiqueM3u))
    'affectation d'un index aléatoire à la liste des musiques
    For T = 0 To UBound(TblFichieMusiqueM3u)
    	Alealiste(TableauFinal(T)) = TblFichieMusiqueM3u(T)
    Next
    'pour vérification
    'For T = 0 To UBound(Alealiste)
    '  Msg = Msg & Alealiste(T)
    '	if T < UBound(Alealiste) Then Msg = Msg & " , "
    'Next
    'msgbox msg
     
    SauveFichier "C:\PersoFrancis\En VBScript et HTA\Tirage aleatoire\Alealiste.txt"
    Si le fichier source FichierSourceM3u est en fait le contenu d'un dossier, il serai possible de lire la liste du dossier sans passer par un fichier, pour un gain de temps d’exécution.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Membre à l'essai
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Points : 24
    Points
    24
    Par défaut
    Bonjour ProgElecT,

    J'ai testé ton script, c'est beaucoup plus rapide qu'un traitement par BATCH, il n'y a pas photo.

    Peut-on modifier la sortie du fichier Alealiste.txt?
    A la place d'avoir:
    Musique3,Musique9,Musique4,Musique10,Musique2,Musique8,Musique6,Musique5,Musique7,Musique1
    Obtenir:
    Musique3
    Musique9
    Musique4
    Musique10
    etc ...
    Deuxième point, peut-on commencer la première ligne du fichier Alealiste.txt par:
    #EXTM3U
    En tout cas, bravo pour ce script. Merci beaucoup.

  6. #6
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 067
    Points : 17 155
    Points
    17 155
    Par défaut
    Ok

    Dans le code proposé ligne 22 procedure Sub SauveFichier(CheminFichierM3u)remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f.WriteLine "#EXTM3U"
    f.Write Join(Alealiste,"VBCrlf")
    Le presque même code en lisant les fichiers d'un dossier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    Dim Msg 'pour verification
    Dim FichieMusiqueM3u 'Fichier source non aléatoire
    Dim TblFichieMusiqueM3u() 'tableau du fichier source non aléatoire
    'Dim TblFichieMusiqueM3u 'tableau du fichier source non aléatoire
    Dim TableauFinal()'tableau d'index aléatoires
     
    '---------------------------------------Procedures--------------------------------------------
    Sub RecupeFileList(folderspec)
       Dim fso, f, f1, fc, T
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(folderspec)
       Set fc = f.Files
       For Each f1 in fc
    	  If Right(f1.name,3) = "mp3" Or Right(f1.name,3) = "mp2" Then
    		T = T+1
    		Redim Preserve TblFichieMusiqueM3u(T)
    		TblFichieMusiqueM3u(T-1) = f1.name
    	  End If
       Next
    End Sub
    '--------------------------------------------------------------------------------------------
    Sub SauveFichier(CheminFichierM3u)
    Const ForWriting = 2
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject" )
    Set f = fso.OpenTextFile(CheminFichierM3u, ForWriting, True)
    'ecriture en agglomerant les noms de musique aléatoires, separé par une virgule
    f.WriteLine "#EXTM3U"
    f.Write Join(Alealiste, vbcrlf)
    f.Close
    End Sub
    '--------------------------------------------------------------------------------------------
    Sub TirageAleatoire(MinI,MaxI)
    Dim i, Ch, Nb, NbAleatoire
    'i pour boucle For ..... Next
    'Ch pour créer une chaine de chiffre aleatoire
    'Nb = Variant pour splitter la chaine contenant les nombres à choisir
    'NbAleatoire = Indice aléatoire pour choisir un élément de la chaine contenant les nombres
     
    ReDim TableauFinal(MaxI - MinI)
    'On va générer une chaine partant du premier au dernier chiffre (donc de MinI à MaxI),
    'les chiffres étant séparés par une virgule
    'Par défaut on aura donc Ch = "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" Etc...
    Ch = MinI
    For i = MinI + 1 To MaxI: Ch = Ch & "," & i: Next
    'On met les chiffres dans un tableau issu du split de la chaine contenant tous les nombres
    Nb = Split(Ch, ",")
    'On tire un nombre x parmi les n éléments
    'Si ce nombre n'est pas le dernier de la liste, le nombre d'indice x devient le nombre d'indice n
    'Par exemple au premier tirage on tire le 7ème nombre parmi les 20, donc 7 pour mon exemple
    'Dans le tableau Nb, on remplace 7 par 24
    'Puis on tire un nombre x parmi les n - 1 éléments (donc parmi les 24 de mon tableau Nb),
    'ça ne peut pas être 7 puisqu'il a été remplacé par le 24ème
    'Si ce nombre n'est pas le n - 1  de la liste, le nombre d'indice x devient le nombre d'indice n - 1
    'Etc...
    Randomize 'Initialise le générateur de nombres aléatoires
    For i = MaxI - MinI To 0 Step -1
      NbAleatoire = Int((i + 1) * Rnd)
      TableauFinal(MaxI - MinI - i) = Nb(NbAleatoire)
      If NbAleatoire < i Then Nb(NbAleatoire) = Nb(i)
    Next
    End Sub
    '--------------------------------------------------------------------------------------------
     
    ' *************************** partie principale *********************************************
    Dim Alealiste(), T
     
    'Liste des fichier du dossier
    RecupeFileList "C:\PersoFrancis\Sources divers\Music MP3 et MP2"
     
    'création d'un tableau d'indice numerique aléatoire
    TirageAleatoire 0,UBound(TblFichieMusiqueM3u)
     
    'tableau pour les noms de musiques aléatoires
    Redim Alealiste (UBound(TblFichieMusiqueM3u))
    'affectation d'un index aléatoire à la liste des musiques
    For T = 0 To UBound(TblFichieMusiqueM3u)
    	Alealiste(TableauFinal(T)) = TblFichieMusiqueM3u(T)
    Next
    'pour verification
    'For T = 0 To UBound(Alealiste)
    '  Msg = Msg & Alealiste(T)
    '	if T < UBound(Alealiste) Then Msg = Msg & " , "
    'Next
    'msgbox msg
     
    SauveFichier "C:\PersoFrancis\En VBScript et HTA\Tirage aleatoire\Alealiste.txt"
    . Attention à la différence de déclaration de la variable TblFichieMusiqueM3u
    Bien penser à adapter les différents chemin de dossier ou fichiers.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  7. #7
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Voici une autre solution ultra rapide en utilisant Autoit qui est vraiment fantastique pour
    ce genre de chose, grâce à toutes les fonctions prédefinie pour le traitement sur array.

    On utilise ici _ArrayShuffle qui applique un random sur tout un array :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <Array.au3>
     
    $hInFile = FileOpen("musique.m3u")
    $hOutFile = FileOpen("Alealiste.m3u",2)
    Local $aPistes = FileReadToArray($hInFile)
    _ArrayShuffle($aPistes)
    Local $sNewPistes = StringReplace(_ArrayToString($aPistes,"|"),"|",@CRLF)
    FileWrite($hOutFile,"#EXTM3U" & @CRLF & $sNewpistes)
    FileClose($hInFile)
    FileClose($hOutFile)
    Voici l'exe compilé :

    random.rar


    Il te suffit de le mettre ou il y a ton musique.m3u en sortie tu auras
    Alealiste.m3u

    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  8. #8
    Membre à l'essai
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Points : 24
    Points
    24
    Par défaut
    Merci ProgElecT,

    Le lancement du script "Le presque même code en lisant les fichiers d'un dossier" j'ai une erreur:

    Ligne: 29
    Caract: 1
    Erreur: Argument ou appel de procédure incorrect
    Code : 800A0005
    Source: Erreur d'éxécution Microsoft VBScript

    Bonjour Sachadee,
    Merci pour l'exe et le script.
    Le seul soucis c'est que je cherche un code pour les pc de monsieur tout le monde. Donc tout le monde n'a pas Autoit malheureusement. Sinon, c'était bien vue.

  9. #9
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 067
    Points : 17 155
    Points
    17 155
    Par défaut
    Re

    J'ai épuré et fait plusieurs essais après avoir corrigé le dimensionnement du tableau, code pour lecture des fichiers contenu dans un dossier
    Code VBS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Option Explicit
     
    Dim TblFichieMusiqueM3u() 'tableau du fichier source non aléatoire
    Dim TableauFinal() 'tableau d'index aléatoires
    Dim T, Fso, F
    '---------------------------------------Procedures--------------------------------------------
    Sub RecupeFileList(folderspec)
       Dim F1, Fc
       Set F = Fso.GetFolder(folderspec)
       Set Fc = F.Files: T = 0
       For Each F1 In Fc
            If Right(F1.Name, 3) = "mp3" Or Right(F1.Name, 3) = "mp2" Then
                T = T + 1: ReDim Preserve TblFichieMusiqueM3u(T): TblFichieMusiqueM3u(T - 1) = F1.Name
            End If
       Next
    End Sub '--------------------------------------------------------------------------------------------
    Sub SauveFichier(CheminFichierM3u)
        Set F = Fso.OpenTextFile(CheminFichierM3u, 2, True)
        F.WriteLine "#EXTM3U"
        F.Write Join(Alealiste, vbCrLf)
        F.Close
    End Sub '--------------------------------------------------------------------------------------------
    Sub TirageAleatoire(MinI, MaxI)
    Dim Ch, Nb, NbAleatoire
    ReDim TableauFinal(MaxI - MinI)
    Ch = MinI
    For T = MinI + 1 To MaxI: Ch = Ch & "," & T: Next
    Nb = Split(Ch, ",")
    Randomize
    For T = MaxI - MinI To 0 Step -1
      NbAleatoire = Int((T + 1) * Rnd)
      TableauFinal(MaxI - MinI - T) = Nb(NbAleatoire)
      If NbAleatoire < T Then Nb(NbAleatoire) = Nb(T)
    Next
    End Sub '--------------------------------------------------------------------------------------------
    ' *************************** partie principale *********************************************
    Dim Alealiste()
    Set Fso = CreateObject("Scripting.FileSystemObject")
    RecupeFileList "C:\PersoFrancis\Sources divers\Music MP3 et MP2"
    TirageAleatoire 0, UBound(TblFichieMusiqueM3u) - 1
    ReDim Alealiste(UBound(TblFichieMusiqueM3u) - 1)
    For T = 0 To UBound(TblFichieMusiqueM3u) - 1
        Alealiste(TableauFinal(T)) = TblFichieMusiqueM3u(T)
    Next
    SauveFichier "C:\PersoFrancis\En VBScript et HTA\Tirage aleatoire\Alealiste.txt"
    Set Fso = Nothing
    Par contre 35 lignes de plus que sachadee, à toi de comparer la rapidité des 2 codes.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  10. #10
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Citation Envoyé par ProgElecT Voir le message
    Par contre 35 lignes de plus que sachadee, à toi de comparer la rapidité des 2 codes.


    Si tu prend les sous_codes pour le traitement des arrays je pense que le mien sera beaucoup plus gros, par contre au niveau rapidité....(à tester)


    Beau script !

    J'avais commencer le mien en VBS avec une méthode un peu différente, mais vu que le tiens est d´jà fonctionnel je ne publierai pas.

    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  11. #11
    Membre à l'essai
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Points : 24
    Points
    24
    Par défaut
    Bonjour Sachadee,
    Bonjour ProgElecT,

    La dernière version épurée me renvoie une erreur :
    Ligne: 20
    Caract: 2
    Par contre, celui-ci fonctionne à merveille, et malgré une liste de plus de 4500 entrées, le traitement dure à peine quelques secondes pour un résultat nickel chrome:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    Dim Msg 'pour vérification
    Dim FichieMusiqueM3u 'Fichier source non aléatoire
    Dim TblFichieMusiqueM3u 'tableau du fichier source non aléatoire
    Dim TableauFinal()'tableau d'index aléatoires
     
    '---------------------------------------Procédures--------------------------------------------
    Sub RecupeFichier(CheminFichierM3u)
    Const ForReading = 1
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject" )
    Set f = fso.OpenTextFile(CheminFichierM3u, ForReading)
    FichieMusiqueM3u = f.readAll
    f.Close
    End Sub
    '--------------------------------------------------------------------------------------------
    Sub SauveFichier(CheminFichierM3u)
    Const ForWriting = 2
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject" )
    Set f = fso.OpenTextFile(CheminFichierM3u, ForWriting, True)
    'ecriture en agglomérant les noms de musique aléatoires, séparé par une virgule
    f.WriteLine "#EXTM3U"
    f.Write Join(Alealiste,VBCrlf)
    f.Close
    End Sub
    '--------------------------------------------------------------------------------------------
    Sub TirageAleatoire(MinI,MaxI)
    Dim i, Ch, Nb, NbAleatoire
    'i pour boucle For ..... Next
    'Ch pour créer une chaine de chiffre aléatoire
    'Nb = Variant pour splitter la chaine contenant les nombres à choisir
    'NbAleatoire = Indice aléatoire pour choisir un élément de la chaine contenant les nombres
     
    ReDim TableauFinal(MaxI - MinI)
    'On va générer une chaine partant du premier au dernier chiffre (donc de MinI à MaxI),
    'les chiffres étant séparés par une virgule
    'Par défaut on aura donc Ch = "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24" Etc...
    Ch = MinI
    For i = MinI + 1 To MaxI: Ch = Ch & "," & i: Next
    'On met les chiffres dans un tableau issu du split de la chaine contenant tous les nombres
    Nb = Split(Ch, ",")
    'On tire un nombre x parmi les n éléments
    'Si ce nombre n'est pas le dernier de la liste, le nombre d'indice x devient le nombre d'indice n
    'Par exemple au premier tirage on tire le 7ème nombre parmi les 20, donc 7 pour mon exemple
    'Dans le tableau Nb, on remplace 7 par 24
    'Puis on tire un nombre x parmi les n - 1 éléments (donc parmi les 24 de mon tableau Nb),
    'ça ne peut pas être 7 puisqu'il a été remplacé par le 24ème
    'Si ce nombre n'est pas le n - 1  de la liste, le nombre d'indice x devient le nombre d'indice n - 1
    'Etc...
    Randomize 'Initialise le générateur de nombres aléatoires
    For i = MaxI - MinI To 0 Step -1
      NbAleatoire = Int((i + 1) * Rnd)
      TableauFinal(MaxI - MinI - i) = Nb(NbAleatoire)
      If NbAleatoire < i Then Nb(NbAleatoire) = Nb(i)
    Next
    End Sub
    '--------------------------------------------------------------------------------------------
     
    ' *************************** partie principale *********************************************
    Dim Alealiste(), T
    RecupeFichier "outputfile.txt"
     
    'tableau issu du split du fichier contenant les nom de musiques non triées
    TblFichieMusiqueM3u = Split(FichieMusiqueM3u, vbCrLf) 'séparateur = nouvelle ligne
     
    'création d'un tableau d'indice numérique aléatoire
    TirageAleatoire 0,UBound(TblFichieMusiqueM3u)
     
     
    'tableau pour les noms de musiques aléatoires
    Redim Alealiste (UBound(TblFichieMusiqueM3u))
    'affectation d'un index aléatoire à la liste des musiques
    For T = 0 To UBound(TblFichieMusiqueM3u)
    	Alealiste(TableauFinal(T)) = TblFichieMusiqueM3u(T)
    Next
    'pour vérification
    'For T = 0 To UBound(Alealiste)
    '  Msg = Msg & Alealiste(T)
    '	if T < UBound(Alealiste) Then Msg = Msg & " , "
    'Next
    'msgbox msg
     
    SauveFichier "AleaListe.m3u"
    Je conserve donc celui-ci pour l'appeler via un call dans mon batch.

    Merci à tous les deux, Sachadee et ProgElecT pour les réponses apportées à mon problème. On reconnait les performances des professionnels !
    Monsieur Sachadee, tu as eu bien raison de m'orienter sur du VBS pour ce traitement, bien joué encore une fois.

    Je clos le sujet, ayant trouvé mon bonheur parmi les réponses apportées, avec le script ci-dessus.

  12. #12
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 067
    Points : 17 155
    Points
    17 155
    Par défaut
    Salut

    Déjà, une erreur de ma part, la déclaration Dim Alealiste() 'tableau final trié, il faut la déplacer en début du code car elle est utilisée dans la partie principale mais aussi dans la Sub SauveFichier(CheminFichierM3u)curieusement,, cela ne provoquait pas d'erreur chez moi.
    Citation Envoyé par LinTianFu
    La dernière version épurée me renvoie une erreur :
    Ligne: 20
    Caract: 2
    Soit le chemin et nom de fichier ne sont pas bon, soit tu n'aurais pas les droits de créer de fichier dans le dossier.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  13. #13
    Membre à l'essai
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Points : 24
    Points
    24
    Par défaut
    Bonjour ProgElecT,

    Donc j'ai repris ton code en apportant les modifications indiquées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Option Explicit
    Dim TblFichieMusiqueM3u() 'tableau du fichier source non aléatoire
    Dim TableauFinal() 'tableau d'index aléatoires
    Dim Alealiste() 'tableau final trié'
    Dim T, Fso, F
    '---------------------------------------Procedures--------------------------------------------
    Sub RecupeFileList(folderspec)
       Dim F1, Fc
       Set F = Fso.GetFolder(folderspec)
       Set Fc = F.Files: T = 0
       For Each F1 In Fc
            If Right(F1.Name, 3) = "mp3" Or Right(F1.Name, 3) = "mp2" Or Right(F1.Name, 3) = "wma" Or Right(F1.Name, 3) = "wav" Or Right(F1.Name, 3) = "flac" Or Right(F1.Name, 3) = "ogg" Or Right(F1.Name, 3) = "mp4" Or Right(F1.Name, 3) = "flv" Or Right(F1.Name, 3) = "mkv" Or Right(F1.Name, 3) = "wmv" Or Right(F1.Name, 3) = "avi" Then
                T = T + 1: ReDim Preserve TblFichieMusiqueM3u(T): TblFichieMusiqueM3u(T - 1) = F1.Name
            End If
       Next
    End Sub '--------------------------------------------------------------------------------------------
    Sub SauveFichier(CheminFichierM3u)
        Set F = Fso.OpenTextFile(CheminFichierM3u, 2, True)
        F.WriteLine "#EXTM3U"
        F.Write Join(Alealiste, VBCrLf)
        F.Close
    End Sub '--------------------------------------------------------------------------------------------
    Sub TirageAleatoire(MinI, MaxI)
    Dim Ch, Nb, NbAleatoire
    ReDim TableauFinal(MaxI - MinI)
    Ch = MinI
    For T = MinI + 1 To MaxI: Ch = Ch & "," & T: Next
    Nb = Split(Ch, ",")
    Randomize
    For T = MaxI - MinI To 0 Step -1
      NbAleatoire = Int((T + 1) * Rnd)
      TableauFinal(MaxI - MinI - T) = Nb(NbAleatoire)
      If NbAleatoire < T Then Nb(NbAleatoire) = Nb(T)
    Next
    End Sub '--------------------------------------------------------------------------------------------
    ' *************************** partie principale *********************************************
     
    Set Fso = CreateObject("Scripting.FileSystemObject")
    RecupeFileList "D:\Musique"
    TirageAleatoire 0, UBound(TblFichieMusiqueM3u) - 1
    ReDim Alealiste(UBound(TblFichieMusiqueM3u) - 1)
    For T = 0 To UBound(TblFichieMusiqueM3u) - 1
        Alealiste(TableauFinal(T)) = TblFichieMusiqueM3u(T)
    Next
    SauveFichier "Alealiste.m3u"
    Set Fso = Nothing
    Je ne pense pas m'être trompé.
    J'ai les accès privilèges sur l'ensemble de ma machine. Le chemin
    D:\Musique
    est bon, c'est ma bibliothèque musicale.
    Mais j'ai tout de même ce message qui s'affiche lors de l’exécution du script:

    Nom : VBS_ERROR.png
Affichages : 738
Taille : 24,7 Ko

    Cela correspond au caractère F précédant .Write Join(Alealiste, VBCrLf)

    Une idée?

  14. #14
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 067
    Points : 17 155
    Points
    17 155
    Par défaut

    Les informations de ligne et colonne du gestionnaire d'erreur de VBScript n'est pas des plus fiable.
    Je ne vois pas ou cela coince, mis a part peut être le fait que tu ne donnes pas le chemin complet pour la Sub SauveFichier(CheminFichierM3u)Chez moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SauveFichier "C:\PersoFrancis\En VBScript et HTA\Tirage aleatoire\Alealiste.txt"
    alors que toi tu ne donnes que le nom du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SauveFichier "Alealiste.m3u"
    Les seules différences entre chez toi et chez moi sont les chemins données aux 2 Subs RecupeFileList et SauveFichier

    Une petite amélioration pour la lecture du code ligne 12, la condition If ... Then, tu peux faire comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
         If Right(F1.Name, 3) = "mp3" Or _
            Right(F1.Name, 3) = "mp2" Or _
            Right(F1.Name, 3) = "wma" Or _
            Right(F1.Name, 3) = "wav" Or _
            Right(F1.Name, 3) = "ogg" Or _
            Right(F1.Name, 3) = "mp4" Or _
            Right(F1.Name, 3) = "flv" Or _
            Right(F1.Name, 3) = "mkv" Or _
            Right(F1.Name, 3) = "wmv" Or _
            Right(F1.Name, 3) = "avi" Or _
            Right(F1.Name, 4) = "flac" Then
                T = T + 1: ReDim Preserve TblFichieMusiqueM3u(T): TblFichieMusiqueM3u(T - 1) = F1.Name
          End If
    Cela permet de voir que pour la condition "flac", il faut prendre les 4 derniers caractères de F1.Name.
    En provisoire, dans la sub SauveFichier, ajoute une ligne message après la ligne F.WriteLine "#EXTM3U", MsgBox UBound(Alealiste), vbInformation, "Infos", il doit te renvoyer le nombre de nom de fichier, moins 1.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  15. #15
    Membre à l'essai
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Points : 24
    Points
    24
    Par défaut
    Bonsoir ProgElecT,

    Premier point:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SauveFichier "Alealiste.m3u"
    créé bien le fichier Alealiste.m3u dans le répertoire de travail d'où est lancé le VBS. Par contre il ne contient que la ligne
    #EXTM3U
    Deuxième point:
    J'ai suivit tes conseils et modifié le script en suivant tes indications.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Option Explicit
    Dim TblFichieMusiqueM3u() 'tableau du fichier source non aléatoire
    Dim TableauFinal() 'tableau d'index aléatoires
    Dim Alealiste() 'tableau final trié'
    Dim T, Fso, F
    '---------------------------------------Procedures--------------------------------------------
    Sub RecupeFileList(folderspec)
       Dim F1, Fc
       Set F = Fso.GetFolder(folderspec)
       Set Fc = F.Files: T = 0
       For Each F1 In Fc
                 If Right(F1.Name, 3) = "mp3" Or _
            Right(F1.Name, 3) = "mp2" Or _
            Right(F1.Name, 3) = "wma" Or _
            Right(F1.Name, 3) = "wav" Or _
            Right(F1.Name, 3) = "ogg" Or _
            Right(F1.Name, 3) = "mp4" Or _
            Right(F1.Name, 3) = "flv" Or _
            Right(F1.Name, 3) = "mkv" Or _
            Right(F1.Name, 3) = "wmv" Or _
            Right(F1.Name, 3) = "avi" Or _
            Right(F1.Name, 4) = "flac" Then
                T = T + 1: ReDim Preserve TblFichieMusiqueM3u(T): TblFichieMusiqueM3u(T - 1) = F1.Name
          End If
       Next
    End Sub '--------------------------------------------------------------------------------------------
    Sub SauveFichier(CheminFichierM3u)
        Set F = Fso.OpenTextFile(CheminFichierM3u, 2, True)
        F.WriteLine "#EXTM3U"
    	MsgBox UBound(Alealiste), vbInformation, "Infos"
        F.Write Join(Alealiste, VBCrLf)
        F.Close
    End Sub '--------------------------------------------------------------------------------------------
    Sub TirageAleatoire(MinI, MaxI)
    Dim Ch, Nb, NbAleatoire
    ReDim TableauFinal(MaxI - MinI)
    Ch = MinI
    For T = MinI + 1 To MaxI: Ch = Ch & "," & T: Next
    Nb = Split(Ch, ",")
    Randomize
    For T = MaxI - MinI To 0 Step -1
      NbAleatoire = Int((T + 1) * Rnd)
      TableauFinal(MaxI - MinI - T) = Nb(NbAleatoire)
      If NbAleatoire < T Then Nb(NbAleatoire) = Nb(T)
    Next
    End Sub '--------------------------------------------------------------------------------------------
    ' *************************** partie principale *********************************************
     
    Set Fso = CreateObject("Scripting.FileSystemObject")
    RecupeFileList "D:\Musique"
    TirageAleatoire 0, UBound(TblFichieMusiqueM3u) - 1
    ReDim Alealiste(UBound(TblFichieMusiqueM3u) - 1)
    For T = 0 To UBound(TblFichieMusiqueM3u) - 1
        Alealiste(TableauFinal(T)) = TblFichieMusiqueM3u(T)
    Next
    SauveFichier "F:\Users\LinTianFu\Desktop\MES_PROGS\PROJETS\VBS_ALEATOIRE\Alealiste.m3u"
    Set Fso = Nothing
    Au lancement du VBS, j'ai cette messagebox:
    Nom : 19.png
Affichages : 688
Taille : 14,4 Ko
    19 correspond en effet aux 20 fichiers de mon répertoire D:\Musique. Mais les 146 sous-dossiers ne sont pas pris en compte.... En effet Le dossier D:\Musique contient environ 4500 musiques dans les sous dossiers.

    Puis lorsque je clique sur OK, un nouveau message d'erreur. La ligne 20 qui est devenue la 31 (suite aux modifications demandées).
    Nom : VBS_ERROR.png
Affichages : 657
Taille : 8,4 Ko

    Merci beaucoup du temps que tu prends pour m'aider.

  16. #16
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 067
    Points : 17 155
    Points
    17 155
    Par défaut
    Mais les 146 sous-dossiers ne sont pas pris en compte.... En effet Le dossier D:\Musique contient environ 4500 musiques dans les sous dossiers.
    Normal, on y reviendra, (itération des sous dossiers), après avoir solutionné le problème de sauvegarde.

    Une question bête, avec tableau remplis depuis le fichier (ton post N°5) et une virgule pour séparateur F.Write Join(Alealiste,",") cela fonctionnait ?

    Je pense que oui, donc ce qui change est essentiellement le changement de virgule à saut de ligne (VBCrlf).
    Comme le code fonctionne chez moi, toujours avec le dernier code, essais de remplacer VBCrlf par vbNewLine.
    Citation Envoyé par MSDN
    constante vbNewLine = Caractère de nouvelle ligne spécifique à la plate-forme, adapté à celle-ci, équivalant à (Chr(13) et Chr(10) ou Chr(10))
    constante vbCrLf = Combinaison de retour chariot et de saut de ligne, équivalant à Chr(13) et Chr(10)
    Si le problème reste entier, essais de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub SauveFichier(CheminFichierM3u)
        Dim Regrouper
        Regrouper = Join(Alealiste, vbNewLine)
        Set F = Fso.OpenTextFile(CheminFichierM3u, 2, True)
        F.WriteLine "#EXTM3U"
        F.Write Regrouper 
        'F.Write Join(Alealiste, vbNewLine) 
        F.Close
    End Sub '--------------------------------------------------------------------------------------------
    Si cela plante sur Regrouper = Join(Alealiste, vbNewLine) on aura déterminé que l'erreur est le regroupement.
    Si cela plante sur F.Write Regrouper on aura déterminé que l'erreur est l'écriture dans le fichier.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  17. #17
    Membre à l'essai
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Points : 24
    Points
    24
    Par défaut
    Bonjour ProgElecT,

    Cas N°1: Remplacer VBCrLf par VBNewline
    affichage de la MessageBox, puis Erreur à la ligne 31 caractère 5.

    Cas N°2: Remplacement avec la Dim Regrouper:
    Erreur à la ligne 32 caractère 5.

    Tu en penses quoi?

  18. #18
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 067
    Points : 17 155
    Points
    17 155
    Par défaut
    Salut
    Citation Envoyé par LinTianFu Voir le message
    Bonjour ProgElecT,
    ................
    Tu en penses quoi?
    Malheureusement plus rien.
    J'insistai la récupération des noms de fichiers dans le dossier (et sous dossier(s) par la suite), car surement plus rapide que de créer un fichier qui les contient.
    Travailler en mémoire est plus rapide.
    Mais là , je ne saurai plus t'aider
    En espérant qu'une personne plus expert voudra bien NOUS éclairer.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  19. #19
    Membre à l'essai
    Homme Profil pro
    Testeur en application
    Inscrit en
    Octobre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Testeur en application
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2015
    Messages : 54
    Points : 24
    Points
    24
    Par défaut
    Ce n'est pas grave, la création de la liste via un batch est assez rapide (moins d'une minute), par contre c'était le traitement aléatoire qui prenait beaucoup de temps.
    La traitement VBS de la lsite générée par le BATCH est très rapide, seulement une ou deux secondes pour 4557 entrées dans la liste, et cela me convient parfaitement.
    C'est vrai qu'idéalement, tout traité en VBS au vue de la rapidité aurait été une solution.

    Merci beaucoup pour ton aide et le temps que tu as consacré à ce problème.

  20. #20
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Hello,

    Bon je vous poste ma version !

    J'ai donc repris l'idée du shuffle de l'array plutôt que de travailler sur les valeurs random sortie
    et également la récuperation des fichiers directement depuis le folder et les subfolder.

    J'ai tester le code de @ProgElecT qui fonctionne parfaitement chez moi (sauf la parti SubFolder qui n'a pas été implementée).

    Code vbs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    dim Myarr
    Myarr=array()
     
     
    objStartFolder = "D:\Musique"
    outFile="AleaListe.m3u"
     
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(objStartFolder)
    Set objoutFile = objFSO.CreateTextFile(outFile,True)
     
    '----Traitement du Folder principal
     
    Wscript.Echo objFolder.Path
    Set colFiles = objFolder.Files
    For Each objFile in colFiles
    	tri_extension(objFile)
    Next
     
    '----Traitement des sous folder
     
    ShowSubfolders objFSO.GetFolder(objStartFolder)
     
    Sub ShowSubFolders(Folder)
        For Each Subfolder in Folder.SubFolders
            Wscript.Echo Subfolder.Path
            Set objFolder = objFSO.GetFolder(Subfolder.Path)
            Set colFiles = objFolder.Files
            For Each objFile in colFiles
                tri_extension(objFile)
            Next
            Wscript.Echo
            ShowSubFolders Subfolder
        Next
     
    End Sub
     
    '--------- Création de l'array selon l'extension
     
    Function tri_extension(objFile)
       If Right(objFile.Name, 3) = "mp3" Or _
            Right(objFile.Name, 3) = "mp2" Or _
            Right(objFile.Name, 3) = "wma" Or _
            Right(objFile.Name, 3) = "wav" Or _
            Right(objFile.Name, 3) = "ogg" Or _
            Right(objFile.Name, 3) = "mp4" Or _
            Right(objFile.Name, 3) = "flv" Or _
            Right(objFile.Name, 3) = "mkv" Or _
            Right(objFile.Name, 3) = "wmv" Or _
            Right(objFile.Name, 3) = "avi" Or _
            Right(objFile.Name, 4) = "flac" Then
    			ReDim Preserve MyArr(UBound(MyArr) + 1) '-- on augmente la taille de l'array
    			MyArr(UBound(MyArr)) = objFile.Name '-- On ajoute l'élement
    		End if
    End function
     
     
    Shuffle_and_write(MyArr)
    wscript.echo "terminer"
     
    '--------On shuffle l'array et on écrit le fichier de sortie
     
    Function Shuffle_and_write(MyArray())
        objoutFile.Write "#EXTM3U" & vbCrLf
        Dim I, J, Temp
        Randomize
        For I = LBound(MyArray) To UBound(MyArray)
            J = CLng(((UBound(MyArray) - I) * Rnd) + I)
            If I <> J Then
                Temp = MyArray(I)
                MyArray(I) = MyArray(J)
                MyArray(J) = Temp
            End If
    		counta = 0
        Next
        counta=0
    	while counta <> Ubound(Myarray)+1
    		'wscript.echo myarray(counta) & "<- ->"&counta '----- Pour afficher l'output dans la console en utilisant cscript
    		objoutFile.Write myarray(counta) & vbCrLf
    		counta = counta + 1
    	wend
    	  objoutFile.Close
     
    End Function


    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Batch] Création d'une liste aléatoire en parcourant un fichier *.M3U
    Par LinTianFu dans le forum Scripts/Batch
    Réponses: 12
    Dernier message: 20/10/2016, 15h50
  2. Réponses: 5
    Dernier message: 13/10/2005, 11h19
  3. [generic] pb création d'une List []
    Par yoplaboom dans le forum Langage
    Réponses: 6
    Dernier message: 08/07/2005, 14h01
  4. Création d'une liste ...
    Par keryss dans le forum Access
    Réponses: 6
    Dernier message: 21/10/2004, 10h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo