Windows 是否有一个可执行文件可以在命令 shell 中运行并返回可执行 (.exe) 文件的版本号?
我看到很多问题显示如何从不同的语言执行此操作,并参考第三方软件来编写它,但我找不到简单的 shell 命令来执行此操作。如果我不需要安装任何东西,还有额外的积分。
必须以普通用户身份运行。不是管理员。
wmic datafile where name="C:\\Windows\\System32\\msiexec.exe" get Version /value
您可以使用
wmic
来完成此操作。你可以将它包装成批处理文件
@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)
如果您愿意并且能够使用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"
set EXE='c:\firefox\firefox.exe'
powershell "(Get-Item -path %EXE%).VersionInfo.ProductVersion"
这只会为您提供文件版本:
wmic datafile where name='c:\\windows\\system32\\notepad.exe' get version
结果:
Version
6.1.7601.18917
还有一种方式
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
filever c:\windows\system32 记事本程序 (每个 Windows 操作系统上都预装了 filever)。
filever.exe 位于 Windows 2003 支持工具的 SUPPORT.CAB 中,也许还有其他地方。
从 CMD 脚本使用 VBScript 和 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%
如果您从 CMD 脚本调用,则为 powershell 方法的变体。 使用 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%
使用 CMD 方法的 Powershell 来比较版本,因为这可能是首先询问的原因。 必须使用 %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
在未提升的 PowerShell 中运行此命令以获取 Thunderbird 的版本:
(Get-Item -Path "C:\Program Files\Mozilla Thunderbird\thunderbird.exe").VersionInfo.ProductVersion
它通过从版本信息中过滤掉产品版本来输出产品版本。 用 chrome.exe 测试了一下,也有效。
有点晚了,但您可以使用
ex
,这是一个列出目录内容的通用命令行工具;请参阅https://crates.io/crates/ex-cli(注意,我是作者)。
首先从 https://www.rust-lang.org/tools/install 安装 Rust,然后安装
ex
:
$ cargo install ex-cli
Updating crates.io index
Ignored package `ex-cli v1.9.0` is already installed, use --force to override
版本 1.9.0 在 Windows 上运行时显示文件版本:
C:\Users\username\bin> ex.exe -v
-rw-rw-rw- 123 KB 1 month 2.1.0.999 .exe binary.exe
-rw-rw-rw- 45 KB 1 month 2.1.0.1001 .dll library.dll
-rw-rw-rw- 678 B 1 month .txt README.txt