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.
Salut, tu comptes piocher dans un fichier ou tu as tous les films, ou dans un fichiers texte avec les noms des films?
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.
Tu peux utiliser : var = %random%
pour ton aléatoire. Si tu veux entre deux bornes utilise le modulo de cette façonvar = %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.
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/
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çonvar = %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.
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.
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
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)
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.
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
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
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.
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
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="
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
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="
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.
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
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="
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
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
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à )
Et ensuite, le deuxième FOR est encore une astuce (ouais aucun de mes FOR ne sert à boucler )
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
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.