CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet résolu : [batch] fichier aléatoire

DébutPage précedente
1
Page suivantePage suivante
maitrecolinot maitrecolinot
MP
Niveau 6
21 septembre 2017 à 21:10:00

Bonjour j'ai pas mal de film sur mon pc et je voudrait faire un script pour me donné un titre au hasard pour les jour où je ne sais pas quoi regarder. j'ai déjà le gros du code mais c'est la parti aléatoire qui me pose problème.
@echo off dir /S :: set n= pioché un fichier au hasard echo %n% pause exit
vous pouvais m'aider s'il vous plaît. la plupart de ce que j'ai trouver utilise la fonction FOR et était très lent. avant j'utilisé ça:
Get-location dir -Recurse | Get-Random | Select -expand Fullname cmd /c pause
le tout compilé en .exe sur ce site http://www.f2ko.de/en/op2e.php mais mon antivirus le flingue maintenant.
et si vous pouviez m'expliquer le code que vous me donné histoire de me couché moins bête. Merci.

artanno62 artanno62
MP
Niveau 10
21 septembre 2017 à 21:33:01

Salut, tu comptes piocher dans un fichier ou tu as tous les films, ou dans un fichiers texte avec les noms des films?

maitrecolinot maitrecolinot
MP
Niveau 6
21 septembre 2017 à 21:56:28

Le 21 septembre 2017 à 21:33:01 Artanno62 a écrit :
Salut, tu comptes piocher dans un fichier ou tu as tous les films, ou dans un fichiers texte avec les noms des films?

un dossier où j'ai tout mes film. mais je compte aussi l’utilisé pour mes manga donc j'ai besoin du chemin complet comme nom de fin. pas qui me dise 14.jpg sans plus d'info.

artanno62 artanno62
MP
Niveau 10
21 septembre 2017 à 22:10:46

Tu peux utiliser : var = %random% pour ton aléatoire. Si tu veux entre deux bornes utilise le modulo de cette façon
var = %random%%15 ça piochera de 0 à 15 e cette maniére.

Ensuite pour trouver un fichier et avoir son nom, tu peux utiliser tout simplement dir " * .extension", comme ça tu as juste à changer l'extension entre t'es mangas et t'es films.

artanno62 artanno62
MP
Niveau 10
21 septembre 2017 à 22:35:17

Sinon tu peux tester ça

for /f "tokens=*" %%i in ("D:\Mes documents\User\MyFolder") do do echo %%~ni & echo %%~pi

source : https://www.developpez.net/forums/d1108903/general-developpement/programmation-systeme/windows/scripts-batch/extraction-fin-chaine-caractere/

maitrecolinot maitrecolinot
MP
Niveau 6
21 septembre 2017 à 22:36:26

Le 21 septembre 2017 à 22:10:46 Artanno62 a écrit :
Tu peux utiliser : var = %random% pour ton aléatoire. Si tu veux entre deux bornes utilise le modulo de cette façon
var = %random%%15 ça piochera de 0 à 15 e cette maniére.

Ensuite pour trouver un fichier et avoir son nom, tu peux utiliser tout simplement dir " * .extension", comme ça tu as juste à changer l'extension entre t'es mangas et t'es films.

oui mais ça nécessite que tout les film ai un numéro et c'est pas ce que je veux. ce que je veux c'est que le batch liste les fichier de la où il se trouve avec "dir" et que dans ce que donne "dir" il en sélectionne un de manière aléatoire. et qu'il me dise ce qu'il à sélectionné. genre j'ai un dossier toto ou 3 fichier texte appelé tata titi et tutu quand je lance le batch il liste
tata
titi
tutu
à partir de cette liste il en prend un au pif et me dise
c:\toto\titi.txt
est-ce que j'ai bien expliquer?

ps: %random%%15 ne fonctionnera pas il faut un troisième % et il cherchera entre 0 et 14 pas 15 si on rajoute un +1 là il cherchera entre 1 et 15.%random%%%15+1 je le sais d'expérience pour avoir chercher un truc pour un autre script que j'ai fait.
edit: j'ai vus ton second post après que j'ai écrit le miens je vois ce que ça donne et te tient au courant. mais j'aimerais plus d'info sur le code car j'ai jamais utilisé de fonction FOR.

Message édité le 21 septembre 2017 à 22:38:32 par maitrecolinot
maitrecolinot maitrecolinot
MP
Niveau 6
21 septembre 2017 à 22:45:50

le second code ne marche pas il dit qu'il ne trouve pas le fichier. et oui j'ai pensé a changer le nom du fichier. en plus j'ai dit plus haut que les FOR était trop lent. plus d'une minute à chaque utilisation. alors que mon premier programme faisais une première lecture et ensuite je pouvais le réutilisé sans attente.

artanno62 artanno62
MP
Niveau 10
21 septembre 2017 à 23:50:15

Tu fais ça pour t'entrainer ou vraiment histoire de rendre un service? Sinon code ça en C/C++ ça ira beaucoup plus vite
Sinon je sais pas vraiment la comme ça, je regarde ça demain

Scrotumdepoulpe Scrotumdepoulpe
MP
Niveau 8
21 septembre 2017 à 23:51:22
setlocal EnableDelayedExpansion
set count=0
for /f "delims=" %%a in ('dir /b *.avi') do @(
	set filename[!count!]=%%a
	set /a count = count + 1
)
set /a choose = (%random% * 3 + %random%) %% count
set chosen=!filename[%choose%]!
cls
echo %chosen%
pause

Si c'est juste pour afficher le nom d'un fichier au hasard tu peux utiliser ça, ça marche très bien. (Le script n'est pas de moi je précise)

maitrecolinot maitrecolinot
MP
Niveau 6
22 septembre 2017 à 09:51:45

non je l'ai déjà essayer celui là. pour un dossier avec quelque fichiers ça va mais déjà qu'il y en a plus il galère. j'avais déjà chercher sur google sans succès.

maitrecolinot maitrecolinot
MP
Niveau 6
22 octobre 2017 à 12:37:56

:up:

Pseudo supprimé
Niveau 10
22 octobre 2017 à 15:47:42

Tu peux essayer un truc comme ça :

@echo off
cd C:\chemin
for /f %%d in ('dir /S /B ^| find /V /C ""') do set count=%%d
set /a rand=(%random% * %random%) %% count
for /f "skip=%rand%" %%d in ('dir /S /B') do echo %%d&goto :next
:next
pause

Je l'ai tester, il met ~1 secondes sur ~8000 fichiers, ça devrait aller :hap:

Message édité le 22 octobre 2017 à 15:51:30 par
maitrecolinot maitrecolinot
MP
Niveau 6
22 octobre 2017 à 18:04:10

Le 22 octobre 2017 à 15:47:42 Noukkie a écrit :
Tu peux essayer un truc comme ça :

@echo off
cd C:\chemin
for /f %%d in ('dir /S /B ^| find /V /C ""') do set count=%%d
set /a rand=(%random% * %random%) %% count
for /f "skip=%rand%" %%d in ('dir /S /B') do echo %%d&goto :next
:next
pause

Je l'ai tester, il met ~1 secondes sur ~8000 fichiers, ça devrait aller :hap:

oui mais il y à 2 problème:
1 si il y a un fichier caché le script plante. j'ai réglé ça en ajoutant un /A devant les /S /B
2 si il y a un espace genre c:\mes images\ il bloque et affiche "c:\mes"
et ce même si je met cd "C:\mes images" comme chemin. hors j'ai beaucoup de dossier et sous dossier contenant des espaces. il faudrait que le script prenne les espace en compte.

Pseudo supprimé
Niveau 10
22 octobre 2017 à 20:43:21

Le 22 octobre 2017 à 18:04:10 maitrecolinot a écrit :

Le 22 octobre 2017 à 15:47:42 Noukkie a écrit :
Tu peux essayer un truc comme ça :

@echo off
cd C:\chemin
for /f %%d in ('dir /S /B ^| find /V /C ""') do set count=%%d
set /a rand=(%random% * %random%) %% count
for /f "skip=%rand%" %%d in ('dir /S /B') do echo %%d&goto :next
:next
pause

Je l'ai tester, il met ~1 secondes sur ~8000 fichiers, ça devrait aller :hap:

oui mais il y à 2 problème:
1 si il y a un fichier caché le script plante. j'ai réglé ça en ajoutant un /A devant les /S /B
2 si il y a un espace genre c:\mes images\ il bloque et affiche "c:\mes"
et ce même si je met cd "C:\mes images" comme chemin. hors j'ai beaucoup de dossier et sous dossier contenant des espaces. il faudrait que le script prenne les espace en compte.

Effectivement, j'y avait pas pensé, c'est facilement corrigeable en remplaçant "skip=%rand%" par "skip=%rand% delims=" :desole:

maitrecolinot maitrecolinot
MP
Niveau 6
23 octobre 2017 à 11:28:25

Le 22 octobre 2017 à 20:43:21 Noukkie a écrit :

Le 22 octobre 2017 à 18:04:10 maitrecolinot a écrit :

Le 22 octobre 2017 à 15:47:42 Noukkie a écrit :
Tu peux essayer un truc comme ça :

@echo off
cd C:\chemin
for /f %%d in ('dir /S /B ^| find /V /C ""') do set count=%%d
set /a rand=(%random% * %random%) %% count
for /f "skip=%rand%" %%d in ('dir /S /B') do echo %%d&goto :next
:next
pause

Je l'ai tester, il met ~1 secondes sur ~8000 fichiers, ça devrait aller :hap:

oui mais il y à 2 problème:
1 si il y a un fichier caché le script plante. j'ai réglé ça en ajoutant un /A devant les /S /B
2 si il y a un espace genre c:\mes images\ il bloque et affiche "c:\mes"
et ce même si je met cd "C:\mes images" comme chemin. hors j'ai beaucoup de dossier et sous dossier contenant des espaces. il faudrait que le script prenne les espace en compte.

Effectivement, j'y avait pas pensé, c'est facilement corrigeable en remplaçant "skip=%rand%" par "skip=%rand% delims=" :desole:

merci ça marche. ça prend quand même 30 secondes à chaque fois (en même temps il liste 30000 fichier pour un total de 20 giga) mais au moins je suis sur qu'il est sûr, contrairement à mon ancien script. d'ailleurs tu peux m'expliquer ton script s'il te plaît car j'ai jamais fait de FOR avant et je voudrais m'améliorer. j'ai déjà compris que tu donnais des nom au résultat comme count ou rand. mais par exemple %%d sa ne me dit rien.
merci.

Message édité le 23 octobre 2017 à 11:28:43 par maitrecolinot
Pseudo supprimé
Niveau 10
24 octobre 2017 à 22:50:16

Le 23 octobre 2017 à 11:28:25 maitrecolinot a écrit :

Le 22 octobre 2017 à 20:43:21 Noukkie a écrit :

Le 22 octobre 2017 à 18:04:10 maitrecolinot a écrit :

Le 22 octobre 2017 à 15:47:42 Noukkie a écrit :
Tu peux essayer un truc comme ça :

@echo off
cd C:\chemin
for /f %%d in ('dir /S /B ^| find /V /C ""') do set count=%%d
set /a rand=(%random% * %random%) %% count
for /f "skip=%rand%" %%d in ('dir /S /B') do echo %%d&goto :next
:next
pause

Je l'ai tester, il met ~1 secondes sur ~8000 fichiers, ça devrait aller :hap:

oui mais il y à 2 problème:
1 si il y a un fichier caché le script plante. j'ai réglé ça en ajoutant un /A devant les /S /B
2 si il y a un espace genre c:\mes images\ il bloque et affiche "c:\mes"
et ce même si je met cd "C:\mes images" comme chemin. hors j'ai beaucoup de dossier et sous dossier contenant des espaces. il faudrait que le script prenne les espace en compte.

Effectivement, j'y avait pas pensé, c'est facilement corrigeable en remplaçant "skip=%rand%" par "skip=%rand% delims=" :desole:

merci ça marche. ça prend quand même 30 secondes à chaque fois (en même temps il liste 30000 fichier pour un total de 20 giga) mais au moins je suis sur qu'il est sûr, contrairement à mon ancien script. d'ailleurs tu peux m'expliquer ton script s'il te plaît car j'ai jamais fait de FOR avant et je voudrais m'améliorer. j'ai déjà compris que tu donnais des nom au résultat comme count ou rand. mais par exemple %%d sa ne me dit rien.
merci.

Les FOR ça permet de boucler sur un ensemble et le %%d est une variable qui représente l'élément actuel de la boucle :oui:

Le premier FOR boucle sur chaque ligne du resultat de la commande dir /S /B ^| find /V /C ""
Cette commande permet de récuperer le nombre de fichier dans ton dossier (récursivement), le FOR est en fait une astuce pour pouvoir récuperer le retour de cette commande dans une variable (Donc il est pas vraiment là pour boucler :hap:

La ligne suivante genère un nombre aléatoire entre 0 et le nombre de fichiers (Bon, là la génération est pas optimale et y'a des nombres qui ont plus de chance de tomber que d'autres mais voilà :hap:)

Et ensuite, le deuxième FOR est encore une astuce (ouais aucun de mes FOR ne sert à boucler :hap: )
Il va donc boucler sur la liste des fichiers en skippant les %rand% premiers puis en affichant le suivant, mais puisque il y a un goto à la fin il s'arrete de boucler immédiatement

Voilà j'espère avoir été clair, et au pire y'a la doc :hap:

maitrecolinot maitrecolinot
MP
Niveau 6
25 octobre 2017 à 17:10:15

pas tout compris mais merci quand même. mais si j'ai bien compris for pourrais servir de minuteur genre à chaque boucle rajouter +1 à %%d et quand %%d atteint par exemple 2000 goto next. enfin si j'ai bien compris.

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment