6

Hat Windows eine ausführbare Datei, die ich in der Befehlsshell ausführen kann, die die Versionsnummer einer ausführbaren Datei (.exe) zurückgibt?Windows: Befehlszeile zum Lesen der Versionsinformationen einer ausführbaren Datei?

Ich sehe viele Fragen, die zeigen, wie man es aus verschiedenen Sprachen macht, und Verweise auf Software von Drittanbietern, um es zu schreiben, aber ich kann keinen einfachen Shell-Befehl finden, um es zu tun. Zusätzliche Punkte, wenn ich nichts installieren muss.

Es muss als normaler Benutzer ausgeführt werden. Kein Administrator.

+0

möglich duplicate von [Kommandozeilen-Tool zum Dump Windows DLL-Version?] (Http://stackoverflow.com/questions/602802/command-line-tool-to-dump-windows-dll-version) –

Antwort

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

Sie können wmic verwenden, um es zu tun. Und Sie können es in einer Batch-Datei wickeln

@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 

speichern es als (Beispiel) getVersion.cmd und nennen als getVersion.cmd "c:\windows\system32\msiexec.exe"

editiert Kommentare anzupassen und keine Administratorrechte erforderlich sind. In diesem Fall wird eine hybride cmd/javascript-Datei verwendet, um wmi abzufragen. Gleiche Verwendung

@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

Großartig, aber leider Sie muss in der Administratorgruppe sein, um es auszuführen :-(Ich muss es als meine kontinuierliche Integration Benutzer ausführen. – neves

+0

@neves, Antwort aktualisiert. –

2

und ein Weg mit 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*" 

Beispiel Ausgabe (es hat eine String-Version, die eine kleine Ergänzung zu wmic Methode ist :)):

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 

auch Sie können sehen tooltipinfo.bat

+0

+1, ich habe nie Benutzer makecab, um Dateiinformationen abzurufen. Nett. –

3

Wenn Sie bereit und in der Lage sind, PowerShell zu verwenden. ..

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

Wenn Sie es in einer cmd.exe-Shell ausgeführt werden müssen, könnten Sie verwenden:

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

Diese Sie geben nur die Dateiversion:

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

Ergebnis:

Version 
6.1.7601.18917 
+0

Hallo, Code-Only-Antworten neigen dazu, für die Moderation gekennzeichnet zu werden. Könnten Sie bitte eine Zeile hinzufügen, die erklärt, was das bedeutet? – stef

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

Während diese reine Codeantwort die Frage beantworten kann, fügen Sie bitte eine Erklärung hinzu, warum dies der Fall ist. Dies wird zukünftigen Benutzern helfen, die Antwort auf ihre Situation zu bewerten. –

+0

"fügen Sie eine Erklärung, warum es so ist", weil es so konzipiert ist? Diese Vorlagenfragen sind sinnlos. – bviktor