簡體   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