- Как получить версию файла DLL или EXE к переменной, используя WMIC в командном файле Windows?
- 3 ответа
- Вопросы и ответы о восстановлении файлов в системе Windows из теневых копий
- Что такое предыдущие версии файлов
- Как создаются предыдущие версии
- Как восстановить предыдущие версии файла и папки
- Чем отличается точка восстановления от резервной копии
- Почему нет предыдущих версий некоторых файлов
- Можно восстановить удаленные файл или папку
- Windows получить версию файла
- Получить версию файла в PowerShell
Как получить версию файла DLL или EXE к переменной, используя WMIC в командном файле Windows?
Я пытаюсь получить версию файла, используя пакетный файл Windows. Эта команда успешно печатает версию на консоль.
Но когда я пытаюсь получить этот вывод в переменную, используя метод ниже, вывод командного процессора Windows:
Z: \\ bin \\ My_project.dll — неверный псевдоним глагола.
Что не так в этой командной строке?
3 ответа
Вот как я бы попытался эту задачу, используя WMIC :
Второй For Цикл предназначен для преодоления нежелательного выхода в результате Unicode WMIC результат.
редактировать
Если WMIC не было оговорено, вы могли бы использовать VBScript из вашего пакетного файла:
Использование Windows Scripting Host:
Или через mshta.exe :
Простейшим решением для получения версии DLL является использование этой командной строки в командном файле:
Также возможно, что это немного другая командная строка в командном файле:
FOR запускает команду в круглых скобках в отдельном командном процессе, запущенном с cmd /C в фоновом режиме и захватывает все строки, выводимые в STDOUT этого командного процесса. По этой причине необходимо учитывать, как cmd.exe В данный момент экземпляр, обрабатывающий пакетный файл, анализирует всю командную строку и выясняет, как FOR обрабатывает строки аргументов в круглых скобках.
Оператор перенаправления как > вне двойной кавычки необходимо экранировать ^ чтобы его сначала интерпретировали как буквальный символ, когда командный процессор Windows анализирует командную строку перед выполнением FOR.
И знак равенства = за пределами строки в двойных кавычках FOR интерпретируется как разделитель аргументов, такой как пробел или запятая, как это видно при запуске в окне командной строки, например:
Эта командная строка выводит:
По этой причине также = вне двойной кавычки необходимо экранировать ^ быть интерпретированным сначала как буквальный символ.
Второе решение использует альтернативный синтаксис WMIC для встраивания знака равенства в строку в двойных кавычках и другой синтаксис FOR с использованием обратных кавычек для возможности использования ‘ в командной строке выполнить с помощью FOR.
Выходы WMIC с опцией /VALUE или же /FORMAT:Textvaluelist например:
Таким образом, вывод WMIC состоит из двух пустых строк, запрашиваемой информации Version со знаком равенства и значением версии и еще двумя пустыми строками.
Проблема в том, что WMIC всегда выводит запрашиваемые данные, используя кодировку UTF-16 Little Endian с меткой порядка байтов (BOM) и FOR имеет ошибку при обработке правильного вывода Unicode. FOR интерпретирует последние две пустые строки в кодировке UTF-16 как одну строку с возвратом каретки + возврат каретки + перевод строки. Подробнее об этой ошибке FOR см., Например:
Эта ошибка решена здесь с помощью опции /VALUE получить вывод желаемой информации WMIC в одну строку в формате Version=value и используя опции FOR tokens=2 delims== , Только захваченная строка с Version=value имеет две строки, разделенные знаком равенства, поэтому команда SET выполняется только в этой строке со значением после знака равенства. Две пустые строки после строки с информацией о версии, неверно интерпретированной FOR как одна строка только с возвратом каретки, не приводят к выполнению команды SET, поскольку нет второй строки, которую можно было бы присвоить переменной цикла I ,
Этот код ожидает, что строка версии не содержит ни одного, ни нескольких = что всегда должно быть в случае версии DLL.
Примечание: значение переменной среды val не изменяется соответственно, эта переменная среды все еще не определена, если возникает какая-либо ошибка, например, если файл DLL вообще не найден. Сообщение об ошибке, выводимое WMIC, подавляется путем перенаправления 2>nul (с побегом > ) от STDERR к устройству NUL.
Вопросы и ответы о восстановлении файлов в системе Windows из теневых копий
Что такое предыдущие версии файлов
Предыдущие версии – это либо копии файлов и папок, созданных архивацией Windows, или копии файлов и папок, которые Windows автоматически сохраняет как часть точки восстановления.
Предыдущие версии можно использовать для восстановления случайно измененных, удаленных или поврежденных файлов и папок. В зависимости от типа файла или папки, можно открыть, сохранить в другом местоположении или восстановить предыдущую версию.
Как создаются предыдущие версии
Предыдущие версии автоматически сохраняются как часть точки восстановления. Если защита системы включена, Windows автоматически создает предыдущие версии файлов и папок, которые изменялись с момента создания последней точки восстановления. Обычно точки восстановления создаются раз в день.
Если диск разделен или на компьютере несколько жестких дисков, следует включить защиту системы для других разделов или дисков. Предыдущие версии также создаются архивацией Windows при резервном копировании файлов.
Примечание: Если в течение одного дня файл менялся несколько раз, только последняя версия на момент создания точки восстановления или резервной копии сохраняется как предыдущая версия.
Как восстановить предыдущие версии файла и папки
Щелкните файл или папку правой кнопкой мыши и выберите команду Восстановить предыдущие версии.
Появится список доступных предыдущих версий файла или папки. Список будет содержать файлы, сохраненные при резервном копировании (если для резервного копирования файлов используется архивация Windows) и точки восстановления.
Примечание: Для восстановления предыдущей версии файла или папки, добавленного в библиотеку, щелкните правой кнопкой мыши файл или папку в расположении, в которой сохранен, а не в библиотеке. Например, чтобы восстановить предыдущую версию изображения, добавлен в библиотеку изображений, но в папке Мои рисунки, щелкните правой кнопкой папку Мои рисунки и выберите Восстановить предыдущие версии.
Чем отличается точка восстановления от резервной копии
Если восстанавливать предыдущую версию с точки восстановления, файл, загруженный на компьютере, поэтому больше ничего не нужно делать.
Чтобы восстановить предыдущую версию файла или папки из резервной копии, после выбора предыдущей версии и нажатия кнопки «Восстановить» Windows открывает мастер восстановления файлов, после чего следует выполнить действия, указанные в мастере.
Диск или носитель, на котором хранится резервная копия, должен быть доступен, чтобы можно было восстановить элементы из резервной копии.
Почему нет предыдущих версий некоторых файлов
- Файл не был изменен. Предыдущие версии доступны только для файлов, которые были изменены.
- Точка восстановления или резервная копия ни была создана после изменения файла.
- Возможно, для диска, на котором хранятся эти файлы, не включена защита системы. Если защита системы не включена, Windows не может создать предыдущие версии.
Можно восстановить удаленные файл или папку
Если вы случайно удалили или переименовали файл или папку, можно восстановить предыдущую версию файла или папки, но нужно знать расположение, где они сохранены.
Чтобы восстановить удаленные или переименованные файл или папку, выполните следующие действия:
- Откройте папку «Компьютер».
- Перейдите в папку, содержащую файл или папку, щелкните правой кнопкой мыши и выберите Восстановить предыдущие версии.
Подсказка: Если вы не помните имя файла или папки или их расположение, введите часть имени в поле поиска в папке «Компьютер».
Windows получить версию файла
Сообщения: 5401
Благодарности: 1881
Конфигурация компьютера | ||||||||||
очень хорошей статьей с полезными запросами: Useful WMIC Queries. » |
Это сообщение посчитали полезным следующие участники:
WMIC DATAFILE WHERE name=»C:\\Windows\\regedit.exe» get Version /format:Textvaluelist » |
Конфигурация компьютера |
Материнская плата: ASUS P8Z77-V LE PLUS |
HDD: Samsung SSD 850 PRO 256 Гб, WD Green WD20EZRX 2 Тб |
Звук: Realtek ALC889 HD Audio |
CD/DVD: ASUS DRW-24B5ST |
ОС: Windows 8.1 Pro x64 |
Прочее: корпус: Fractal Design Define R4 |
Это сообщение посчитали полезным следующие участники:
WMIC DATAFILE WHERE name=»%P%имя_нужного_файла» get Version /format:Textvaluelist » |
подскажите пожалуйста, как присвоить вывод этой строки переменной?
Set MyVersion = WMIC DATAFILE WHERE name=»%P%имя_нужного_файла» get Version /format:Textvaluelist
Получить версию файла в PowerShell
Как вы можете получить информацию о версии от .dll или .exe в PowerShell?
Я специально заинтересованы в File Version , хотя другая информация о версии (то есть Company , Language , Product Name и т.д.) было бы полезно , как хорошо.
Поскольку PowerShell может вызывать классы .NET , вы можете сделать следующее:
Или, как указано здесь, в списке файлов:
В настоящее время вы можете получить FileVersionInfo из Get-Item или Get-ChildItem, но он будет показывать оригинальный FileVersion из поставляемого продукта, а не обновленную версию. Например:
Интересно, что вы можете получить обновленную (исправленную) ProductVersion , используя это:
Различие, которое я делаю между «оригинальным» и «исправленным», в основном связано с тем, как рассчитывается FileVersion ( см. Здесь документы ). По сути, начиная с Vista, Windows API GetFileVersionInfo запрашивает часть информации о версии из файла, не зависящего от языка (exe / dll), и нефиксированную часть из файла mui для конкретного языка (который не обновляется при каждом изменении файлов). ).
Таким образом, в случае файла типа lsasrv (который был заменен из-за проблем безопасности в SSL / TLS / RDS в ноябре 2014 года) версии этих двух команд (по крайней мере, некоторое время после этой даты) были разными, и вторая — более «правильная» версия.
Однако, хотя это правильно в LSASrv, возможно, что ProductVersion и FileVersion могут быть разными (на самом деле это обычное дело). Так что единственный способ получить обновленный Fileversion прямо из файла сборки — это создать его самостоятельно из частей, примерно так:
Или потянув данные из этого:
Вы можете легко добавить это ко всем объектам FileInfo, обновив TypeData в PowerShell:
Теперь каждый раз, когда вы делаете, Get-ChildItem или у Get-Item вас будет FileVersion свойство, которое показывает обновленный FileVersion .