2009-11-04 110 views
3

我知道如何使用jscript检索exe的版本,但我找不到任何方式来检索其他信息,如“公司”,“内部名称”或“产品名称”。使用jscript检测exe的版本和公司名称

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对象来完成这项工作...

回答

5

扩展文件属性,诸如公司名称或产品名称,可以在使用Shell Folder对象的GetDetailsOf方法的脚本来获得。该方法采用与扩展属性关联的基于零的索引编号,并以字符串形式返回属性值。通常,GetDetailsOf可用于检索可在详细Shell视图中显示的任何类型的信息(查看 - >选择详细信息)。请参阅Retrieving Extended File Properties

唯一的问题是不同的Windows版本提供了不同的扩展文件属性集。例如,Windows XP有34个文件属性,Windows Vista — 266,Windows 7 — 284.不仅属性索引可以不同,还有属性名称(持续时间在Windows XP中= 长度在Windows Vista中),其中很混乱。对于可用的文件属性和它们的索引号的完整列表,请参阅this page或使用脚本像这样的:

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)); 
+0

非常感谢! 你是最棒的。 – 2010-01-17 13:09:38

1

使用JScript住,在JScript.NET编译,你可以得到System.Diagnostics.FileVersionInfo的信息。如果您需要从Windows Scripting Host调用它,则可以通过COM interop公开它。

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; 
} 
1

似乎为指标GetDetailsOf可用于不同相同的操作系统版本。例如,Helen's link报告称Windows 7的“产品名称”应为270索引,但在我的计算机上为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; 
}