代码之家  ›  专栏  ›  技术社区  ›  Alessandro Jacopson

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

  •  3
  • Alessandro Jacopson  · 技术社区  · 15 年前

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

    3 回复  |  直到 9 年前
        1
  •  5
  •   Helen    15 年前

    扩展文件属性,如公司名称或产品名称,可以在脚本中使用 GetDetailsOf 壳体方法 Folder 对象。该方法采用与扩展属性关联的从零开始的索引编号,并将属性值作为字符串返回。一般来说, 获取细节 可用于检索可在详细外壳视图中显示的任何类型的信息( 查看->选择详细信息 )见 Retrieving Extended File Properties .

    唯一的问题是不同的Windows版本提供不同的扩展文件属性集。例如,Windows XP有34个文件属性,Windows Vista-266、Windows 7-284。不仅属性索引可以不同,而且属性名称也可以不同( 持续时间 在WindowsXP= 长度 在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));
    
        2
  •  1
  •   machine elf    15 年前

    继续使用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;
    }
    
        3
  •  1
  •   Aleksandr    11 年前

    似乎索引 获取细节 对于相同的操作系统版本可能不同。例如, Helen's link 报告说,Windows7的“产品名称”应该是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;
    }
    
    推荐文章