Squeak.ru - шаблоны программирования

Windows: командная строка для чтения информации о версии исполняемого файла?

Есть ли в Windows исполняемый файл, который я могу запустить в командной оболочке, который возвращает номер версии исполняемого файла (.exe)?

Я вижу много вопросов, которые показывают, как это сделать на разных языках, и ссылки на стороннее программное обеспечение для его написания, но я не могу найти простую команду оболочки для этого. Дополнительные баллы, если мне не нужно ничего устанавливать.

Он должен запускаться как обычный пользователь. Не администратор.



Ответы:


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

отредактировано, чтобы адаптироваться к комментариям и не требовать прав администратора. В этом случае для запроса wmi используется гибридный файл cmd / javascript. То же использование

@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)
03.09.2014
  • Отлично, но, к сожалению, вы должны быть в группе администраторов, чтобы запустить его :-( Мне нужно запустить его как мой пользователь непрерывной интеграции. 03.09.2014
  • Как потом использовать% vers%? Когда я пытаюсь echo %vers%, командная строка сообщает мне ECHO is off. 16.05.2018
  • @AlainD, setlocal / endlocal предотвращает распространение изменений в среде за пределы командного файла. Если вам нужно значение %vers%, измените конечную строку endlocal на enlocal & set "vers=%vers%" 16.05.2018
  • @ mc-nd небольшая опечатка: enDlocal & set vers =% vers% 12.11.2019
  • @AndrewDennison, вы правы, спасибо. К сожалению, мне не разрешено редактировать комментарий. 13.11.2019

  • 2

    Если вы хотите и можете использовать PowerShell, следующий код будет работать. Если вы используете поддерживаемую систему Windows, PowerShell будет доступен.

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

    Если вам необходимо запустить его в оболочке cmd.exe, вы можете использовать:

    powershell -NoLogo -NoProfile -Command ^
        "(Get-Item -Path 'C:\Program Files (x86)\Java\jre1.8.0_201\bin\java.exe').VersionInfo |" ^
            "Format-List -Force"
    
    05.08.2017
  • Это самый простой и ясный ответ, который напрямую применим к PS без каких-либо других зависимостей. 26.04.2020

  • 3

    Это даст вам только версию файла:

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

    Результат:

    Version
    6.1.7601.18917
    
    23.09.2017
  • Привет, ответы, содержащие только код, обычно помечаются для модерации. Не могли бы вы добавить строчку, поясняющую, что это нравится? 23.09.2017
  • Этот ответ должен быть на высоте. Коротко, лаконично и по делу, не говоря уже о работе, в отличие от принятого в настоящее время ответа! 30.04.2021

  • 4

    и в одну сторону с 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

    04.09.2014

    5

    filever c: \ windows \ system32 \ notepad.exe (файловая программа предустановлена ​​в каждой ОС Windows).

    07.11.2020
  • Я набрал where filever и ничего не нашел. 09.11.2020
  • Судя по всему, filever больше не доступен в Windows 10. Хотя OP не указывал версию ОС, я добавляю этот комментарий для будущих читателей. 07.12.2020

  • 6

    filever.exe находится в SUPPORT.CAB инструментов поддержки Windows 2003 и, возможно, в других местах.

    Метод, использующий VBScript и Scripting.FileSystemObject из сценария CMD

    @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
    
    30.11.2020

    7
  • Хотя этот ответ, состоящий только из кода, может дать ответ на вопрос, пожалуйста, объясните, почему он это делает. Это поможет будущим пользователям оценить ответ для своей ситуации. 30.01.2018
  • добавить объяснение, почему это так? Потому что это так и было задумано? Эти вопросы о шаблоне бессмысленны. 30.01.2018
  • Нет, поскольку вы установили текущий активный exe-файл, Powershell будет интерпретировать его с помощью первой строки, а затем вы использовали команду powershell для текущего активного exe-файла. 24.05.2018
  • Какие? Я активно использую этот фрагмент в нескольких работах Дженкинса, но, пожалуйста, скажите мне, почему он не работает, или что-то еще ... 24.05.2018
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...