2009-11-04 12 views
3

Je sais comment récupérer la version d'un exe en utilisant jscript, mais je ne trouve aucun moyen de récupérer d'autres informations comme "Société", "Nom interne" ou " Nom du produit ".Détection de la version et du nom d'entreprise d'un exe en utilisant jscript

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

Peut-être que je vais écrire mon propre objet COM pour faire le travail ...

Répondre

5

propriétés de fichier étendues, telles que le nom de l'entreprise ou le nom du produit, peuvent être obtenus dans les scripts en utilisant la méthode GetDetailsOf de l'objet Shell Folder. La méthode prend un numéro d'index basé sur zéro associé à la propriété étendue et renvoie la valeur de la propriété sous la forme d'une chaîne. En général, GetDetailsOf peut être utilisé pour récupérer n'importe quel type d'information qui peut être affiché dans la vue Shell détaillée (Affichage -> Choisir les détails). Voir Retrieving Extended File Properties.

Le seul problème est que différentes versions de Windows offrent différents ensembles de propriétés de fichier étendues. Par exemple, Windows XP dispose de 34 propriétés de fichiers, Windows Vista — 266, Windows 7 — 284. Non seulement les indices de propriété peuvent différer, mais aussi les noms de propriété (Durée dans Windows XP = Longueur dans Windows Vista), qui est assez déroutant. Pour une liste complète des propriétés de fichiers disponibles et leurs numéros d'index, voir this page ou utiliser un script comme celui-ci:

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


Quoi qu'il en soit, le code est ici exemple pour effectuer votre tâche sous Windows Vista. Je ne pouvais pas trouver le Nom interne propriété (pourrait ne pas avoir correctement contrôlée) ainsi inclus la version du fichier et Version du produit à la place:

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

Notez que vous pouvez utiliser GetDetailsOf(null, property_index) pour obtenir des paramètres régionaux Les noms de propriété (cela peut être utile sur les versions non-Windows en anglais):

WScript.Echo(oFolder.GetDetailsOf(null, COMPANY_NAME) + ": " + oFolder.GetDetailsOf(oFile, COMPANY_NAME)); 
+0

merci beaucoup! Vous êtes le meilleur. –

1

Rester avec JScript, en compilant dans JScript.NET, vous pouvez obtenir les informations de System.Diagnostics.FileVersionInfo. Vous pouvez ensuite l'exposer via COM interop si vous devez l'appeler à partir de Windows Scripting Host.

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

Il semble que les indices pour GetDetailsOf peuvent différer pour la même version du système d'exploitation. Par exemple, Helen's link indique que «Nom du produit» doit être à l'index 270 pour Windows 7, mais à 267 sur mon ordinateur. Par conséquent, les index de propriété ne sont pas fiables. Bien que je n'ai pas fait un test approfondi pour prouver ce fait. Comme nous ne ciblons que quelques langues dans nos produits, je me suis retrouvé avec la solution suivante:

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