Windows:命令行读取可执行文件的版本信息?

bxfogqkk  于 2023-08-07  发布在  Windows
关注(0)|答案(8)|浏览(229)

Windows是否有一个可执行文件,我可以在命令shell中运行,它返回可执行文件(.exe)文件的版本号?
我看到很多问题,显示如何从不同的语言,并参考第三方软件编写它,但我找不到一个简单的shell命令来做。如果我不需要安装任何东西,那就多加几分。
必须以普通用户身份运行。不是管理员。

ecfsfe2w

ecfsfe2w1#

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

字符串
您可以使用wmic来执行此操作。你可以把它 Package 成一个批处理文件

@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


将其保存为(示例)getVersion.cmd并调用为getVersion.cmd "c:\windows\system32\msiexec.exe"

已编辑以适应注解,并且不需要管理员权限。在本例中,使用混合cmd/JavaScript文件来查询wmi。用法相同

@if (@this==@isBatch) @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)

dced5bon

dced5bon2#

如果你愿意并能够使用PowerShell,下面的代码将工作。如果您使用的是受支持的Windows系统,PowerShell将可用。

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

字符串
如果必须在cmd.exe shell中运行它,可以用途:

powershell -NoLogo -NoProfile -Command ^
    "(Get-Item -Path 'C:\Program Files (x86)\Java\jre1.8.0_201\bin\java.exe').VersionInfo |" ^
        "Format-List -Force"

fykwrbwg

fykwrbwg3#

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

字符串

tquggr8v

tquggr8v4#

这将只给予文件版本:

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

字符串
测试结果:

Version
6.1.7601.18917

du7egjpx

du7egjpx5#

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

字符串
示例输出(它有一个字符串版本,这是对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


你也可以看看tooltipinfo.bat

lqfhib0f

lqfhib0f6#

filever c:\windows\system32\notepad.exe(每个Windows操作系统上都预安装了filever)。

q43xntqr

q43xntqr7#

filever.exe位于Windows 2003支持工具的SUPPORT.CAB中,也可能位于其他位置。
使用VBScript和来自CMD脚本的Scripting.FileSystemObject的方法

@Echo off
Set Version=
Echo WScript.Echo "Set Version=" ^& CreateObject("Scripting.FileSystemObject").GetFileVersion("%SystemRoot%\notepad.exe") >%temp%\~FileVer.vbs
Cscript.exe //nologo %temp%\~FileVer.vbs>%temp%\~FileVer.cmd
Call %temp%\~FileVer.cmd
Echo Version=%Version%

字符串
powershell方法的变体,如果您从CMD脚本调用。使用FileVersionRaw而不是FileVersion,因为FileVersion可以有额外的文本装饰,但必须使用ToString()才能获得预期的格式。

@Echo off
Set Version=
Powershell -c "'Set Version=' + (Get-Command '%SystemRoot%\Notepad.exe').FileVersionInfo.FileVersionRaw.ToString()">%temp%\~FileVer.cmd
Call %temp%\~FileVer.cmd
Echo Version=%Version%


一个Powershell从CMD方法来比较版本,因为这可能是在第一时间询问的原因。必须使用%ErrorLevel%==x,因为ErrorLevel==x实际上大于或等于。

@echo off
Powershell -c "exit 10 + ((Get-Command '%SystemRoot%\Notepad.exe').FileVersionInfo.FileVersionRaw).CompareTo([System.Version] '10.0.19041.1')"
If %ErrorLevel%==9  Echo File needs updating
If %ErrorLevel%==10 Echo File is expected version
If %ErrorLevel%==11 Echo File is newer than expected

0s7z1bwu

0s7z1bwu8#

在未提升的PowerShell中运行此命令以获取Thunderbird的版本:

(Get-Item -Path "C:\Program Files\Mozilla Thunderbird\thunderbird.exe").VersionInfo.ProductVersion

字符串
它通过从版本信息中筛选出来输出产品版本。用chrome.exe测试了一下,它也工作了。

相关问题