Pb commande shell

Signaler
Messages postés
5
Date d'inscription
mardi 27 août 2002
Statut
Membre
Dernière intervention
2 septembre 2002
-
Messages postés
33
Date d'inscription
mardi 14 octobre 2003
Statut
Membre
Dernière intervention
2 février 2009
-
thierryb

compression = Shell("c:\rar.exe a -r -m5 c:\tempo\archive.rar c:\vxdata\* ", 1)

Set fs = CreateObject("Scripting.FileSystemObject")
fs = fs.CopyFile("c:\tempo\*.rar", "d:")

comment empecher que la commande copyfile s'execute avant que rar.exe ait fini de decompresser????
exepliquez moi simplement si possible avec un peu de code car je debute en vb

6 réponses

Messages postés
59
Date d'inscription
vendredi 26 juillet 2002
Statut
Membre
Dernière intervention
29 janvier 2004

'Voici un fonction qui permet de controler le retour d'une commande shell et donc d'attendre la fin de son exécution
'Les API à déclarer dans un module sont:
Public Declare Function OpenProcess Lib "kernel32" _
    (ByVal dwDesiredAccess As Long, _
     ByVal bInheritHandle As Long, _
     ByVal dwProcessId As Long) As Long

Public Declare Function GetExitCodeProcess Lib "kernel32" _
    (ByVal hProcess As Long, lpExitCode As Long) As Long

Public Declare Function CloseHandle Lib "kernel32" _
    (ByVal hObject As Long) As Long

Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const STATUS_PENDING = &H103&

'La fonction est:
Public Function RunShell(cmdline As String) as Long

    Dim hProcess As Long
    Dim ProcessId As Long
    Dim exitCode As Long
    On Error GoTo erreurRunShell

    ProcessId = Shell(cmdline)
    RunShell = ProcessId

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId)

    Do
    
        Call GetExitCodeProcess(hProcess, exitCode)
        DoEvents
   
    Loop While exitCode = STATUS_PENDING

    Call CloseHandle(hProcess)

Exit Sub
erreurRunShell:
MsgBox Err.Description
RunShell = 0
End Sub

'Ton code sera alors:
compression = RunShell("c:\rar.exe a -r -m5 c:\tempo\archive.rar c:\vxdata\* ", 1) 

Set fs = CreateObject("Scripting.FileSystemObject") 
fs = fs.CopyFile("c:\tempo\*.rar", "d:") 
0
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
23
Simplement tu ne peut que contourner le probleme , car sinon il faut que tu utilises des threads (www.allapi.net) qui ne sont pas simples a mettre en place sous VB.

Tu peux faire un while en utilisant la valeur retourné par ton shell.

While compression<>(valeur qd le shell est fini)
doevents
wend

ya d'autre solution mais c la plus simple , la valeur qd le shell est finit devrait etre 0 normalement

|The S@ib|
VBP2P project
0
Messages postés
5
Date d'inscription
mardi 27 août 2002
Statut
Membre
Dernière intervention
2 septembre 2002

je te remercie pour ton aide mais quelques questions:
1) dans mon prjet est ce dans un module .bas que je dois declarer lesAPI
2)doisje inclure la public function Runshell dans le .frm
thierryb
c
0
Messages postés
5
Date d'inscription
mardi 27 août 2002
Statut
Membre
Dernière intervention
2 septembre 2002

j'ai esssaye avec 0 mais ca marche pas la valeur renvouyee n'est jamais la meme en plus...
ps je te fais passer le code.ca fais 2 semaines que je galere sur ce projet .je suis pas doue aidez moi SVP

Option Explicit

Dim source 'variable source
Dim destination 'variable destination
Dim compression ' variable de compression

Private Sub cmdCopy_Click()

'on change le caption du bouton de copie
cmdCopy.Caption = "Copie en cours...."

'on désactive les boutons et on lance la barre progres
cmdCopy.Enabled = False
cmdQuitter.Enabled = False
Dim Counter As Integer
Dim Workarea(250) As String
ProgressBar1.Min = LBound(Workarea)
ProgressBar1.Max = UBound(Workarea)
ProgressBar1.Visible = True

'Affecte la valeur Min à la propriété Value.
ProgressBar1.Value = ProgressBar1.Min

'Boucle dans le tableau.
For Counter = LBound(Workarea) To UBound(Workarea)
'Définit les valeurs initiales pour chaque élément du tableau.
Workarea(Counter) = "Valeur initiale" & Counter
ProgressBar1.Value = Counter
Next Counter
ProgressBar1.Visible = False
ProgressBar1.Value = ProgressBar1.Min

'compression des fichiers
compression = Shell("c:\rar.exe a -r -m5 c:\tempo\archive.rar c:\vxdata\* ", 1)

' copie des fichiers
Set fs = CreateObject("Scripting.FileSystemObject")
fs = fs.CopyFile("c:\tempo\*.rar", "d:")

'on reactive les boutons
cmdCopy.Enabled = True
cmdQuitter.Enabled = True
cmdCopy.Caption = "Copie"
Call MsgBox("fichier copié !", vbInformation + vbOKOnly, "message")
Kill "c:\tempo\*.rar"
End Sub
Private Sub cmdQuitter_Click()
Unload Me
End Sub

thierryb
0
Messages postés
59
Date d'inscription
vendredi 26 juillet 2002
Statut
Membre
Dernière intervention
29 janvier 2004

Les déclarations des API dans .bas la fonction RunShell où tu veux
0
Messages postés
33
Date d'inscription
mardi 14 octobre 2003
Statut
Membre
Dernière intervention
2 février 2009

une solution un peux bricolage peux etre mieux qu'une centaine de ligne
ce que je te propose c'est de mettre cette ligne deriere ton shell

Timing (5)

le 5 c'est le nombre de seconde que tu pourrai demander a ton programme d'attendre avant de terminer la prcedure tu peux aussi mettre plus si le fichier est volumineux

Public Sub Timing(ByVal Sec As Integer)
Dim instant
Dim timeout
instant = Now
Do
  DoEvents
  timeout = DateDiff("s", instant, Now)
Loop Until timeout = Sec
End Sub
0