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

Code : Tout sélectionner

WriteProgramStringN(prog, "sc config")
ç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 ?