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 :

Passage d'arguments en ligne de commandes à un script, problème d'ordre - WScript.Argument


Sujet :

VBScript

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 36
    Points : 20
    Points
    20
    Par défaut Passage d'arguments en ligne de commandes à un script, problème d'ordre - WScript.Argument
    OS: Win7 64bits

    Bonjour,

    Problème dans l'ordre de traitement des fichiers lorsqu'on passe une sélection de fichiers à script vbs.


    Dans Explorer, je choisi un groupe de fichiers avec la souris et SHIFT, disons les fichiers B à F au sein du répertoire contenant les fichiers A à G:
    A.txt
    B.pdf
    C.pdf
    D.jpg
    E.pdf
    F.doc
    G.txt

    Puis, je place ma souris au sein de cette sélection, par-exemple, au-dessus du fichier D.jpg et je fais un click droit pour "envoyer vers" et je choisis mon script vbs que j'ai développé.

    Ce script prend les arguments comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for idx = 1 To WScript.Arguments.Count -1
    	MsgBox WScript.Arguments(idx)
    Next
    Surprise, l'ordre n'est pas B, C, D, E, F
    mais
    E,F,B,C,D


    Comment avoir l'ordre B,C,D,E,F?

    Si j'avais sélectionné dans l'ordre inverse F à B et que je clique droit au sein de la sélection je veux aussi F à B.

    C'est-à-dire, l'ordre du premier et dernier fichier sélectionner, détermine l'ordre de traitement, mais au sein de la sélection si je fais le click droit pour "envoyé vers" cela ne doit pas déterminer un nouveau pointeur.

    Merci.

  2. #2
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    En d'autres termes

    WScript.Arguments(0) à pour valeur la où se trouvait la souris au moment du click droit

  3. #3
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Si on fait un tri des fichiers avant de les envoyer au script, cela marche (sans y inclure le fichier d'index 0).
    Une condition peut être ajoutée sur la casse : minuscule / majuscule :
    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
        Option Explicit 
     
        Dim I, Tb(30), n
     
        For i =   Wscript.Arguments.Count - 1 to 1 Step - 1
           'MsgBox WScript.Arguments(i)
           Tb(i) = WScript.Arguments(i)
        next
         n = Wscript.Arguments.Count - 1
          Tri n, Tb
          For i = UBound(Tb) To LBound(Tb) Step - 1
            If Tb(i) <> "" Then MsgBox Tb(i)
          Next
        'Il faut faire un tri avant l'envoi au script
        '=========================
        Sub Tri(m,Tb)
           Dim i, pos, j, aux
             FOR i = 2 TO m 
                  pos = i-1
                  ' Si on veut un tri avec respect de la casse, on doit enlever le 'LCase' de la ligne suivante
                  WHILE (pos>=1) and (LCase(Tb(pos)) < LCase(Tb(i)))
                      pos= pos-1
                  Wend
                  pos = pos + 1
                  aux = (Tb(i))
                  FOR j = (i-1) To  pos Step -1
                      Tb(j+1) = Tb(j)
                  Next
                  Tb(pos) = aux
            Next
        End Sub
        '==========================='
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  4. #4
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Merci, mais je comprends pas ni la logique, ni comment l'implémenter.

    >Si on fait un tri des fichiers avant de les envoyer au script
    On est dans Win Explorer
    1/ on sélectionne un groupe de fichier et on veut l'ordre qu'on voit dans explorer (çà pourrait être un tri par nom, par date, par type de fichiers, etc.)
    2/ on fait un click droit pour avoir "envoyer vers" et on choisit le script.

    la liste/tableau WScript.Arguments contient la liste des fichiers, mais dont le premier élément WScript.Arguments(0) n'est autre que le fichier au-dessus duquel le pointeur de souris se trouvaient.

    Il n'y a pas moyen de connaître les premier et dernier fichiers cliqués?

  5. #5
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    En suivant la même logique que j'ai lue dans ton post, j'ai choisi le tri par nom, et dans la même ligne, j'ai omis le fichier d'index 0 comme dans ton code.
    Si on veut un autre type de tri, c'est une autre paire de manches : si par exemple on veut un tri selon la date de dernier accès, de modification ou de création, il faut d'abord lire ces infos depuis les fichiers puis les classer selon ces infos.

    Maintenant, si on inclut le fichier d'index 0 (celui sur lequel on fait un clic droit), l'affichage se fait de la manière suivante : d'abord le fichier d'index 0, puis tous les fichiers qui le suivent(ordonnés alphabétiquement avec prise en compte de la casse) ensuite les fichiers qui le précèdent(ordonnés eux aussi).
    Avec le tri, on obtient le fichier d'index 0 puis tous les autres ordonnés selon le critère de tri.
    On n'y peut rien : c'est un caprice de l'explorateur et ce quel que soit le sens de la sélection : vers l'avant / l'arrière (avec ou sans tri)

    Pour l'implémentation du code dans le script final, il faut faire le traitement(par une Sub ou une fonction) à la place du MsgBox.
    Il n'y a pas moyen de connaître les premier et dernier fichiers cliqués?
    S'agit-il du premier et du dernier fichiers dans la sélection ou dans l'affichage ?
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 177
    Points : 5 738
    Points
    5 738
    Par défaut
    Pour ma part j’admets que l'explorateur place les fichiers dans un ordre qui pourrait paraitre illogique, mais j'y voit un intérêt.

    Lorsque je veux copier 10 films :
    - je les sélectionnes (a,b,c,d,e,f,g,h,i,j)
    - J'ai un besoin particulier je souhaite qu'il copie en premier le film 'b' car je veux le voir de suite.
    - Je fait mon clic droit sur le film 'b' puis copier, cette action le placera en tête des fichier à copier.
    - Puis coller il commencera par 'b'.

    Je ne sais pas combien d'autres personnes ce serve de cette 'astuce' il semble que je soit le seul.

    C'est donc l'explorateur qui modifie volontairement l'ordre.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    >Il n'y a pas moyen de connaître les premier et dernier fichiers cliqués?
    >S'agit-il du premier et du dernier fichiers dans la sélection ou dans l'affichage ?

    Bonne question
    Supposons que mon répertoire contienne les fichiers nommés A à H
    Supposons que dans Explorer je les trie par taille ou date et que l'ordre affiché soit ainsi
    H
    F
    G
    E
    C
    D
    A
    B

    Si je clique d'abord sur le fichier A, puis par sélection multiple SHIFT+MAJ et F, j'ai maintenant la sélection "F G E C D A" et comme j'ai sélectionné en premier A et non F je veux passer les arguments en ordre inverses (comme une impression p.ex. 9-1 pour indiquer l'impression des pages 9 à 1 et non de 1 à 9).

    Enfin, c'est bien au sein de cette sélection "F G E C D A" que je vais faire un clique droit pour avoir le menu "envoyer vers" et choisir mon script qui va faire le processing de ces fichiers.

    En résumé, il s'agit d'une FIFO dont le 1er argument est défini par la 1ère sélection et le dernier par la dernière sélection et ce quelle que soit le fichier au-dessus duquel je vais faire un clique droit.

    Or, actuellement si WScript.Arguments passe tous les fichiers sélectionnés, c'est bien l'ordre des arguments qui pose problème, car WScript.Arguments(0) pointe toujours sur le dernier fichier survoler.
    Ici, si c'était E, alors WScript.Arguments(0)="E" or j'aurais besoin de WScript.Arguments(0)="A".

    Donc je vois trois possibilités:
    1/ existe-il une variable d'environnement, pour désigner WScript.Arguments(0)=premier fichier sélectionné?
    2/ existe-il une mémoire de 1er (et dernier) élément sélectionné ?
    3/ existe-t-il un autre tableau que WScript.Arguments ?

    Merci

  8. #8
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 177
    Points : 5 738
    Points
    5 738
    Par défaut
    Place ce script dans to SendTo pour mieux comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For Each strArg in Wscript.Arguments
      str = str + strArg + vbcrlf
    Next
    msgbox str
    Je vais t'expliquer précisément ce qu'il passe:

    Tu as la sélection qui est respecté selon l'ordre de tri.
    Si tu clic droit sur le premier fichier (de ta sélection) puis envoyer vers, il n'y à pas de modification de l'ordre des paramètres car l'item cliqué est déjà premier.
    1, 2, 3, 4, 5 -> clic 1 -> 1, 2, 3, 4, 5

    Maintenant tu as le cas du clic sur un autre fichier de ta sélection, ça va modifier l'ordre, voici des exemples pour mieux comprendre :
    1, 2, 3, 4, 5 -> clic 2 -> 2, 3, 4, 5, 1
    1, 2, 3, 4, 5 -> clic 4 -> 4, 5, 1, 2, 3
    1, 2, 3, 4, 5 -> clic 5 -> 5, 1, 2, 3, 4

    5, 4, 3, 2, 1 -> clic 5 -> 5, 4, 3, 2, 1
    5, 4, 3, 2, 1 -> clic 2 -> 2, 1, 5, 4, 3

    Je ne parlerait pas du cas obscure du menu contextuel sans clic, déclenché via la touche du clavier dédié.

    Je que je te dit est un constat (sous Windows 7) ce n'est pas moi qui l'ai inventé.

    1/ existe-il une variable d'environnement, pour désigner WScript.Arguments(0)=premier fichier sélectionné?
    Ce n'est pas de la faute de Wscript c'est l'explorateur qui modifie l'ordre avant de le passer à ton script. Donc non.

    2/ existe-il une mémoire de 1er (et dernier) élément sélectionné ?
    Non.

    3/ existe-t-il un autre tableau que WScript.Arguments ?
    Non.

    Tu peut aussi utiliser 'Free Clipboard Viewer' afin d'examiner le presse papier car c'est le même comportement avec un 'copier'.
    Le presse-papier est plus riche qu'un simple passage d'argument à un programme.
    On peut notamment retrouver le fichier cliqué dans la section 'FileName'.

    La seule solution serai de demander à l'explorateur de ne pas modifier l'ordre, peut être via une clé de registre si ça existe.
    Mais bon modifier le system pour ca ...

    Traite les tels qu'il viennent, tous les programmes font comme ça (ou alors tu les tri dans ton script à ta guise), comme ça je pourrai me servir de cette astuce pour priorisé mes traitements

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/11/2010, 21h04
  2. Réponses: 27
    Dernier message: 14/12/2006, 20h49
  3. [VB.NET]Argument en ligne de commande
    Par Fayoul dans le forum Windows Forms
    Réponses: 3
    Dernier message: 01/06/2006, 13h27
  4. taille max des arguments en ligne de commande
    Par clepape dans le forum Langage
    Réponses: 2
    Dernier message: 08/10/2005, 14h18
  5. Réponses: 3
    Dernier message: 07/04/2003, 21h06

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