Ligne de commande trop longue pour exécuter un shell [Résolu]

Signaler
Messages postés
13
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2009
-
Messages postés
13
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2009
-
Horreur !

Je ne peux pas exécuter une commande shell car les noms de fichiers sont trop longs :

Shell App.Path & "\jetcomp.exe -src:" & Src & " -dest:" & Dest

Le fichier dest n'est pas créé. Or quand je regarde l'expression, je me rends compte qu'elle est trop longue :

"C:\Documents and Settings\Deschamps\Mes documents\Elam\VB6_2_4_3_2009_01_01\jetcomp.exe -src:C:\Documents and Settings\Deschamps\Mes documents\Elam\VB6_2_4_3_2009_01_01\BDD\ElamVB5.mdb -dest:C:\Documents and Settings\Deschamps\Mes documents\Elam\VB6__"

aïe aïe aïe, que vais-je devenir ?

7 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
ne devrais-tu pas encadrer les chemins avec des guillemets ?

pour le frmMidi.hwnd, c'est pas vraiement utile dans ton cas. (mettre 0)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
tu peux commencer par transformer tes chemins en chemins courts ...

"C:\Docume~1\..."

et tenter d'utiliser plutot ShellExectute
Messages postés
13
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2009

je vais regarder dans l'aide comment utiliser des chemins courts
Messages postés
13
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2009

Je n'ose pas trop utiliser les noms courts car j'ai peur que ça ne marche pas avec les versions ultérieure de XP.

J'ai essayé shellexecute à plusieurs reprises (ce fut l'occasion de réinstaller l'excellent API-guide)

Src = App.Path & "\BDD\ElamVB5.mdb"
Dest = App.Path & "\BDD\ElamVB5compacte.mdb"
Backup = App.Path & "\BDD\back_up_ElamVB5.mdb"

FileCopy Src, Backup
'*******************Essai avec chemin complet
'ShellExecute frmMDI.HWnd, "open", App.Path & "\jetcomp.exe", _
'                "-src:" & Src & " -dest:" & Dest, App.Path, SW_SHOWNORMAL
'*******************Essai avec chemin relatif à app.path
ShellExecute frmMDI.HWnd, "open", App.Path & "\jetcomp.exe", _
                "-src:" & "\BDD\ElamVB5.mdb" & _
                " -dest:" & "\BDD\ElamVB5compacte.mdb", _
                App.Path, SW_SHOWNORMAL
'*******************Essai avec shell
'Shell App.Path & "\jetcomp.exe -src:" & Src & " -dest:" & Dest
FileCopy Dest, Src

Avec shell, ça ne marche pas, c'est normal, l'expression fait plus de 255 caractères
Avec shellexecute et chemin complet, ça ne marche pas ; c'est étonnant car l'expression de lpParameters ("-src:" & Src & " -dest:" & Dest) fait moins de 255 caractères.
Une erreur de syntaxe ?
Messages postés
13
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2009

J'ai essayé ceci :

Src = App.Path & "\BDD\ElamVB5.mdb"
Dest = App.Path & "\BDD\ElamVB5compacte.mdb"

erreur = ShellExecute(frmMDI.HWnd, "open", App.Path & "\jetcomp.exe", _
                " -src:" & Src & " -dest:" & Dest, App.Path, SW_SHOWNORMAL)
MsgBox erreur

le long erreur retourné est 42.
42 est supérieur à 32, il s'agit donc du handle de l'application qui a été lancé.
Shellexecute s'est donc déroulé normalement et n'a retourné aucune erreur.

Cependant, le fichier Dest n'a pas été créé.
En revanche, si je vais dans app.path, que je double-clique jetcomp.exe, que je sélectionne le fichier Src en source et Dest en destination, jetcomp.exe crée bien le fichier de destination.
C'est quand j'utilise shellexecute que je ne parviens pas à créer le fichier Dest.

Merci de ce que vous pourrez trouver pour résoudre le problème
Messages postés
13
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2009

J'ai eu du mal ; il fallait effectivement ajouter des chr(34) (guillemets).
J'ai dû aussi ajouter le paramètre -v3 ; je pense que cela correspond à msjet 3.51 mais je ne suis pas sûr.
Voici le résultat final (à tester sur d'autres machines et dans la durée) :

Src = App.Path & "\BDD\ElamVB5.mdb"
Dest = App.Path & "\BDD\compacte_ElamVB5.mdb"
Backup = App.Path & "\BDD\back_up_ElamVB5.mdb"

FileCopy Src, Backup
Erreur = ShellExecute(0, "open", App.Path & "\jetcomp.exe", _
                " -v3 -src:" & Chr(34) & Src & Chr(34) & _
                " -dest:" & Chr(34) & Dest & Chr(34) _
                , App.Path, SW_SHOWNORMAL)
'MsgBox Erreur
FileCopy Dest, Src

On Error GoTo erreurBDD
Set db = OpenDatabase(App.Path + "\BDD\elamVB5.mdb")
db.Close
GoTo fin
erreurBDD:
'************ code à prévoir si la réparation par jetcomp n'a pas fonctionné
fin:
end sub

J'ai essayé avec une bdd corrompue en Src et le code la répare automatiquement.

Merci à Renfield, je ne compte plus les fois où tu me dépannes.
Messages postés
13
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2009

A ceci près que la ligne qui suit le shellexecute peut être exécutée avant la fin du shellexecute.

J'ai trouvé cela qui pourrait résoudre mon problème :
http://www.vbfrance.com/codes/SHELLEXECUTE-AVEC-POSSIBILITE-ATTENDRE-FIN-EXECUTION-AVANT-CONTINUER_3050.aspx

mais en attendant, j'ai ajouté un bête sleep 2000 après le shellexecute.