Page 1 sur 2
Lancer des commandes bat
Publié : mer. 14/déc./2016 23:20
par ChaudEf
Bonsoir
j'ai une douzaine de commandes batch que je voudrais executer depuis mon programme en purebasic, en general j'ecris tout ca dans un fichier bat que je fourre quelque part dans l'ordinatuer, puis je le lance avec runprogram.
existe-il un moyen plus propre? je voudrais avoir un moyen de lancer ca directement depuis le programme sans passer par un fichier bat.
merci
Re: Lancer des commandes bat
Publié : jeu. 15/déc./2016 0:03
par Ar-S
C'est quoi le soucis avec RunProgram() ? Tu peux tout lancer avec, même une simple page web. Je comprends pas.
Re: Lancer des commandes bat
Publié : jeu. 15/déc./2016 1:38
par JohnJohnsonSHERMAN
Je pense que le probléme n'est pas RunProgram() mais bien de ne pas avoir à créer de fichier batch non?
Re: Lancer des commandes bat
Publié : jeu. 15/déc./2016 1:46
par cage
Bonjour,
J'utilise des DataSection et des IncludeBinary pour transporter mes fichiers batch dans l'exe.
Code : Tout sélectionner
Procedure makeSomeFiles()
Protected addr.i, file.s, leng.l
DataSection
;;; SCRIPTS
IB01:
IncludeBinary "Data\myscript1.cmd"
IB02:
IncludeBinary "Data\myscript2.cmd"
EndDataSection
Structure ref
addr.i
name.s
size.i
EndStructure
NewMap files.ref()
;;
;;non-permanent files
;;
files("1")\addr = ?IB01
files("1")\name = TOOLS + "myscript1.cmd"
files("1")\size = ?IB02 - ?IB01 ; get size of included binary
;
files("2")\addr = ?IB02
files("2")\name = TOOLS + "myscript2.cmd"
files("2")\size = ?IB03 - ?IB02 ; get size of included binary
;
ForEach files()
file = LCase(files()\name)
;Debug "key=" + MapKey(files())
Select Val(MapKey(files()))
Case 1 To 4
Default
If ReadFile(#FileNum, file) : Continue : EndIf ; skip straight to the end of ForEach file()
EndSelect
;Debug "key=" + MapKey(files())
If CreateFile(1, file)
addr = files()\addr
leng = files()\size ; size of Included Binary
;Debug "addr=" + Str(addr)
;Debug "size=" + Str(leng)
WriteData(1, addr, leng)
CloseFile(1)
EndIf
Next
FreeMap(files())
EndProcedure ; makeSomeFiles()
C'est un bout de code nettoyé. Peut-être des erreurs. C'est juste le principe.
J'ai un répertoire data dans lequel je met tous les fichiers a inclure dans l'exe.
Ce peut être des bat, des cmd, des txt ou autre.
Le fichier cmd peut-être extrait dans %TMP% puis exécuté, puis effacé.
Gérard
Re: Lancer des commandes bat
Publié : jeu. 15/déc./2016 1:49
par ChaudEf
C'est ce que je fait toujours, je me demandais juste si il n'y avait pas un autre moyen
Merci
Re: Lancer des commandes bat
Publié : jeu. 15/déc./2016 1:54
par cage
Pour 12 commandes, il est possible d'empiler 12 RunProgram() a la suite avec un Wait pour être sur de ne pas exécuter le deuxième avant que le premier soit terminé.
Le tout, c'est de savoir quelles sont ces 12 commandes et si elles ne dépendent pas l'une de l'autre.
Re: Lancer des commandes bat
Publié : jeu. 15/déc./2016 2:01
par Ar-S
Amis nocture bonsoir ^^
Et dans ces 12 batchs ou peut être seulement quelque uns, tu es sûr que PB ne peux pas faire l'affaire via ses propres commandes ?
Re: Lancer des commandes bat
Publié : jeu. 15/déc./2016 2:15
par cage
Peux-tu nous donner un exemple de cette douzaine de commandes.
Re: Lancer des commandes bat
Publié : jeu. 15/déc./2016 9:57
par Mesa
On peut lancer les commandes une par une avec ce code inspiré de la doc:
Code : Tout sélectionner
Procedure.s PureCommand(Commande$, Invisible=#True)
Protected CommandConsole, Options, Sortie$
If Invisible=#True
Options = #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide
Else
Options = #PB_Program_Open | #PB_Program_Read
EndIf
CommandConsole = RunProgram("cmd.exe", Commande$, "", Options)
If CommandConsole
While ProgramRunning(CommandConsole)
If AvailableProgramOutput(CommandConsole)
Sortie$ = Sortie$ + ReadProgramString(CommandConsole) + #CR$
;
EndIf
Wend
Sortie$ + #CR$ + #CR$
Sortie$ + "Code de retour : " + Str(ProgramExitCode(CommandConsole))
CloseProgram(CommandConsole) ; Ferme la connection vers le programme
EndIf
ProcedureReturn Sortie$
EndProcedure
MessageRequester("Sortie", PureCommand(" /c ipconfig /all"))
MessageRequester("Sortie", PureCommand(" /?"))
; MessageRequester("Sortie", PureCommand(" /c dir"))
Debug PureCommand(" /c dir")
Mesa.
Re: Lancer des commandes bat
Publié : jeu. 15/déc./2016 13:55
par JohnJohnsonSHERMAN
Exact, j'allais proposer le même... Grillé

Je me demande si ce n'est pas plus pratique d'utiliser WriteProgramString() pour écrire les une aprés les autres les commandes dans CMD ? Ca évite d'en lancer plusieurs instances.
Re: Lancer des commandes bat
Publié : jeu. 15/déc./2016 14:01
par ChaudEf
WriteProgramString() avec un seul runprogram ?
Ça marche ?
Re: Lancer des commandes bat
Publié : jeu. 15/déc./2016 16:07
par JohnJohnsonSHERMAN
Il me semble que oui, puisqu'on écrit juste sur l'entrée standard (stdin), comme une frappe clavier...
Re: Lancer des commandes bat
Publié : ven. 16/déc./2016 11:15
par Mesa
Code : Tout sélectionner
;trouvé ici http://purebasic.info/phpBB3ex/viewtopic.php?f=1&t=4449&p=84131&hilit=%23PB_Program_Write#p84131
Procedure.s OemToChar(String.s)
OemToChar_(@String, @String)
ProcedureReturn String
EndProcedure
prog = RunProgram("cmd.exe", "", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Hide)
;Delay(200)
If IsProgram(prog)
WriteProgramStringN(prog, "dir /?") ;WriteProgramStringN(prog, "tracert purebasic.info")
WriteProgramStringN(prog, "cls")
WriteProgramStringN(prog, "echo off")
WriteProgramStringN(prog, " ")
WriteProgramStringN(prog, " ")
WriteProgramStringN(prog, " ")
WriteProgramStringN(prog, " ")
WriteProgramStringN(prog, "ipconfig /all")
WriteProgramStringN(prog, " ")
WriteProgramStringN(prog, " ")
WriteProgramStringN(prog, " ")
WriteProgramStringN(prog, " ")
WriteProgramStringN(prog, "date /T")
WriteProgramStringN(prog, "echo ok")
WriteProgramStringN(prog, "exit")
While ProgramRunning(prog)
If AvailableProgramOutput(prog)
x=0
Answer$=OemToChar(ReadProgramString(prog))
If Answer$
Debug Answer$
EndIf
EndIf
Delay(50) ; commentez cette ligne pour aller plus vite
Wend
EndIf
Re: Lancer des commandes bat
Publié : dim. 18/déc./2016 22:12
par ChaudEf
merci mais ce code n'a pas l'air de marcher
les commandes que je veux lancer sont
Code : Tout sélectionner
sc config dhcp start= disabled
net stop dhcp /y
sc config dnscache start= disabled
net stop dnscache /y
sc config netman start= disabled
net stop netman /y
Re: Lancer des commandes bat
Publié : dim. 18/déc./2016 23:13
par Ar-S
Avec le code de mesa et la commande
ça marche, je n'ai pas essayé la suite car je ne souhaite pas lacer des bidouilles dhcp sur mon pc mais peux tu dire ou ça ne marche pas ?