Ligne de commande trop longue pour exécuter un shell

Résolu
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009 - 23 mars 2009 à 11:38
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009 - 23 mars 2009 à 17:52
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

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 mars 2009 à 14:35
ne devrais-tu pas encadrer les chemins avec des guillemets ?

pour le frmMidi.hwnd, c'est pas vraiement utile dans ton cas. (mettre 0)
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 mars 2009 à 11:56
tu peux commencer par transformer tes chemins en chemins courts ...

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

et tenter d'utiliser plutot ShellExectute
0
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009
23 mars 2009 à 12:38
je vais regarder dans l'aide comment utiliser des chemins courts
0
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009
23 mars 2009 à 13:05
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 ?
0

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

Posez votre question
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009
23 mars 2009 à 14:24
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
0
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009
23 mars 2009 à 16:58
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.
0
jdddeschamps Messages postés 13 Date d'inscription jeudi 18 décembre 2008 Statut Membre Dernière intervention 23 mars 2009
23 mars 2009 à 17:52
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.
0
Rejoignez-nous