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?
Come posso recuperare che versione del file, da un file batch?
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?
Come posso recuperare che versione del file, da un file batch?
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.
Questo non è installato per impostazione predefinita. – macetw
Non l'ho mai detto, e il collegamento è un collegamento per il download .. –
Che funziona perfettamente per 32 bit ma non sembra gestire file a 64 bit –
Ecco un solution in PowerShell utilizzando FileVersionInfo.
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.
Filever non sarà supportato secondo MSDN sui sistemi operativi Windows più recenti, quindi grazie . – AnneTheAgile
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
wmic funziona bene. Ho provato su win server 2012 e windows 8. – max
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
@Dave - [controlla questo] (http://www.dostips.com/forum/viewtopic.php?t=4266) Domani aggiornerò la risposta. – npocmaka
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.
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
::*******************************************************************
Vedi http://stackoverflow.com/questions/602802/command-line- tool-to-dump-windows-dll-version – Helen
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) –