Pb commande shell

cs_thierryb Messages postés 5 Date d'inscription mardi 27 août 2002 Statut Membre Dernière intervention 2 septembre 2002 - 30 août 2002 à 13:58
rimas10 Messages postés 33 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 2 février 2009 - 20 févr. 2009 à 16:42
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

cs_imer Messages postés 59 Date d'inscription vendredi 26 juillet 2002 Statut Membre Dernière intervention 29 janvier 2004
30 août 2002 à 14:31
'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
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
30 août 2002 à 14:34
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
cs_thierryb Messages postés 5 Date d'inscription mardi 27 août 2002 Statut Membre Dernière intervention 2 septembre 2002
2 sept. 2002 à 11:06
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
cs_thierryb Messages postés 5 Date d'inscription mardi 27 août 2002 Statut Membre Dernière intervention 2 septembre 2002
2 sept. 2002 à 11:13
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_imer Messages postés 59 Date d'inscription vendredi 26 juillet 2002 Statut Membre Dernière intervention 29 janvier 2004
12 sept. 2002 à 14:06
Les déclarations des API dans .bas la fonction RunShell où tu veux
0
rimas10 Messages postés 33 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 2 février 2009
20 févr. 2009 à 16:42
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
Rejoignez-nous