Page 1 sur 1

[R] Path d'un fichier / menu contextuel

Posté : sam. 02 nov. 2019 19:22
par DimVar
Bonjour,

Le projet : Faire un clic droit sur un fichier MP3 et "ajouter à la liste".
Lors du clic droit, dans le menu contextuel, une entrée "ajouter à la liste", qui récupérerait le path complet du fichier. Puis ajout dans un fichier M3U.
Le but est de créer rapidement depuis une arborescence, un fichier M3U (playlist winamp).

Comment procéderiez vous pour récupérer le path complet du fichier ?

Merci.
Cdlt, Dimvar.

Re: [..] Path d'un fichier / menu contextuel

Posté : sam. 02 nov. 2019 21:39
par mikell
Je m'étais fait un truc comme ça dans le temps
Pour tester, ajoute ces 2 clés dans le registre

[HKEY_CLASSES_ROOT\mp3file\shell\monscript\command]
@="C:\\monscript.exe \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\mp3file\shell\monscript\command]
@="C:\\monscript.exe \"%1\""

puis fais un .au3 avec juste ça : msgbox(0,"", $CmdLine[1]) , compile-le en "monscript.exe" , et mets-le dans C:

Il te faudra peut-être adapter les clés de registre pour ton OS mais c'est l'idée :wink:

Re: [..] Path d'un fichier / menu contextuel

Posté : dim. 03 nov. 2019 20:20
par walkson
Bonjour,
Il y a aussi l' UDF de Guinness https://www.autoitscript.com/forum/topi ... n-as-well/ qui fait la même chose de ce que propose Michel mais avec des options. Ça date de 2011 mais ça fonctionne sous win7 (sous win10 ???)
Toujours en reprenant l'idée de Michel, vous pouvez lancer une GUI en cliquant sur l'exe pour d'éventuelles options (créer ou supprimer des raccourcis etc..)
If $CmdLine[0] Then
;votre code pour créer votre fichier M3U
Else
   Form(); la gui
EndIf
mais vous connaissez peut être déjà ?

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 08:59
par DimVar
Merci à vous 2, mais la seule question etait : "Comment procéderiez vous pour récupérer le path complet du fichier ? :mrgreen:
"

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 09:51
par mikell
Certes. Mais la question s'inscrivant dans le contexte d'un projet, la sortir de ce contexte eût risqué d'entrainer une réponse inappropriée 8)
Est-ce à dire que ces réponses ne te satisfont pas ?

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 10:36
par DimVar
Peut etre n'ai je pas compris le principe alors ?
Comment, le script, peut me retourner le path du fichier sur lequel j'ai cliqué, avec juste le parametre $CmdLine[1] ?

[EDIT] Pkoi y a t'il un double antislash ? Si le chemin de mon script est dans un sous dossier à la racine de C: , la valeur sera t'elle c:\\temp\\m3u.exe ?

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 13:01
par DimVar
Bon, peut etre l'un d'entre vous a deja été confronté au pb...
j'ajoute HKEY_CLASSES_ROOT\exefile\shell\m3u\, j'ai bien un nouveau menu "m3u"quand je fais clic droit sur un exe.
j'ajoute HKEY_CLASSES_ROOT\mp3file\shell\m3u\, je n'ai pas de nouveau menu quand je fais clic droit sur un mp3.

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 14:12
par DimVar
Bon, il semble que la bonne cle soit : HKEY_CLASSES_ROOT\SystemFileAssociations\audio\shell\m3u
Si ca peut servir à qqun.
En effet, une fois que l'on a la bonne clef, je vois bien que le script renvoi (grace à explorer ?), le path du fichier.

Merci à vous.

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 14:57
par Tlem
Bonjour DimVar.
L'utilisation du double antislash est une spécificité "lié à la base de registre Windows". Donc ne pas se prendre la tête avec ça est simplement doubler les antislash.

Concernant la récupération du chemin complet, si vous utilisez le menu contextuel et donc une entrée dans la base de registre tel que décrit par Michel, c'est %1 qu'il faudra utiliser.
Le but étant de donner une commande dans cette fameuse ligne de base de registre afin d'exploiter la valeur %1.

Vous pourriez tout aussi bien utiliser simplement la commande Echo afin de rajouter à votre fichier m3u le fichier sélectionné, mais vous risquez d'avoir un gros problème lors de la sélection multiple ...
Du coup Michel vous a orienté vers l'utilisation d'un script AutoIt afin de traiter la ligne de commande renvoyé et donc de traiter les données du %1.

Donc, soit vous êtes sur de faire de la sélection simple et la, la simple commande "Echo >> Chemin\\NomDuFichier.m3u" devrait suffire.
Soit vous pensez éventuellement faire de la sélection multiple et là vous devrez passer par un script AutoIt qui recevra les informations du fameux %1 que vous devrez traiter afin d'en extraire le ou les chemins et noms de fichiers en utilisant tel que Michel vous l'a indiqué, la commande $CmdLine. Avantage du script : Vous pouvez utiliser le Drag&Drop

Voilà, j'espère que cela vous aidera dans votre projet.

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 15:52
par DimVar
Merci pour ce complément d'info. Mais malheureusement pour vous, un complément d'infos est souvent source de nouvelles questions :mrgreen:

1)
J'ai tenté d'utiliser la valeur recommandé par Mikell, mais j'ai un msg d'erreur.
@="c:\\temp\\m3u.exe" \"%1\""
Est ce une syntaxe propre à windows 7 et inferieur ?
J'ai donc procédé comme suit :
"c:\temp\m3u.exe" "%1"

2)
Concerant la selection multiple, j'ai tenté d'afficher les valeurs du tableau $cmdline, mais lorsque que je selectionne plusieurs fichiers dans l'explorer windows et que je click droit pour lancer l'action, seule le premier fichier est pris en compte.

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 16:13
par walkson
Pour la question 2, il faut faire une boucle
   For $i = 1 To $CmdLine[0]

   $chemin = $CmdLine[$i]

   Next
On peut aussi utiliser cela qui retourne un array
#include <Array.au3>
#include <WinAPIShPath.au3>

; An alternative to the limitation of $CmdLine[] only being able to return a maximum of 63 parameters.
Local $aCmdLine = _WinAPI_CommandLineToArgv($CmdLineRaw)
_ArrayDisplay($aCmdLine)
Toujours à compiler
Pour le menu contextuel, il y a ce programme portable assez simple à utiliser
https://www.nirsoft.net/utils/file_types_manager.html
https://www.virustotal.com/gui/file/8c3 ... /detection (pour vérification)

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 16:23
par DimVar
walkson a écrit : lun. 04 nov. 2019 16:13 Pour la question 2, il faut faire une boucle...
Merci Walkson, mais je sais afficher un tableau :P :wink:

Je garde l'utilitaire nirsoft pour plus tard, si je ne trouve pas d'autres solutions. (j'attends d'autres réponses éventuelles)

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 17:19
par Tlem
Pour le 1, l'essentiel, c'est que ça fonctionne. ^^
Pour le 2, il faut voir ce que vous renvoie $CmdLineRaw. Un seul nom de fichier ou plusieurs ???
En multisélection, vous devriez avoir plusieurs éléments. A vous de faire le traitement nécessaire. ^^

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 17:34
par mikell
Oy , voici qu'on se décarcasse pour répondre (enfin moi un ptit peu, mais walkson beaucoup), voici que même Thierry pond le paragraphe qui va bien dans un français inhabituellement impeccable, bref voici que tout ce qu'il faut est réuni pour fournir au user un point de départ solide, donc là on se dit que le user avec 830 messages au compteur il saura se démerbrouiller avec ça pour mener à bien son projet. Mais non, voilà que le user n'est pas content, et il fronce le nez, et il ergote, et il pinaille :roll:

Rha la la ces assistés :mrgreen:

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 19:12
par DimVar
M'enfin ! (dixit gaston)
Je pinaille pô !
- Je prends en compte les remarques de Walkson (que j'utiliserai plus tard si la solution outil windows ne fonctionne pas).
- Je prends en compte les remarques de Thierry, mais désolé, les double"\" ne semblent pas fonctionner sur WIN10 ?!?! (je peux joindre un prtscreen des clef de registre si besoin)
- Je prends en compte les conseils du chat vert, qui rejoignent un peu celles de Thierry, mais idem, msg d'erreur.

Du coup, je vais mettre des smileys, de la politesse et faire des efforts à tester avant de poster :P

Je recommence :

Bonjour à tous, Tlem, Mikell et Walson.

J'espere que vous allez bien, bla bla... :mrgreen:
Lorsque j'ajoute cette key au registre : [HKEY_CLASSES_ROOT\mp3file\shell\M3u\command] puis la valeur par defaut reg_sz : @="C:\\temp\\m3u.exe \"%1\""
dont le code de m3u.exe est :
Local $pathFile = ""

$pathFile = $CmdLine[1]
MsgBox(0,"",$CmdLine[1]) ;verifie le path file

_RecordMp3 ()

Func _RecordMp3 ()

$fo = FileOpen ("c:\temp\Temp.m3u",1)
   FileWriteLine ($fo,$pathFile)
   FileClose ($fo)

EndFunc
Et que je fais click droit sur un fichier *.mp3, aucune entrée au menu contextuel n'est présente.
OS : win10 Pro

Je vais donc plutot travailler avec cette registry key (sauf si vous avez une idee du pb) :
Ordinateur\HKEY_CLASSES_ROOT\SystemFileAssociations\.mp3\shell\m3u
Où là, j'ai bien une nouvelle entree "M3u" dans le menu contextuel.
Mais lorsque j'ajoute la valeur par defaut reg_sz : @="C:\\temp\\m3u.exe \"%1\"" et je tente de faire un click droit dessus, avec pour action "m3u", voila le msg d'erreur :
Image

Voila pourquoi j'utilise desormais comme valeur de cle par defaut : "C:\temp\m3u.exe" "%1"
Et là le script fonctionne, j'ai bien la msgbox qui confirme le path file.


Si deja vous avez des reponses à m'apporter sur ces pb de registry key, je peux passer au point 2, la multi selection.

:bisou: à tous :mrgreen:

PS : 800 msg à aider autrui sur des questions basiques et à saluer et souhaiter la bienvenue, ne feront jamais de moi, les personnes exeptionnelles que vous etes ! :mrgreen: :D


@Tlem
$cmdlineraw me renvoi ceci :
Image
Deux popup de msgbox simultanées.

Dont le script est :
#Include <Array.au3>
Local $pathFile = ""

$pathFile = $CmdLine[1]
MsgBox(0,"M3u",$CmdLineraw) ;verifie le path file
;~ _ArrayDisplay ($CmdLine)

_RecordMp3 ()

Func _RecordMp3 ()

$fo = FileOpen ("c:\temp\Temp.m3u",1)
   FileWriteLine ($fo,$pathFile)
   FileClose ($fo)

EndFunc
Cdlt, Dimvar.

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 19:54
par Tlem
Alors, concernant la clé de base de registre, l'essentiel c'est que celle que vous utilisez fonctionne. Parfois d'un système à l'autre les choses sont différentes. Il ne faut pas se formaliser la dessus.
Concernant les doubles slash, effectivement parfois il les faut et parfois non. La encore, l'essentiel c'est de tester et de trouver. ^^

Concernant le retour de $cmdlineraw, je suis dubitatif, car il semblerait que les deux noms soient bien envoyés, mais en plusieurs fois alors que je m''attendais à avoir une ligne avec plusieurs noms.
Bref si le fonctionnement du menu contextuel est l'envoi des noms de fichiers et le lancement de l'exe pour chaque nom, il suffit de traiter cela comme si vous traitiez un seul fichier tel que vous l'avez dans votre dernier code. Après si j'ai bien compris, seul le premier fichier est pris en compte, du coup il faut essayer de comprendre pourquoi MsgBox(0,"M3u",$CmdLineraw) renvoi bien le nom des deux fichiers (probablement par le lancement de l'exe de manière consécutive) et pourquoi la fonction _RecordMp3 () ne rajoute pas ces noms au fichier m3u.

Vu que vous ne faites aucune vérification concernant les arguments ou la présence du fichier m3u, vous pourriez simplifier la totalité de votre code par :

Code : Tout sélectionner

FileWriteLine("c:\temp\Temp.m3u",$CmdLine[1])

Re: [..] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 20:24
par DimVar
@Tlem

Je me demande si ce n'est pas l'ecriture/syntaxe de la valeur de la clef qui pose pb et qui ouvre de manière consécutive le script, plutôt que d'avoir plusieurs paramètres aux script. Je suis en train de voir ca sur technet.
Je vais passer en résolu et je déposerai la soluce, soit grâce a technet, soit grâce à Nirsoft.

Merci pour tout.

Re: [R] Path d'un fichier / menu contextuel

Posté : lun. 04 nov. 2019 21:32
par Tlem
Techniquement parlant, ce comportement ne me semble pas aberrant et même plutôt logique.
Peu importe, en ce qui me concerne, je ferais en sorte que m3u.exe puisse traiter un ou plusieurs arguments, de telle sorte que si j'ai envie de faire du Drag&Drop, cela fonctionne aussi. ^^

Re: [R] Path d'un fichier / menu contextuel

Posté : jeu. 12 déc. 2019 15:10
par jpascal
Bonjour,

Le programme est en effet lancé autant de fois que le nombre de fichiers sélectionnés.

Il existe un programme qui permet de traiter tous les fichiers sélectionnés : SingleInstanceAccumulator.exe
Voici la page explicative : https://stackoverflow.com/questions/182 ... 64#1824064

Plus simplement, essayez ça :
If $CmdLineraw = '' Then Install()

RecordMp3()

Func RecordMp3()
   $fo = FileOpen("c:\temp\Temp.m3u", 1)
   FileWriteLine($fo, $CmdLineraw)
   FileClose($fo)
EndFunc   ;==>RecordMp3

Func Install()
   Local $aExt = ['mp3']
   Local $sRegPath = ''

   For $sExt In $aExt
      $sRegPath = 'HKEY_CLASSES_ROOT\' & RegRead('HKEY_CLASSES_ROOT\.' & $sext, '') & '\shell\RecordMP3'

      RegWrite($sRegPath, '', 'REG_SZ', "Ajouter à la liste m3u")
      RegWrite($sRegPath, 'Icon', 'REG_SZ', @ScriptFullPath)
      RegWrite($sRegPath & '\command', '', 'REG_SZ', '"' & @ScriptFullPath & '" %1')
   Next

   MsgBox(0, 'RecordMP3', "Menu contextuel installé")
   Exit
EndFunc   ;==>Install