我知道如何使用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对象来完成这项工作......
答案 0 :(得分:5)
可以使用Shell GetDetailsOf
对象的Folder
方法在脚本中获取扩展文件属性,例如公司名称或产品名称。该方法采用与扩展属性关联的从零开始的索引号,并将属性值作为字符串返回。通常,GetDetailsOf
可用于检索可在详细的Shell视图中显示的任何类型的信息(查看 - >选择详细信息)。请参阅Retrieving Extended File Properties。
唯一的问题是不同的Windows版本提供不同的扩展文件属性集。例如,Windows XP有34个文件属性,Windows Vista - 266,Windows 7 - 284.不仅属性索引可以不同,而且属性名称(Windows XP中的持续时间 = 长度) 在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));
答案 1 :(得分:1)
坚持使用jscript,通过在JScript.NET中编译,您可以从System.Diagnostics.FileVersionInfo获取信息。然后,如果需要从Windows Scripting Host调用它,则可以通过COM interop公开它。
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;
}
答案 2 :(得分:1)
对于相同的操作系统版本, GetDetailsOf 的索引似乎可能不同。例如,Helen's link报告&#34;产品名称&#34;应该是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;
}