Определение версии и названия компании exe с использованием jscript
Я знаю, как получить версию exe, используя jscript, но я не могу найти какой-либо способ получить другую информацию, такую как "Компания", "Внутреннее имя" или "Название продукта".
function version_of( file_name )
{
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f;
try {
f = fso.GetFile( file_name )
} catch( e ) {
throw new Error( e.number, "Error retrieving version of file ``" + file_name + "'': " + e.description );
}
var v = fso.GetFileVersion( f );
if ( !v ) {
throw new Error( 1, "File ``" + file_name + "'' has not got a version" );
}
return v;
}
WScript.Echo( version_of( "c:\\windows\\system32\\winver.exe" ) );
Может быть, я напишу свой собственный объект COM, чтобы сделать работу...
3 ответа
Расширенные свойства файла, такие как название компании или название продукта, могут быть получены в сценариях с помощью GetDetailsOf
метод оболочки Folder
объект. Метод принимает нулевой индекс, связанный с расширенным свойством, и возвращает значение свойства в виде строки. В общем, GetDetailsOf
может использоваться для получения любого типа информации, которая может отображаться в подробном представлении оболочки (" Просмотр" -> "Выбрать детали"). См. Получение расширенных свойств файла.
Единственная проблема заключается в том, что разные версии Windows предлагают разные наборы расширенных свойств файла. Например, Windows XP имеет 34 свойства файла, Windows Vista - 266, Windows 7 - 284. Могут отличаться не только индексы свойств, но и имена свойств (Duration в Windows XP = длина в Windows Vista), что весьма запутанно. Полный список доступных свойств файла и их номера индексов см. На этой странице или используйте скрипт, подобный следующему:
var oShell = new ActiveXObject("Shell.Application");
var oFolder = oShell.Namespace("C:");
for (var i = 0; i < 300 /* some large number*/; i++)
WScript.Echo(i + " " + oFolder.GetDetailsOf(null, i));
В любом случае, вот пример кода для выполнения вашей задачи в Windows Vista. Я не смог найти свойство " Внутреннее имя" (возможно, не выполнил поиск должным образом), поэтому вместо этого включил " Версия файла" и "Версия продукта"
var COMPANY_NAME = 33;
var FILE_VERSION = 145;
var PRODUCT_NAME = 251;
var PRODUCT_VERSION = 252;
var oShell = new ActiveXObject("Shell.Application");
var oFolder = oShell.Namespace("C:\\Windows");
var oFile = oFolder.ParseName("notepad.exe");
WScript.Echo("Company name: " + oFolder.GetDetailsOf(oFile, COMPANY_NAME));
WScript.Echo("Product name: " + oFolder.GetDetailsOf(oFile, PRODUCT_NAME));
WScript.Echo("File version: " + oFolder.GetDetailsOf(oFile, FILE_VERSION));
WScript.Echo("Product version: " + oFolder.GetDetailsOf(oFile, PRODUCT_VERSION));
Обратите внимание, что вы можете использовать GetDetailsOf(null, property_index)
чтобы получить специфичные для локали имена свойств (это может быть полезно в неанглийских версиях Windows):
WScript.Echo(oFolder.GetDetailsOf(null, COMPANY_NAME) + ": " + oFolder.GetDetailsOf(oFile, COMPANY_NAME));
Оставаясь с jscript, компилируя в JScript.NET, вы можете получить информацию из System.Diagnostics.FileVersionInfo. Затем вы можете открыть его через COM-взаимодействие, если вам нужно вызвать его с Windows Scripting Host.
import System.Diagnostics;
private function GetCompanyName(filename) {
return FileVersionInfo.GetVersionInfo(filename).CompanyName;
}
private function GetInternalName(filename) {
return FileVersionInfo.GetVersionInfo(filename).InternalName;
}
private function GetProductName(filename) {
return FileVersionInfo.GetVersionInfo(filename).ProductName;
}
Кажется, что индексы для GetDetailsOf могут отличаться для одной и той же версии ОС. Например, ссылка Хелен сообщает, что "Имя продукта" должно иметь индекс 270 для Windows 7, но на моем компьютере он равен 267. Поэтому индексы свойств не являются надежными. Хотя я не проводил обширного тестирования, чтобы доказать этот факт. Поскольку в наших продуктах мы ориентируемся только на несколько языков, я получил следующее решение:
var wsh = new ActiveXObject("WScript.Shell");
var shell = new ActiveXObject("Shell.Application");
function GetProductNameIndex()
{
var folder = shell.Namespace(wsh.ExpandEnvironmentStrings("%WINDIR%")); // any folder
for (var i = 0; i < 400; i++) // some large number of iterations
{
var name = folder.GetDetailsOf(null, i);
// if(!name) break; // this optimization is not working
if(name.match(/Product name|Название продукта/i)) return i;
}
return -1;
}