繁体   English   中英

使用JScript检测exe的版本和公司名称

[英]Detecting the version and company name of an exe using jscript

我知道如何使用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对象来完成这项工作...

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

唯一的问题是,不同的Windows版本提供了不同的扩展文件属性集。 例如,Windows XP具有34个文件属性,分别是Windows Vista — 266,Windows 7 —284。不仅属性索引可以不同,而且属性名称(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));

对于同一OS版本, GetDetailsOf的索引似乎可能有所不同。 例如, Helen的链接报告说,对于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;
}

与jscript一起使用,通过在JScript.NET中进行编译,您可以从System.Diagnostics.FileVersionInfo中获取信息。 如果需要从Windows脚本宿主调用它,则可以通过COM互操作公开它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM