Version application

Besoin d’un matin ô combien pluvieux (donc studieux), fonction qui retourne la version d’une application, macOS seulement. Pas le courage de lancer windows, mais si une bonne volonté se sent de compléter, une piste :
http://stackoverflow.com/questions/25648155/windows-command-line-to-read-version-info-of-an-executable-file
<code 4D>
//Fs_appVersionGet (appPath_t) -> txt
//retourne la version de l’application
//MacOS seulement
C_TEXTE($0)
C_TEXTE($1)

C_ENTIER LONG($platform_l)
C_TEXTE($commande_t)
C_TEXTE($error_t)
C_TEXTE($in_t)
C_TEXTE($path_t)
C_TEXTE($quot_t)
C_TEXTE($rx_t)
C_TEXTE($out_t)

Si (Faux)
C_TEXTE(Fs_appVersionGet ;$0)
C_TEXTE(Fs_appVersionGet ;$1)
Fin de si
//_
ASSERT(Nombre de parametres>0;Nom methode courante+" $1 missing")
$path_t:=$1
PROPRIETES PLATE FORME($platform_l)
ASSERT($platform_l=Mac OS)
ASSERT(Trouver regex("\.app$";$path_t;1))
ASSERT(Tester chemin acces($path_t)=Est un répertoire)

$path_t:=Convertir chemin systeme vers POSIX($path_t)
$quot_t:="""
$commande_t:=“mdls -name kMDItemVersion “+$quot_t+$path_t+$quot_t
LANCER PROCESS EXTERNE($commande_t;$in_t;$out_t;$error_t)
//exemples de réponses :
// kMDItemVersion = “53.0”
// kMDItemVersion = “1.67 (1.40.27.00.00)”
// kMDItemVersion = “(null)[char10]”
Si ($error_t=””)
$rx_t:=“kMDItemVersion = “(.*)”” //capture between quotes
TABLEAU ENTIER LONG($pos_al;0x0000)
TABLEAU ENTIER LONG($len_al;0x0000)
Au cas ou
: (Trouver regex($rx_t;$out_t;1;$pos_al;$len_al))
$out_t:=Sous chaine($out_t;$pos_al{1};$len_al{1})
: (Position("(null)";$out_t)>0)
$out_t:=“null”
Sinon
$out_t:=“not found”
Fin de cas
Sinon
$out_t:=$error_t
Fin de si
$0:=$out_t
//_
</code 4D>

Exemple, lire la version des applications du 1er niveau du dossier Applications :
<code 4D>
$appFolder_t:=Dossier systeme(Applications ou Program Files)
TABLEAU TEXTE($doc_at;0)
LISTE DES DOSSIERS($appFolder_t;$doc_at)
Boucle ($i_l;1;Taille tableau($doc_at))
$path_t:=$appFolder_t+$doc_at{$i_l}
Si (Trouver regex("\.app$";$path_t;1))
$version_t:=Fs_appVersionGet ($path_t)
$doc_at{$i_l}:=$doc_at{$i_l}+"\t"+$version_t
Fin de si
Fin de boucle
FIXER TEXTE DANS CONTENEUR(Str_implode (->$doc_at;"\r")) //prêt à coller…
</code 4D>

Bonjour

Je me suis déjà penché sur ce problème, et, il y a des cas ou “mdls -name kMDItemVersion” ne retourne pas de n° de version bien que dans l’appli la fenêtre “A propos de…” en donne bien un.

Dans ce cas, le Finder ne donne pas de n° de version non plus, mais un finder alternatif comme “Path Finder” si :roll:

Pourquoi?? Appli ne respectant certaines règles???

Alors j’ai choisi une autre approche qui retourne un résultat également pour les cas ou “mdls” restait muet pour récupérer le n° de version:

<code 4D>

            $cmd:="defaults read '"+$path+"/Contents/info.plist' CFBundleShortVersionString"
	LANCER PROCESS EXTERNE($cmd;$inn;$vers)
	  // si pas de résultat avec CFBundleShortVersionString, on tente sa chance
	  // avec CFBundleVersion
	Si ($vers="")
		$cmd:="defaults read '"+$path+"/Contents/info.plist' CFBundleVersion"
		LANCER PROCESS EXTERNE($cmd;$inn;$vers)
	Fin de si 
	  // si pas de résultat avec CFBundleVersion, on tente sa chance
	  // avec CFBundleGetInfoString
	Si ($vers="")
		$cmd:="defaults read '"+$path+"/Contents/info.plist' CFBundleGetInfoString"
		LANCER PROCESS EXTERNE($cmd;$inn;$vers)
	Fin de si 

</code 4D>

ou $path est bien sur le chemin complet de l’appli.

Un exemple d’aplli ou ce problème existe:
iBackup qui est le côté Mac d’une appli iPhone de gestion de mots de passe.

http://www.iaccountsapp.com/site/iBackup.htm

Merci, Gilbert.
À dire vrai, comme l’application dont je veux le numéro de version “répond” bien, j’ai ignoré les autres :oops:
J’ai des cas où kMDItemVersion n’est pas muet mais renvoie “null” : cela correspond à un des cas que tu as dû contourner ?

Oui, tout à fait.

J’avais commencé avec kMDItenVersion mais j’ai rapidement eu la “chance” de tomber sur un (des cas? je ne sais plus très bien) cas ou il renvoyait “null”.

Mais c’est sur ça existe, la preuve l’appli citée en exemple :mrgreen:

Bonjour,

Sinon, vous pouvez utiliser la méthode partagée de 4D_Info_Report qui fait cela depuis des années :

aa4D_M_Get_Build_4D_Text_call (page 4 de la documentation en anglais).

il y a deux paramètres optionnels :
Le premier est un pointeur vers une variable Texte qui recevra le résultat
(si non utilisé, affichera le résultat dans une alerte)

Le second est un pointeur vers une variable Texte contenant le chemin d’accès vers l’application.
(si non utilisé, vous demandera de naviguer dans vos dossier pour sélectionner l’application .app ou .exe, ou directement l’info.plist)

<code 4D>
TABLEAU TEXTE($at_Components;0)
LISTE COMPOSANTS($at_Components)
Si(Chercher dans tableau($at_Components;“4D_Info_Report@”)>0)
C_TEXTE($vt_Infos;$vt_PathApp)
Si(Vrai) // recuperation des infos sur l’application courante
$vt_PathApp:= Fichier application
EXECUTER METHODE(“aa4D_M_Get_Build_4D_Text_call”;;->$vt_Infos;->$vt_PathApp)
Sinon
EXECUTER METHODE(“aa4D_M_Get_Build_4D_Text_call”;
;->$vt_Infos)
Fin de si
ALERTE($vt_Infos)
// Faire le tri de ce que vous voulez récupérer dans $vt_Infos.
Fin de si
</code 4D>

Fonctionne sous macOS et Windows, et permet aussi d’avoir la combinaison de la version de 4D et de la version de l’application générée sous Windows pour monAppli4D.exe par exemple.

Pratique quand vous devez vérifier une application 4D Windows en environnement macOS.

Vous pouvez tester cela en ouvrant directement le composant :
Dans le menu Fichier, sélectionnez “Show version and build”,
et sélectionnez l’application .app ou .exe sous Windows.

Cordialement,
Thomas S.

: Thomas SCHLUMBERGER

Vous pouvez tester cela en ouvrant directement le composant :
Dans le menu Fichier, sélectionnez “Show version and build”,
et sélectionnez l’application .app ou .exe sous Windows.

Cordialement,
Thomas S.
je viens d’essayer cela sur macOS 10.12.4 avec la version:
4D_Info_Report v4.9rZ (33) for 4D v16

sous 4D v16.1 build 16.210980 (32bit)

Je n’arrive pas à selectionner les .app :?: :!:

Que fais-je de mal ?

Bonjour Thomas,
merci de l’info. Tant qu’à faire, je me dis que mettre ladite méthode en zone de partage de code, ce serait pas mal, non ? On n’a pas nécessairement besoin de tout le mur, parfois juste d’une brique…

Bonjour Manuel,

: Manuel PIQUET

je viens d’essayer cela sur macOS 10.12.4 avec la version:
4D_Info_Report v4.9rZ (33) for 4D v16

sous 4D v16.1 build 16.210980 (32bit)

Je n’arrive pas à selectionner les .app

Oops, il y a vraiment un bogue dans le composant, quand on a passe une liste d’extensions dans Selectionner document sous macOS… :oops:

Nous allons essayer de faire une mise à jour des versions demain (avec juste la date modifiée) dans TAOW pour corriger ce problème.

Cordialement,
Thomas S.

Bonjour,

La version du composant pour 4.9rZ pour 4D v16 a été mise à jour sur TAOW :
https://taow.4d.com/Tool-4D-Info-Report/PS.1938271.fr.html
(modifié aussi : la version publique v16.1 est identifiée).

Pour distinguer avec la version originale v16 du composant, la date est passée au 10 mai.

Note: Le problème de sélection d’une application sous macOS ne se posant pas avec les version du composant pour v15, v14 ou plus ancienne, ces versions n’ont pas été modifiée.

Cordialement,

Thomas Schlumberger

Merci cela fonctionne à présent :slight_smile: