6

Windows ha un eseguibile che posso eseguire nella shell dei comandi che restituisce il numero di versione di un file eseguibile (.exe)?Windows: riga di comando per leggere le informazioni sulla versione di un file eseguibile?

Vedo un sacco di domande che mostrano come farlo da lingue diverse e riferimenti a software di terze parti per scriverlo, ma non riesco a trovare un semplice comando shell per farlo. Punti aggiuntivi se non ho bisogno di installare nulla.

Deve essere eseguito come utente normale. Non amministratore

+0

possibile duplicato di [Strumento riga di comando per scaricare la versione DLL di Windows?] (Http://stackoverflow.com/questions/602802/command-line-tool-to-dump-windows-dll-version) –

risposta

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

È possibile utilizzare wmic per farlo. E si può avvolgerlo in un file 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 

Salva come (esempio) getVersion.cmd e chiamare come getVersion.cmd "c:\windows\system32\msiexec.exe"

modificato di adattarsi ai commenti e non richiede diritti di amministratore. In questo caso, un file ibrido cmd/javascript viene utilizzato per interrogare wmi. Stesso uso

@if (@[email protected]) @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) 
+0

Grande, ma purtroppo tu deve essere nel gruppo Administrator per eseguirlo :-(Ho bisogno di eseguirlo come mio utente di integrazione continua. – neves

+0

@neves, risposta aggiornata. –

2

e un modo con 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*" 

esempio uscita (ha una versione stringa che è una piccola aggiunta al metodo 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 

anche potete dare un'occhiata a tooltipinfo.bat

+0

+1, non ho mai utilizzato makecab per recuperare informazioni sui file. Bello. –

3

Se siete disposti e in grado di utilizzare PowerShell. ..

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

Se è necessario eseguire in una shell cmd.exe, è possibile utilizzare:

powershell -NoLogo -NoProfile -Command^
    (get-item -Path 'C:\Program Files\Java\jdk1.8.0_152\bin\java.exe').VersionInfo ^|^
     Format-List -Force 
0

Questo vi darà solo la versione del file:

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

Risultato:

Version 
6.1.7601.18917 
+0

Salve, le risposte di solo codice tendono ad essere contrassegnate per la moderazione. Potresti aggiungere una riga che spieghi cosa questo per favore? – stef

0
set EXE='c:\firefox\firefox.exe' 
powershell "(Get-Item -path %EXE%).VersionInfo.ProductVersion" 
+0

Mentre questa risposta solo in codice può rispondere alla domanda, si prega di aggiungere una spiegazione del motivo per cui lo fa. Ciò aiuterà i futuri utenti a valutare la risposta alla loro situazione. –

+0

"aggiungi una spiegazione del perché lo fa" Perché è progettato per farlo? Queste domande modello sono inutili. – bviktor