【问题标题】:Detecting the version and company name of an exe using jscript使用 jscript 检测 exe 的版本和公司名称
【发布时间】:2010-12-13 01:08:11
【问题描述】:

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

【问题讨论】:

    标签: javascript scripting getfileversion


    【解决方案1】:

    扩展文件属性,例如公司名称或产品名称,可以使用 Shell Folder 对象的 GetDetailsOf 方法在脚本中获取。该方法采用与扩展属性关联的从零开始的索引号,并将属性值作为字符串返回。通常,GetDetailsOf 可用于检索可显示在详细 Shell 视图中的任何类型的信息(View -> Choose Details)。见Retrieving Extended File Properties。

    唯一的问题是不同的 Windows 版本提供不同的扩展文件属性集。例如,Windows XP 有 34 个文件属性,Windows Vista — 266,Windows 7 — 284。不仅属性索引可以不同,而且属性名称(Windows XP 中的Duration = Length 在 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 上执行任务的示例代码。我找不到 Internal Name 属性(可能没有正确搜索),因此包含了 File Version 和 Product Version:

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

    【讨论】:

      【解决方案2】:

      继续使用 jscript,通过在 JScript.NET 中编译,您可以从 System.Diagnostics.FileVersionInfo 获取信息。如果您需要从 Windows Scripting Host 调用它,则可以通过 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;
      }
      

      【讨论】:

        【解决方案3】:

        对于相同的操作系统版本,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;
        }
        

        【讨论】:

          猜你喜欢
          • 2018-04-28
          • 1970-01-01
          • 1970-01-01
          • 2018-11-11
          • 2012-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-01
          相关资源
          最近更新 更多