Programme en ligne de commande et programme en ligne de commande

Codes specifiques à Windows
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Re: Programme en ligne de commande et programme en ligne de commande

Message par NY152 »

Un exemple de ce que je cherche à faire ?

Par exemple avoir un retour dans la console de ce genre de commande :

ffmpeg -i input.wav -vn -ar 44100 -ac 2 -b:a 192k output.mp3

Bon ça reste qu'un exemple mais le programme que je cherche à écrire c'est pour faire des conversions audio/vidéo toute bête mais j'aimerais le retour dans mon programme, pas que ça s'ouvre salement en dehors :/

Après si la chose permet d'intercepter les choses permettant d'alimenter en réponses utilisateur, je prends ...

J'ai rien trouvé de concluant et de propre

Si déjà j'arrive à ça je serais content ^^
.:NY152:.
Avatar de l’utilisateur
cage
Messages : 366
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Programme en ligne de commande et programme en ligne de commande

Message par cage »

Bonsoir,
Est-ce ce que tu cherches a obtenir ?

Code : Tout sélectionner

EnableExplicit

OnErrorGoto(?ErrorHandler)

; Exemple: ffmpeg -i input.wav -vn -ar 44100 -ac 2 -b:a 192k output.mp3

Global infile$  = "input.wav"

Global outfile$ = "output.mp3"

Global options$ = "-v quiet"

Procedure convert()
  RunProgram("cmd.exe", "/c ffmpeg.exe " + options$ + " -i "+ infile$ + " -vn -ar 44100 -ac 2 -b:a 192k " + outfile$ + " < yes.txt", #Empty$, #PB_Program_Wait)
EndProcedure

If OpenConsole()
  
  ConsoleTitle("Exemple avec FFMPEG")
  
  PrintN("")
  
  convert()
  
  PrintN("") : PrintN("") : Print("Appuyez sur Q pour (Q)uitter ")
  
  Repeat
    Delay(20)
  Until UCase(Inkey()) = "Q"
EndIf

CloseConsole()
  
ErrorHandler:

End

; Valid loglevel "-v". Possible levels are numbers Or:
; "quiet"
; "panic"
; "fatal"
; "error"
; "warning"
; "info"
; "verbose"
; "debug"
; "trace"

; Global options (affect whole program instead of just one file):
; -y                  overwrite output files
; -n                  never overwrite output files
La partie (+ " < yes.txt") peut-être remplacée par l'option -y a insérer dans la variable option$

Code : Tout sélectionner

Global options$ = "-v quiet -y"
Dans ce cas, aucun message n'est affiché dans la console sauf a changer l'option (-v quiet)
cage
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Marc56
Messages : 2007
Inscription : sam. 08/févr./2014 15:19

Re: Programme en ligne de commande et programme en ligne de commande

Message par Marc56 »

le programme que je cherche à écrire c'est pour faire des conversions audio/vidéo toute bête mais j'aimerais le retour dans mon programme, pas que ça s'ouvre salement en dehors
Si tu n'as pas besoin d'interagir en cours de conversion, alors tu peux générer le log et analyser ce dernier.
C'est un moyen plus fiable que d'essayer de capter le contenu de la console qui peut être différent selon le code page de cette dernière et qui peut être refermé par un autre programme. C'est comme cela qu'on procède le souvent en administration système.
Petit example (testé) qui lance une conversion puis cherche "successfully decoded" dans le log.
(Il suffit d'utiliser FindString ou les RegEx sur la variable Txt$ pour extraire ce qu'on veut)

Code : Tout sélectionner

; Récupération et analyse log ffmpeg.exe
; (C)Marc56 - 2022/06/15
; https://www.purebasic.fr/french/viewtopic.php?t=18686

EnableExplicit

Enumeration     
    #Win
    #Edit
EndEnumeration

SetGadgetFont(#PB_Default, FontID(LoadFont(#PB_Any, "Consolas", 10)))

OpenWindow(#Win, 100, 100, 800, 600, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
CreateStatusBar(0, WindowID(#Win))
AddStatusBarField(#PB_Ignore)
StatusBarText(0, 0, "")
EditorGadget(#Edit, 5, 5, WindowWidth(#Win) - 10, WindowHeight(#Win) - StatusBarHeight(0) - 10)

StatusBarText(0, 0, "Conversion en Cours. Veuillez Patienter...")
; --- Donner un nom fixe au fichier de log 
; (sinon il est horodaté HHMMSS ce qui rend difficile la relecture)
; voir aide ffmpeg.exe https://ffmpeg.org/ffmpeg.html
; chercher -report
SetEnvironmentVariable("FFREPORT", "file=ffreport.log")
; --- Convertir
RunProgram("ffmpeg", 
           "-i input.wav -vn -ar 44100 -ac 2 -b:a 192k output.mp3 -report -y", 
           "C:\Tmp",
           #PB_Program_Hide | #PB_Program_Wait)
StatusBarText(0, 0, "Conversion Terminée. Chargement fichier de Log")

; --- Lecture Log
If Not OpenFile(0, "C:\Tmp\ffreport.log")
     Debug "Fichier non chargé" : End
EndIf
While Not Eof(0)
     Define Txt$ = ReadString(0, #PB_Ascii | #PB_File_IgnoreEOL)
Wend
CloseFile(0)
SetGadgetText(#Edit, Txt$)

; --- Analyse du log (exemple)
If FindString(Txt$, "successfully decoded")
    StatusBarText(0, 0, "Succès !")
Else
    StatusBarText(0, 0, "Erreur")
EndIf

Repeat 
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
            End
            
        Case #PB_Event_SizeWindow
            ResizeWindow(#Win,  #PB_Ignore, #PB_Ignore, WindowWidth(#Win),      WindowHeight(#Win)     )
            ResizeGadget(#Edit, #PB_Ignore, #PB_Ignore, WindowWidth(#Win) - 10, WindowHeight(#Win) - 32)
            
        Case #PB_Event_Gadget
            Select EventGadget()
            EndSelect
    EndSelect
ForEver

End
- Il faut ajouter une variable d'environnement, sinon le log à un nom horodaté et cela rend difficile la relecture (il faudrait chercher le plus récent dans le répertoire)
- Comme ffmpeg.exe est lancé avec #PB_Program_Hide, il n'ouvre pas de fenêtre.
- Pas besoin de CMD /C ou /K ici puisqu'on n'a pas d'interaction avec le shell et que ffmpeg n'est pas une commande interne.
:wink:
PB Latest version - Win 10 family x64 - Linux Debian, Slackware (VirtualBox & WSL) / W10 - Raspberry Raspbian
Intel i7-8700 CPU @ 3.20GHz - 48 GB - Nvidia RTX 3050 OC 8GB - Asus VP348 3440 x 1440 - DPI 100%
Avatar de l’utilisateur
cage
Messages : 366
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Programme en ligne de commande et programme en ligne de commande

Message par cage »

Bonjour,
Bataille de point de vue, mais je ne fais qu'essayer de répondre a la question:
J'ai écris plusieurs programmes fonctionnant en mode console. Dans ces programme, je fais appel de temps en temps à des programmes externes (FFMPEG par exemple mais le soucis se produit avec tous les programmes que j'ai pu tester) et au lieu d'avoir le retour dans le même invite de commande, une nouvelle fenêtre s'ouvre et bien sûr ces fenêtres se ferment à la fin de leurs exécutions et je perd le retour de ces programmes (pas simple quand le retour est indispensable à la suite du programme ...)

Ma question est simple : pourquoi les programmes externes ne s'affichent pas dans le même invite de commande que mon programme laçant ces derniers ? Il y a t-il un moyen de forcer la chose ?

Pour information, j'ai testé mes programmes avec la console graphique (avec le paramètre EnableGraphicalConsole) et aussi sans. J'ai testé divers options de compilation mais sans succès

Merci de m'aider à trouver la solution permettant d'exécuter mes programmes externe "proprement" ^^
Je note que NY152 parle de mode Console, alors je le laisse réponde sur sa vraie demande et ses vrais besoins. Toutes les solutions sont bonnes a condition de réponde au mieux a la demande.
cage
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Re: Programme en ligne de commande et programme en ligne de commande

Message par NY152 »

cage a écrit : mer. 15/juin/2022 22:59 Bonsoir,
Est-ce ce que tu cherches a obtenir ?

Code : Tout sélectionner

EnableExplicit

OnErrorGoto(?ErrorHandler)

; Exemple: ffmpeg -i input.wav -vn -ar 44100 -ac 2 -b:a 192k output.mp3

Global infile$  = "input.wav"

Global outfile$ = "output.mp3"

Global options$ = "-v quiet"

Procedure convert()
  RunProgram("cmd.exe", "/c ffmpeg.exe " + options$ + " -i "+ infile$ + " -vn -ar 44100 -ac 2 -b:a 192k " + outfile$ + " < yes.txt", #Empty$, #PB_Program_Wait)
EndProcedure

If OpenConsole()
  
  ConsoleTitle("Exemple avec FFMPEG")
  
  PrintN("")
  
  convert()
  
  PrintN("") : PrintN("") : Print("Appuyez sur Q pour (Q)uitter ")
  
  Repeat
    Delay(20)
  Until UCase(Inkey()) = "Q"
EndIf

CloseConsole()
  
ErrorHandler:

End

; Valid loglevel "-v". Possible levels are numbers Or:
; "quiet"
; "panic"
; "fatal"
; "error"
; "warning"
; "info"
; "verbose"
; "debug"
; "trace"

; Global options (affect whole program instead of just one file):
; -y                  overwrite output files
; -n                  never overwrite output files
La partie (+ " < yes.txt") peut-être remplacée par l'option -y a insérer dans la variable option$

Code : Tout sélectionner

Global options$ = "-v quiet -y"
Dans ce cas, aucun message n'est affiché dans la console sauf a changer l'option (-v quiet)
cage
L'idée est bonne mais j'y ai déjà répondu, utiliser les entrées utilisateurs pour l'écrasement du fichier n'est un détail, pourquoi bloquer dessus ^^ Oublions ce détail. Je mettais le doigt dessus car comme le programme appelé ne l'ai pas dans la console active, c'est pas top pour répondre et si le programme appelé se ferme tout de suite derrière, on perd la fenêtre et son contenu, l'utilisateur n'a pas l'info donc ...

Ma recherche principale est d'avoir l'affichage du programme appelé au sein du mien (si en plus on peut répondre aux demandes ...) mais ces programme s'ouvre dans une fenêtre secondaire

Bref, je cherche encore ...
cage a écrit : mer. 15/juin/2022 22:59 Bonsoir,
Est-ce ce que tu cherches a obtenir ?

Code : Tout sélectionner

EnableExplicit

OnErrorGoto(?ErrorHandler)

; Exemple: ffmpeg -i input.wav -vn -ar 44100 -ac 2 -b:a 192k output.mp3

Global infile$  = "input.wav"

Global outfile$ = "output.mp3"

Global options$ = "-v quiet"

Procedure convert()
  RunProgram("cmd.exe", "/c ffmpeg.exe " + options$ + " -i "+ infile$ + " -vn -ar 44100 -ac 2 -b:a 192k " + outfile$ + " < yes.txt", #Empty$, #PB_Program_Wait)
EndProcedure

If OpenConsole()
  
  ConsoleTitle("Exemple avec FFMPEG")
  
  PrintN("")
  
  convert()
  
  PrintN("") : PrintN("") : Print("Appuyez sur Q pour (Q)uitter ")
  
  Repeat
    Delay(20)
  Until UCase(Inkey()) = "Q"
EndIf

CloseConsole()
  
ErrorHandler:

End

; Valid loglevel "-v". Possible levels are numbers Or:
; "quiet"
; "panic"
; "fatal"
; "error"
; "warning"
; "info"
; "verbose"
; "debug"
; "trace"

; Global options (affect whole program instead of just one file):
; -y                  overwrite output files
; -n                  never overwrite output files
La partie (+ " < yes.txt") peut-être remplacée par l'option -y a insérer dans la variable option$

Code : Tout sélectionner

Global options$ = "-v quiet -y"
Dans ce cas, aucun message n'est affiché dans la console sauf a changer l'option (-v quiet)
cage
Bel exemple qui me resservira pour un petit outil que je compte écrire pour mon serveur web de dev ^^
.:NY152:.
Répondre