Bonjour
J'aimerais savoir comment faire pour ouvrir l'invite de commande MS-DOS, y copier une ligne de commande et l'exécuter le tout bien sûr sans avoir à taper la commande + ENTREE : je veux que tout s'exécute automatiquement.
Bonjour
J'aimerais savoir comment faire pour ouvrir l'invite de commande MS-DOS, y copier une ligne de commande et l'exécuter le tout bien sûr sans avoir à taper la commande + ENTREE : je veux que tout s'exécute automatiquement.
alors, un petit ShellExecute et une connaissance des options de ligne de commande de l'utilitaire de ligne de commande (excusez la totologie) donne ceci (pas testé) :
note l'usage du paramètre /C suivi de la commande à exécuter entre doubles quotes
Code : Sélectionner tout - Visualiser dans une fenêtre à part ShellExecute(0, 'open', 'cmd.exe', '/C "ping www.developpez.com"',0,SW_SHOWDEFAULT);
Le shellexecute doit être déclaré auparavant en tant que procédure ?
A quoi sert le "SW_SHOWDEFAULT" ? Est-il nécessaire ?
Dernière modification par Invité ; 12/08/2008 à 13h08.
shellexecute est définie dans l'unité ShellApi je crois bien (à inclure dans les uses des ton unité donc).
pour la définition des paramètres, regarder l'aide de la fonction dans l'aide du SDK windows.
salut;
tu peux aussi utiliser SW_HIDE au lieu de SW_SHOWDEFAULT, ceci marche tres bien avec C++, ceci vas te permettre de ne pas afficher une fenetre la fenetre DOS
Code : Sélectionner tout - Visualiser dans une fenêtre à part ShellExecute(0, 'open', 'cmd.exe', '/C "ping www.developpez.com"',0,SW_HIDE);
Bonsoir,
A noter que certains Pare-feu réagissent assez mal à cette manip.
Exemple KAV alertant en disant que le fichier Ping.exe est modifié
De quoi déboussoler plus d'un utilisateur.
si tu as pleins de commandes, tu peux passer par un fichier .bat ?
@evarisnea
Le seul souci c'est que ça ouvre l'invite de commande et que ça n'exécute aucune action.
La commande n'est même pas affichée.
Es-tu sûre de la syntaxe ?
PS : j'utilise delphi 7
@evarisnea
ça y est : en fait le code qui marche est le suivant :
2 dernières questions (et après je vous laisse (normalement) tranquilles lol) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part ShellExecute(0, 'open', 'cmd.exe', PChar('/C "ping www.developpez.com"'),0,SW_SHOWDEFAULT);
=> comment garder la commande ping visible lors de l'action ?
=> voici mon instruction ::
Code : Sélectionner tout - Visualiser dans une fenêtre à part ShellExecute(0, 'open', 'cmd.exe', PChar('/C ExtractShortPathName(EncExe) +current_job.cmdenc+ " -o NUL "+JobData.Input'),0,SW_SHOWDEFAULT);
les trucs en rouges étant des variables, je ne sais pas si la syntaxe de tout ce bidule est correcte ?
En gros la ligne de commande à copier donnerait ceci :
avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part F:\x264-CLI_r928\x264.exe --progress --thread-input -B 1378 -p 1 --stats "statsfile.pass" -A "p8x8,b8x8" -b 2 --direct auto --subme 5 --me "hex" -o NUL 1.avs
"ExtractShortPathName(EncExe)" qui est "F:\x264-CLI_r928\x264.exe"
"current_job.cmdenc" qui est "--progress --thread-input -B 1378 -p 1 --stats "statsfile.pass" -A "p8x8,b8x8" -b 2 --direct auto --subme 5 --me "hex""
"JobData.Input" qui est "1.avs"
je n'ai pas eu de problème avec le code précédemment posté (sans le transtypage explicite en PChar)
eh bien, quel type d'application utilises-tu ? à priori je ne voyais pas de souci, je n'ai même pas d'abord compris le pourquoi de ta question. c'est en testant le code dans une application console que je me suis rendu compte que rien ne s'affichait pourtant dans une application GUI win32 pas de souci.
a priori, j'écrirais ce code :
ou alors en passant par une variable que je testerais en chaque fois en mode déboguage pour vérifier son contenu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ShellExecute( 0, 'open', 'cmd.exe', PChar( '/C ' + ExtractShortPathName(EncExe) + ' ' + current_job.cmdenc + ' -o NUL ' + JobData.Input), 0, SW_SHOWDEFAULT );
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 parametre := '/C ' + ExtractShortPathName(EncExe) + ' ' + current_job.cmdenc + ' -o NUL ' + JobData.Input); ShellExecute( 0, 'open', 'cmd.exe', PChar(parametre), 0, SW_SHOWDEFAULT );
Ok ça fonctionne parfaitement maintenant.
Dernière chose :
comment attendre que le programme soit terminé pour passer à autre chose ?
Je sais qu'il y a la fonction ExecuteandWait
J'ai pensé à un truc du genre ExecuteandWait(shellexecute.................
Mais je ne sais pas trop.
en s'inspirant de la faq peut être un code comme ceci ?
cette fois la fonction utilisée est CreateProcess
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
36
37
38
39
40
41
42
43
44
45
46 procedure TForm1.Button2Click(Sender: TObject); Var StartInfo : TStartupInfo; ProcessInfo : TProcessInformation; Fin : Boolean; EncExe :string; begin { Mise à zéro de la structure StartInfo } FillChar(StartInfo,SizeOf(StartInfo),#0); { Seule la taille est renseignée, toutes les autres options } { laissées à zéro prendront les valeurs par défaut } StartInfo.cb := SizeOf(StartInfo); { Lancement de la ligne de commande } If CreateProcess( Nil, '"cmd.exe" ' + PChar( '/C ' + ExtractShortPathName(EncExe) + ' ' + current_job.cmdenc + ' -o NUL ' + JobData.Input), Nil, Nil, False, 0, Nil, Nil, StartInfo, ProcessInfo) Then Begin { L'application est bien lancée, on va en attendre la fin } { ProcessInfo.hProcess contient le handle du process principal de l'application } Fin:=False; Repeat { On attend la fin de l'application } Case WaitForSingleObject(ProcessInfo.hProcess, 200)Of WAIT_OBJECT_0 :Fin:=True; { L'application est terminée, on sort } WAIT_TIMEOUT :; { elle n'est pas terminée, on continue d'attendre } End; { Mise à jour de la fenêtre pour que l'application ne paraisse pas bloquée. } Application.ProcessMessages; Until Fin; { C'est fini } ShowMessage('Terminé'); End Else RaiseLastOSError; End;
Cela implique que je garde mon instru shellexecute non ?
En appelant cette procédure juste la ligne après ça devrait marcher non ?
Merci beaucoup.
Dernier truc : j'ai vu que tu avais mis le paramètre /C avant la ligne de commande : à quoi correspond-il ? Y'en-a-t-il d'autres ?
/C est un paramètre pour l'application cmd.exe qui indique au programme qu'il doit exécuter la chaîne qui suit le paramètre puis terminer l'application.
Fait un
Pour plus d'infos sur les paramètres possibles pour cmd.exe
Code : Sélectionner tout - Visualiser dans une fenêtre à part cmd.exe /?
Salut,
J'ai beaucoup lu des articles sur la création de ces types de fichiers mais je ne comprend toujours pas comment réaliser de choses plus intéressantes. Alors, aidez-moi donc à créer ces types de fichiers avec des instructions un peu plus complexes telles que:
1- Utiliser la commande DISKPART
2- Formater un lecteur amovible (flash)
3- En gros, utiliser les commandes les plus usuelles de l'invite de commande de windows
Merci, je compte sur vous.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager