web-dev-qa-db-fra.com

Windows: ligne de commande pour lire les informations de version d'un fichier exécutable?

Windows a-t-il un exécutable que je peux exécuter dans la commande Shell qui renvoie le numéro de version d'un fichier exécutable (.exe)?

Je vois beaucoup de questions qui montrent comment le faire à partir de différentes langues et des références à des logiciels tiers pour l'écrire, mais je ne trouve pas de commande Shell simple pour le faire. Points supplémentaires si je n'ai pas besoin d'installer quoi que ce soit.

Il doit être exécuté en tant qu'utilisateur normal. Pas administrateur.

15
neves
wmic datafile where name="C:\\Windows\\System32\\msiexec.exe" get Version /value 

Vous pouvez utiliser wmic pour le faire. Et vous pouvez l'envelopper dans un fichier batch

@echo off
    setlocal enableextensions

    set "file=%~1"
    if not defined file goto :eof
    if not exist "%file%" goto :eof

    set "vers="
    FOR /F "tokens=2 delims==" %%a in ('
        wmic datafile where name^="%file:\=\\%" get Version /value 
    ') do set "vers=%%a"

    echo(%file% = %vers% 

    endlocal

Enregistrez-le sous (exemple) getVersion.cmd et appelez comme getVersion.cmd "c:\windows\system32\msiexec.exe"

édité pour s'adapter aux commentaires et ne pas nécessiter de droits d'administrateur. Dans ce cas, un fichier hybride cmd/javascript est utilisé pour interroger wmi. Même usage

@if (@this==@isBatch) @then
@echo off
    setlocal enableextensions

    set "file=%~f1"
    if not exist "%file%" goto :eof

    cscript //nologo //e:jscript "%~f0" /file:"%file%"

    endlocal

    exit /b
@end
    var file = WScript.Arguments.Named.Item('file').replace(/\\/g,'\\\\');
    var wmi = GetObject('winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2')
    var files = new Enumerator(wmi.ExecQuery('Select Version from CIM_datafile where name=\''+file+'\'')) 

    while (!files.atEnd()){
        WScript.StdOut.WriteLine(files.item().Version);
        files.moveNext();
    };
    WScript.Quit(0)
24
MC ND

Si vous souhaitez et pouvez utiliser PowerShell ...

(get-item -Path 'C:\Program Files\Java\jdk1.8.0_144\bin\Java.exe').VersionInfo |
    Format-List -Force

Si vous devez l'exécuter dans un shell cmd.exe, vous pouvez utiliser:

powershell -NoLogo -NoProfile -Command ^
    (get-item -Path 'C:\Program Files\Java\jdk1.8.0_152\bin\Java.exe').VersionInfo ^| ^
        Format-List -Force
10
lit
set EXE='c:\firefox\firefox.exe'
powershell "(Get-Item -path %EXE%).VersionInfo.ProductVersion"
5
bviktor

Cela vous donnera uniquement la version du fichier:

wmic datafile where name='c:\\windows\\system32\\notepad.exe' get version

Résultat:

Version
6.1.7601.18917
3
MrCalvin

et à sens unique avec makecab:

; @echo off
;;goto :end_help
;;setlocal DsiableDelayedExpansion
;;;
;;;
;;; fileinf /l list of full file paths separated with ;
;;; fileinf /f text file with a list of files to be processed ( one on each line )
;;; fileinf /? prints the help
;;;
;;:end_help

; REM Creating a Newline variable (the two blank lines are required!)
; set NLM=^


; set NL=^^^%NLM%%NLM%^%NLM%%NLM%
; if "%~1" equ "/?" type "%~f0" | find ";;;" | find /v "find" && exit /b 0
; if "%~2" equ "" type "%~f0" | find ";;;" | find /v "find" && exit /b 0
; setlocal enableDelayedExpansion
; if "%~1" equ "/l" (
;  set "_files=%~2"
;  echo !_files:;=%NL%!>"%TEMP%\file.paths"
;  set _process_file="%TEMP%\file.paths"
;  goto :get_info
; )

; if "%~1" equ "/f" if exist "%~2" (
;  set _process_file="%~2"
;  goto :get_info
; )

; echo incorect parameters & exit /b 1
; :get_info
; set "file_info="

; makecab /d InfFileName=%TEMP%\file.inf /d "DiskDirectory1=%TEMP%" /f "%~f0"  /f %_process_file% /v0>nul

; for /f "usebackq skip=4 delims=" %%f in ("%TEMP%\file.inf") do (
;  set "file_info=%%f"
;  echo !file_info:,=%nl%!
; )

; endlocal
;endlocal
; del /q /f %TEMP%\file.inf 2>nul
; del /q /f %TEMP%\file.path 2>nul
; exit /b 0

.set DoNotCopyFiles=on
.set DestinationDir=;
.set RptFileName=nul
.set InfFooter=;
.set InfHeader=;
.Set ChecksumWidth=8
.Set InfDiskLineFormat=;
.Set Cabinet=off
.Set Compress=off
.Set GenerateInf=ON
.Set InfDiskHeader=;
.Set InfFileHeader=;
.set InfCabinetHeader=;
.Set InfFileLineFormat=",file:*file*,date:*date*,size:*size*,csum:*csum*,time:*time*,vern:*ver*,vers:*vers*,lang:*lang*"

exemple de sortie (il a une version chaîne qui est un petit ajout à la méthode wmic :)):

c:> fileinfo.bat /l C:\install.exe
    file:install.exe
    date:11/07/07
    size:562688
    csum:380ef239
    time:07:03:18a
    vern:9.0.21022.8
    vers:9.0.21022.8 built by: RTM
    lang:1033

vous pouvez également jeter un œil à tooltipinfo.bat

3
npocmaka