[英]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.