Script pour Vérifier la version d'un .exe

Résolu
adgm1 Messages postés 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 - 3 juin 2023 à 16:27
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 - 18 juin 2023 à 13:22

bonjour

je cherche à créer un batch d'installation de programme sur postes clients via GPO. 

Mes étapes sont les suivantes : vérifier si l'.exe existe déjà, s'il existe vérifier sa version pour savoir s'il faut ou pas installer une autre version, sinon installer la version demandée

Voici comment se présente mon script pour VEYON par ex, qui pour l'instant ne fonctionne pas :

if exist "%programfiles%\veyon\veyon-cli.exe" goto CHECK else goto CONTINUE

:CHECK
for /f "usebackq delims=" %%a in ('"wmic datafile where name='c:\\program files\\veyon\\veyon-cli.exe' get version /format:Textvaluelist"') do set "%version%"
)

if "%version%" eq "4.7.3.0" goto END else goto CONTINUE

:CONTINUE
"%~dp0veyon-4.7.3.0-win64-setup.exe" /S /NoMaster /NoStartMenuFolder /ApplyConfig=%~dp0configuration_pceleve.json

"%programfiles%\veyon\veyon-cli.exe" authkeys import master/public %~dp0master_public_key.pem

"%programfiles%\veyon\veyon-cli.exe" authkeys import master/private %~dp0master_private_key.pem

:END
exit
A voir également:

4 réponses

barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
Modifié le 4 juin 2023 à 12:00

Bonjour,

Personnellement j'aurais fait plutôt comme ça :

@echo off

set "app=%programfiles%\veyon\veyon-cli.exe"

if not exist "%app%" (exit /b 1)

call :CHECK "4.7.3.0" || (
	"%~dp0veyon-4.7.3.0-win64-setup.exe" /S /NoMaster /NoStartMenuFolder /ApplyConfig=%~dp0configuration_pceleve.json
	"%app%" authkeys import master/public %~dp0master_public_key.pem
	"%app%" authkeys import master/private %~dp0master_private_key.pem
)

pause
exit

:CHECK
set "version="
for /f "skip=2 delims=" %%A in ('"wmic datafile where name='%app:\=\\%' get version /format:list"') do if not defined version set %%A
)
echo Version installée : %version%

if "%version%"==%1 (exit /b 0) else (exit /b 1)

1
adgm1 Messages postés 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 10
4 juin 2023 à 13:06

merci beaucoup. cette methode marche bien en effet c'est une autre manière d'y arriver et c'est plus épuré !!

Voici ce que j'avais conçu en m'inspirant d'autres forum qui consiste à appeler des commandes pour changer \ en \\ puis chercher la version de l'appli et enfin la comparer à ce que je veux installer.

@echo off

Set "Application=C:\Program Files\veyon\veyon-cli.exe"

Call :Add_backSlash "%Application%"

Call :GetVersion %Application% Version

echo La version de l'application est : %Version%

if "%Version%" EQU "4.7.3.0" goto END else goto CONTINUE

:CONTINUE
"\\srv-dc1\applications$\veyon\veyon-4.7.3.0-win64-setup.exe" /S /NoMaster /NoStartMenuFolder /ApplyConfig=\\srv-dc1\applications$\veyon\configuration_pceleve.json
"C:\Program Files\veyon\veyon-cli.exe" authkeys import master/public \\srv-dc1\applications$\veyon\master_public_key.pem
"C:\Program Files\veyon\veyon-cli.exe" authkeys import master/private \\srv-dc1\applications$\veyon\master_private_key.pem
exit

:END
exit


:GetVersion <ApplicationPath> <Version>
FOR /F "tokens=2 delims==" %%I IN (
  'wmic datafile where "name='%~1'" get version /format:Textvaluelist'
) DO FOR /F "delims=" %%A IN ("%%I") DO SET "%2=%%A"
Exit /b

:Add_backSlash <String>
Set "Application=%1"
Set "String=\"
Set "NewString=\\"
Call Set "Application=%%Application:%String%=%NewString%%%"
Exit /b

0
adgm1 Messages postés 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 10
17 juin 2023 à 01:53

salut. En fait je me rend compte que le script proposé ne se lance pas. N'y a t il pas une erreur dans les commande? le pause suivi de exit est il normal? et la parenthèse ligne 19?

j'avais cru que c'était ok ce format condensé mais là il fonctionne plus et je suis pas sur de comprendre ce qu'il fait. 

if not exist %app% (exit /b 1) >> pourquoi quitter le script si le logiciel n'existe pas. il faudrait plutôt lancer les commandes d'installation dans ce ca, non?

Pourquoi y a til un call :CHECK et un :CHECK ? Quelle difference entre les 2?

merci

0
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
Modifié le 17 juin 2023 à 06:39

Le "pause" suivi du "exit" n'est pas nécessaire, il est utile uniquement lors des tests.

Effectivement c'est un oubli de ma part, le "if not exist" devrait lancer les commandes d'installation.

:CHECK est une fonction et call :CHECK c'est l'appel à la fonction

.

Si je corrige vite fait mon code ça devrait donner quelque chose comme ça :

@echo off

set "app=%programfiles%\veyon\veyon-cli.exe"
if not exist "%app%" (call :INSTALL)
call :CHECK "4.7.3.0" || call :INSTALL

exit

:CHECK
set "version="
for /f "skip=2 delims=" %%A in ('"wmic datafile where name='%app:\=\\%' get version /format:list"') do if not defined version set %%A
echo Version installée : %version%
if "%version%"==%1 (exit /b 0) else (exit /b 1)

:INSTALL
"%~dp0veyon-4.7.3.0-win64-setup.exe" /S /NoMaster /NoStartMenuFolder /ApplyConfig=%~dp0configuration_pceleve.json
"%app%" authkeys import master/public %~dp0master_public_key.pem
"%app%" authkeys import master/private %~dp0master_private_key.pem
goto :eof
0
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908 > barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024
17 juin 2023 à 06:37

Ce script est valable pour l'installation d'un seul logiciel, mais si tu as plusieurs logiciels à installer j'ai un autre script mieux adapté.

0
adgm1 Messages postés 255 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 9 avril 2024 10
17 juin 2023 à 19:26

cela fonctionne bien désormais , c'est nickel merci. Juste pour etre sur, ce batch ne prend pas en compte la hierarchie des versions c'est bien ça? C'est a dire que si dans mon check j'indique une version 2.1.3 mais que sur le poste il ya une version plus récente type 2.2.0, alors il va rétrograder vers la version indiquée = 2.1.3. Et bien sur idem si la version est plus ancienne.

J'ai en effet plusieurs programme à installer via GPO, quelle est ta méthode dans cette situation? Car pour l'instant je fais 1GPO par logiciel, c'est à la fois pas pratique mais ca peut aussi etre utile pour les classer

0
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
Modifié le 18 juin 2023 à 13:22

Non ce batch ne prend pas en compte la hiérarchie des versions.

.

Voilà une autre version plus pointue qui permet d'installer plusieurs applications (3 en l'occurrence mais on peut en rajouter autant qu'on veut) et qui prend en compte la version la plus récente :

@echo off
setlocal enableextensions enabledelayedexpansion
ver | find "10.0." >nul && chcp 65001 >nul || chcp 28591 >nul
color 0A

: -------------------------------------------------------------------------------------------------------------------------
: on définit les exécutables et les versions
: -------------------------------------------------------------------------------------------------------------------------

set "App1=C:\Windows\System32\7za.exe#22.1.0.0"
set "App2=%ProgramFiles%\VideoLAN\VLC\vlc.exe#3.0.17.4"
set "App3=%ProgramFiles%\PuTTY\putty.exe#0.77.0.0"

: -------------------------------------------------------------------------------------------------------------------------
: on traite les exécutables un par un
: -------------------------------------------------------------------------------------------------------------------------

for /L %%A in (1,1,100) do (
	if defined App%%A (
		for /f "tokens=1,2 delims=#" %%E in ("!App%%A!") do (
			echo. & echo ############# %%E
			if not exist "%%~E" (call :installApp%%A)
			call :check "%%~E" "%%F" && call :installApp%%A
		)
	)
)

echo. & pause
exit

: -------------------------------------------------------------------------------------------------------------------------
: on vérifie si l'exécutable a besoin d'une mise à niveau
: -------------------------------------------------------------------------------------------------------------------------

:check

set "versionInstallee="
set "application=%~1"

for /f "skip=2 tokens=2 delims=^=" %%A in ('"wmic datafile where name='%application:\=\\%' get version /format:list"') do (
	if not defined versionInstallee set "versionInstallee=%%A"
)

echo.
echo Version installée : !versionInstallee!
echo Dernière version  : %~2

set "versionDisponible=%~2"
set "versionDisponible=!versionDisponible:.= !"

call :parsing !versionDisponible! || exit /b 1

echo.
echo ^>^>^>^>^> Une mise à niveau est requise ^<^<^<^<^<
echo.
				
exit /b 0

: -------------------------------------------------------------------------------------------------------------------------
: on découpe le numéro de version en plusieurs digits
: -------------------------------------------------------------------------------------------------------------------------

:parsing

set /a index=0

for %%A in (%*) do (
	set /a index+=1
	set /a digitVD=%%A
	call :compare !versionInstallee:.= ! && exit /b 0
)

exit /b 1

: -------------------------------------------------------------------------------------------------------------------------
: on compare un digit avec un autre
: -------------------------------------------------------------------------------------------------------------------------

:compare

for /L %%A in (1,1,!index!) do if %%A GTR 1 (shift)
if "%1"=="" (exit /b 0)
if !digitVD! GTR %1 (exit /b 0) else (exit /b 1)

: -------------------------------------------------------------------------------------------------------------------------
: on procède à la mise à niveau de l'exécutable concerné
: -------------------------------------------------------------------------------------------------------------------------

:installApp1
"%~dp0veyon-4.7.3.0-win64-setup.exe" /S /NoMaster /NoStartMenuFolder /ApplyConfig=%~dp0configuration_pceleve.json
"%%E" authkeys import master/public %~dp0master_public_key.pem
"%%E" authkeys import master/private %~dp0master_private_key.pem
goto :eof

:installApp2
echo Installation de App2
goto :eof

:installApp3
echo Installation de App3
goto :eof

1