2009-11-10 20 views
9

I file binari hanno una versione incorporata in essi - facile da visualizzare in Esplora risorse.Come posso recuperare la versione di un file da un file batch su Windows Vista?

alt text

Come posso recuperare che versione del file, da un file batch?

+0

Vedi http://stackoverflow.com/questions/602802/command-line- tool-to-dump-windows-dll-version – Helen

+0

Eventuali suggerimenti qui? [http://www.winvistatips.com/determine-version-exe-thru-batch-file-t284289.html](http://www.winvistatips.com/determine-version-exe-thru-batch-file -t284289.html) –

risposta

4

Penso che filever sia quello che ti serve. Può ottenere la versione del file per più elementi contemporaneamente e individuare i file (ad esempio EXE, DLL) che differiscono per dimensioni o numero di versione.

+4

Questo non è installato per impostazione predefinita. – macetw

+0

Non l'ho mai detto, e il collegamento è un collegamento per il download .. –

+0

Che funziona perfettamente per 32 bit ma non sembra gestire file a 64 bit –

6

Check out sigcheck.exe da Sysinternals Suite. Questa è un'utilità della riga di comando che mostra il numero di versione del file, le informazioni di data e ora e i dettagli della firma digitale.

+0

Filever non sarà supportato secondo MSDN sui sistemi operativi Windows più recenti, quindi grazie . – AnneTheAgile

15

e tre modi senza strumenti esterni

1. WMIC

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

Prestare attenzione alle doppie barre di nome di file.

Pronto per l'uso di 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 come il WMIC non è installato versioni home di Windows Ecco un modo con makecab che verrà eseguito su ogni macchina Windows:

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

output di esempio (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 

Utilizzando Shell.Application e lotto ibrido \ di jscript.Here 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<splitted.length-1;s++){ 
     if (s==0) { 
      result=splitted[s]; 
     } else { 
      result=result+"\\"+splitted[s]; 
     } 
    } 
    return result; 
} 


getName = function(path){ 
    var splitted=path.split("\\"); 
    return splitted[splitted.length-1]; 
} 
// 

function main(){ 
    if (!ExistsItem(filename)) { 
     WScript.Echo(filename + " does not exist"); 
     WScript.Quit(2); 
    } 
    var fullFilename=getFullPath(filename); 
    var namespace=getParent(fullFilename); 
    var name=getName(fullFilename); 
    var objFolder=objShell.NameSpace(namespace); 
    var objItem=objFolder.ParseName(name); 
    //https://msdn.microsoft.com/en-us/library/windows/desktop/bb787870(v=vs.85).aspx 
    WScript.Echo(fullFilename + " : "); 
    WScript.Echo(objFolder.GetDetailsOf(objItem,-1)); 

} 

main(); 

utilizzato contro 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 
+0

wmic funziona bene. Ho provato su win server 2012 e windows 8. – max

+0

Se qualcuno sta ancora leggendo questo thread - Sto cercando di utilizzare il metodo WMIC in un file CMD, reindirizzare l'output WMIC in un file e quindi analizzare l'output utilizzando FOR. Tuttavia questo fallisce completamente perché il file di output è UCS-2 LE BOM (secondo Notepad ++). Se lo converto manualmente in ASCII, funziona bene. Ho anche provato ad analizzare direttamente l'output del comando senza usare un file, ma anche questo fallisce, presumibilmente per lo stesso motivo. Qualche idea? – Dave

+0

@Dave - [controlla questo] (http://www.dostips.com/forum/viewtopic.php?t=4266) Domani aggiornerò la risposta. – npocmaka

0

ho trovato questo codice da Rob Vanderwoude's site :

@ECHO OFF 
IF [%1]==[] GOTO Syntax 
IF NOT [%2]==[] GOTO Syntax 
ECHO.%1 | FIND "?" >NUL 
IF NOT ERRORLEVEL 1 GOTO Syntax 
IF NOT EXIST %1 GOTO Syntax 
IF NOT "%OS%"=="Windows_NT" GOTO Syntax 

SETLOCAL 
SET FileVer= 
FOR /F "tokens=1 delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND /I "FileVersion"') DO SET LineNum=%%A 
SET /A LineNum += 1 
FOR /F "tokens=1* delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND "[%LineNum%]"') DO SET FileVer=%%B 
SET FileVer 
ENDLOCAL 
GOTO:EOF 

:Syntax 
ECHO. 
ECHO FileVer.bat, Version 1.00 for NT 4/2000/XP 
ECHO Display the specified file's version number 
ECHO. 
ECHO Usage: FILEVER progfile 
ECHO. 
ECHO Where: "progfile" is the name of a Windows executable, DLL, or system file 
ECHO. 
ECHO Uses SysInternal's STRINGS.EXE, avalable at http://www.sysinternals.com 
ECHO. 
ECHO Written by Rob van der Woude 
ECHO http://www.robvanderwoude.com 

Sembra interessante in quanto utilizza STRINGS da SysInternals.

0

Ecco il mio provare a utilizzare WMIC per ottenere la versione del file di tutti *.exe e *.dll all'interno della directory di Skype come ad esempio:

@echo off 
Mode 75,3 & color 9E 
Title Get File Version of any Program from file list using WMIC by Hackoo 
Set "RootFolder=%ProgramFiles%\Skype" 
@for %%a in (%RootFolder%) do set "FolderName=%%~na" 
Set "File_Version_List=%~dp0%FolderName%_File_Version_List.txt" 
Set "ErrorFile=%~dp0%FolderName%_Error.txt 
Set Extensions="*.exe" "*.dll" 
If exist "%ErrorFile%" Del "%ErrorFile%" 
If exist "%File_Version_List%" Del "%File_Version_List%" 
echo(
echo   Please wait a while ... Process to get file version ... 
set "BuildLineWith=call :BuildLine " 
setlocal enabledelayedexpansion 
CD /D "%RootFolder%" 
@for /f "delims=" %%F in ('Dir /b /s %Extensions%') do (
    set "Version=" 
    Call :Get_AppName "%%F" AppName 
    Call :Add_backSlash "%%F" 
    Call :GetVersion !Application! Version 
    Call :Remove_backSlash !Application! 
    If defined Version (
     (
      echo !Application! 
      echo !AppName! ==^> !Version! 
      %BuildLineWith%* 
     )>> "%File_Version_List%" 
    ) else (
     (
      echo Version is not defined in !Application! 
      %BuildLineWith%# 
     )>> "%ErrorFile%" 
    ) 
) 
If Exist "%ErrorFile%" Start "" "%ErrorFile%" 
If Exist "%File_Version_List%" Start "" /MAX "%File_Version_List%" & Exit 
::******************************************************************* 
:GetVersion <ApplicationPath> <Version> 
Rem The argument %~1 represente the full path of the application 
Rem without the double quotes 
Rem The argument %2 represente the variable to be set (in our case %2=Version) 
FOR /F "tokens=2 delims==" %%I IN (
    'wmic datafile where "name='%~1'" get version /format:Textvaluelist 2^>^nul' 
) DO FOR /F "delims=" %%A IN ("%%I") DO SET "%2=%%A" 
Exit /b 
::******************************************************************* 
:Add_backSlash <String> 
Rem Subroutine to replace the simple "\" by a double "\\" into a String 
Set "Application=%1" 
Set "String=\" 
Set "NewString=\\" 
Call Set "Application=%%Application:%String%=%NewString%%%" 
Exit /b 
::******************************************************************* 
:Remove_backSlash <String> 
Rem Subroutine to replace the double "\\" by a simple "\" into a String 
Set "Application=%1" 
Set "String=\\" 
Set "NewString=\" 
Call Set "Application=%%Application:%String%=%NewString%%%" 
Exit /b 
::******************************************************************* 
:Get_AppName <FullPath> <AppName> 
Rem %1 = FullPath 
Rem %2 = AppName 
for %%i in (%1) do set "%2=%%~nxi" 
exit /b 
::******************************************************************* 
:BuildLine 
set "LineChar=%1" 
if "%LineChar%"=="" set "LineChar=_" 
for /f "tokens=2 skip=4" %%A in ('mode con: /status') do set "WindowColumns=%%A" & goto :GotColumnCount 
:GotColumnCount 
set "CharLine=" 
setlocal EnableDelayedExpansion 
for /L %%A in (1,1,%WindowColumns%) do set "CharLine=!CharLine!!LineChar:~0,1!" 
setlocal DisableDelayedExpansion 
endlocal 
echo %CharLine% 
goto :eof 
::******************************************************************* 
Problemi correlati