How do I retrieve the version of a file from a batch file on Windows Vista?

前端 未结 7 1128
傲寒
傲寒 2020-12-05 14:39

Binary files have a version embedded in them - easy to display in Windows Explorer.

\"alt

How can I re

7条回答
  •  感情败类
    2020-12-05 15:33

    and three ways without external tools

    1.WMIC

    WMIC DATAFILE WHERE name="C:\\install.exe" get Version /format:Textvaluelist
    

    Pay attention to the double slashes of file name.

    Ready to use script:

    @echo off
    :wmicVersion pathToBinary [variableToSaveTo]
    setlocal
    set "item=%~1"
    set "item=%item:\=\\%"
    
    
    for /f "usebackq delims=" %%a in (`"WMIC DATAFILE WHERE name='%item%' get Version /format:Textvaluelist"`) do (
        for /f "delims=" %%# in ("%%a") do set "%%#"
    )
    
    if "%~2" neq "" (
        endlocal & (
            echo %version%
            set %~2=%version%
        )
    ) else (
        echo %version%
    )
    

    2.MAKECAB as the WMIC is not installed on home versions of windows here's a way with makecab that will run on every windows machine:

    ; @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*"
    

    example output (it has a string version which is a small addition to wmic method :) ):

    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
    

    3 Using shell.application and hybrid batch\jscript.Here's tooptipInfo.bat :

    @if (@X)==(@Y) @end /* JScript comment
        @echo off
    
        rem :: the first argument is the script name as it will be used for proper help message
        cscript //E:JScript //nologo "%~f0" %*
    
        exit /b %errorlevel%
    
    @if (@X)==(@Y) @end JScript comment */
    
    ////// 
    FSOObj = new ActiveXObject("Scripting.FileSystemObject");
    var ARGS = WScript.Arguments;
    if (ARGS.Length < 1 ) {
     WScript.Echo("No file passed");
     WScript.Quit(1);
    }
    var filename=ARGS.Item(0);
    var objShell=new ActiveXObject("Shell.Application");
    /////
    
    
    //fso
    ExistsItem = function (path) {
        return FSOObj.FolderExists(path)||FSOObj.FileExists(path);
    }
    
    getFullPath = function (path) {
        return FSOObj.GetAbsolutePathName(path);
    }
    //
    
    //paths
    getParent = function(path){
        var splitted=path.split("\\");
        var result="";
        for (var s=0;s

    used against cmd.exe :

    C:\Windows\System32\cmd.exe :
    File description: Windows Command Processor
    Company: Microsoft Corporation
    File version: 6.3.9600.16384
    Date created: ?22-?Aug-?13 ??13:03
    Size: 347 KB
    

提交回复
热议问题