Pliki binarne mają wbudowaną wersję - łatwą do wyświetlenia w Eksploratorze Windows.Jak mogę pobrać wersję pliku z pliku wsadowego w systemie Windows Vista?
Jak mogę odzyskać tej wersji pliku z pliku wsadowego?
Pliki binarne mają wbudowaną wersję - łatwą do wyświetlenia w Eksploratorze Windows.Jak mogę pobrać wersję pliku z pliku wsadowego w systemie Windows Vista?
Jak mogę odzyskać tej wersji pliku z pliku wsadowego?
Myślę, że filever
jest tym, czego potrzebujesz. Może pobrać wersję pliku dla wielu elementów w tym samym czasie i zlokalizować pliki (na przykład EXE, DLL), które różnią się rozmiarem lub numerem wersji.
To nie jest domyślnie instalowane. – macetw
Nigdy nie powiedziałem, że jest, a link jest linkiem do pobrania .. –
To działa świetnie dla 32 bitów, ale nie obsługuje plików 64 bitowych –
Oto solution in PowerShell przy użyciu FileVersionInfo.
Zapoznaj się z sigcheck.exe
z Sysinternals Suite. Jest to narzędzie wiersza polecenia, które wyświetla numer wersji pliku, informacje o znaczniku czasu i szczegóły podpisu cyfrowego.
Filever nie będzie obsługiwany zgodnie z MSDN na nowszych systemach operacyjnych Windows, więc dziękuję . – AnneTheAgile
i trzy sposoby, bez użycia narzędzi zewnętrznych
1. WMIC
WMIC DATAFILE WHERE name="C:\\install.exe" get Version /format:Textvaluelist
zwrócić uwagę na podwójne ukośniki w nazwie pliku.
Gotowy do użycia skrypt:
@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 jako WMIC nie jest zainstalowany w wersjach domowych okien oto sposób z makecab że będzie działać na każdym komputerze z systemem 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*"
przykładowe wyjście (ma wersję ciągową, która jest małym dodatkiem do metody 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
Korzystanie Shell.Application i hybrydowe partię \ jscript.Here na 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();
wykorzystane przeciwko 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 działa dobrze. Próbowałem go na serwerze win 2012 i Windows 8. – max
Jeśli ktokolwiek wciąż czyta ten wątek - próbuję użyć metody WMIC w pliku CMD, przekierowując wyjście WMIC do pliku, a następnie analizując wynik za pomocą FOR. Jednak to się całkowicie nie udaje, ponieważ plik wyjściowy to UCS-2 LE BOM (zgodnie z Notepad ++). Jeśli ręcznie przekonwertuję go na ASCII, działa dobrze. Próbowałem również analizować dane wyjściowe polecenia bezpośrednio, bez użycia pliku, ale to też się nie udaje, prawdopodobnie z tego samego powodu. Czy masz jakieś pomysły? – Dave
@Dave - [sprawdź to] (http://www.dostips.com/forum/viewtopic.php?t=4266) Jutro będę aktualizować odpowiedź. – npocmaka
Znalazłem ten kod z 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
Wygląda interesująco, ponieważ używa STRINGS z SysInternals.
Oto moja próba korzystania WMIC
aby uzyskać wersji pliku wszystkich *.exe
i *.dll
wewnątrz katalogu Skype jako przykład:
@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
::*******************************************************************
Zobacz http://stackoverflow.com/questions/602802/command-line- tool-to-dump-windows-dll-version – Helen
Jakieś wskazówki tutaj? [http://www.winvistatips.com/determine-version-exe-thru-batch-file-t284289.html](http://www.winvistatips.com/determine-version-exe-thru-batch-file -t284289.html) –