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 :

Afficher des messages sur l'invité de commande


Sujet :

VBScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Automaticien
    Inscrit en
    Octobre 2019
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Automaticien

    Informations forums :
    Inscription : Octobre 2019
    Messages : 75
    Par défaut Afficher des messages sur l'invité de commande
    Bonjour à tous,

    je souhaite pouvoir afficher des informations sur l'état d'exécution de mon programme dans l'invité de commande (celui depuis lequel j'ai lancé mon script).

    J'ai essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set fso = CreateObject ("Scripting.FileSystemObject")
    Set stdout = fso.GetStandardStream (1)
    Set stderr = fso.GetStandardStream (2)
    stdout.WriteLine "This will go to standard output."
    stderr.WriteLine "This will go to error output."
    Sans succès...
    J'ai essayé ceci:
    WScript.stdout.WriteLine "En cours d'execution"
    D'après les sources que j'ai lu, cela devrait fonctionner, un problème avec Windows 10?
    Ces méthodes ne sont peut-être plus au goût du jour...
    Merci d'avance d'éclairer ma lanterne

    Voici le script complet:
    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
    'Archive un dossier
    Dim CheminDossierAZip, CheminDest, i 
    Dim WS, fso, prg, CMND
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set WS = CreateObject("WScript.shell") 
     
    CheminDossierAZip = WScript.Arguments(0)
    CheminDest = Replace(CheminDossierAZip," ","_")  & ".7z"
    CheminDossierAZip = fso.GetFolder(CheminDossierAZip).ShortPath
    prg = fso.GetFile("C:\Program Files\7-Zip\7z.exe").ShortPath
     
    CMND = prg & " a -sfx " & CheminDest & " " & CheminDossierAZip
    WS.Run CMND, 0, True
    Set fso = CreateObject ("Scripting.FileSystemObject")
    WScript.stdout.WriteLine "En cours d'execution"
    Do while Proccess("7z.exe") = True
        WScript.Sleep 100
        WScript.stdout.WriteLine "En cours d'execution"
    loop
     
    Function Proccess(nomfichier)
    dim objWMIService
    dim ProcessEncours
    dim strComputer
     
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set ProcessEncours = objWMIService.ExecQuery ("Select name from Win32_Process where name ='" & nomfichier & "'")
    Set objWMIService = NotHing
     
    If ProcessEncours.Count <> 0 Then Proccess = True Else Proccess = False
     
    Set ProcessEncours = NotHing
     
    End Function
    D'ailleurs la Function Proccess ne fonctionne pas non plus correctement, je pense que la ligne suivante y est pour quelque chose aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ProcessEncours = objWMIService.ExecQuery ("Select name from Win32_Process where name ='" & nomfichier & "'")
    Qu'en pensez-vous?

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    C'est une rare endroit où on peut expérimenter asynchronisme en vbs. La façon de concevoir le script est valable mais il n'y manque quelque détail important.

    [1] La methode run() a un paramètre pour l'instruire qu'elle doit brancher le procès et de faire un asynchronisme. Sinon, tous les lignes de sleep et de boucle sont dénuée de sens parce que le run() va bloquer le script et les lignes suivants répondent à un état ou 7z.exe est clos et disparu. C'est ce que vous observez je suppose et avez une impression que WriteLine etc n'exécute pas: non, il est à cause Proccess retourne forcément une false...
    Code vbs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'WS.Run CMND, 0, True
    WS.Run CMND, 0, False

    [2] Avec [1] le script devrait marcher déjà. Mais je veux souligner une chose importante supplémentaire. Pour un long processus, archivant un dossier important et qu'on fait voir chaque 100 millisecondes si 7z.exe est là, il faut faire attention au coût de faire instantier wmi service. L'opération coute chère. Je dirais de déplacer ces lignes hors de la fonction.

    Voici ce que je réécrirais de ce que je vois d'une façon minimale.
    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
    Dim CheminDossierAZip, CheminDest, i 
    Dim WS, fso, prg, CMND
     
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set WS = CreateObject("WScript.shell") 
     
    CheminDossierAZip = WScript.Arguments(0)
    CheminDest = Replace(CheminDossierAZip," ","_")  & ".7z"
    CheminDossierAZip = fso.GetFolder(CheminDossierAZip).ShortPath
     
    prg = fso.GetFile("C:\Program Files\7-Zip\7z.exe").ShortPath
     
    CMND = prg & " a -sfx " & CheminDest & " " & CheminDossierAZip
    'WS.Run CMND, 0, True
    WS.Run CMND, 0, False
     
    WScript.stdout.WriteLine "En cours d'execution"
     
    dim objWMIService, strComputer
    strComputer="."
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
     
    Do while Proccess(objWMIService, "7z.exe")
        WScript.Sleep 100
        WScript.stdout.WriteLine "En cours d'execution"
    loop
    WScript.stdout.WriteLine "Exécution terminée"
     
    set objWMIService=Nothing
     
     
    Function Proccess(objWMIService, nomfichier)
        dim ProcessEncours
        Set ProcessEncours = objWMIService.ExecQuery ("Select name from Win32_Process where name ='" & nomfichier & "'")
        If ProcessEncours.Count <> 0 Then Proccess = True Else Proccess = False
        Set ProcessEncours = Nothing
    End Function
    Voilà !

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/09/2017, 22h54
  2. Afficher des messages sur un server log
    Par sheridan08 dans le forum Logging
    Réponses: 5
    Dernier message: 13/06/2014, 17h56
  3. Afficher des messages de la commande system dans un edit text
    Par junkie1986 dans le forum Interfaces Graphiques
    Réponses: 8
    Dernier message: 07/05/2012, 12h12
  4. Réponses: 1
    Dernier message: 05/10/2010, 19h13
  5. afficher des messages sur la fenetre
    Par daff86 dans le forum Tkinter
    Réponses: 3
    Dernier message: 24/04/2008, 19h57

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