|
本帖最后由 gz13802424 于 2019-1-15 20:13 编辑
今天太闲了,翻出些旧代码进行优化,在优化字体安装这一部分时,发现Au3自带的FileGetVersion只能查询到文件的部分信息 $FV_COMMENTS ("Comments") - 注释
$FV_COMPANYNAME ("CompanyName") - 公司名称
$FV_FILEDESCRIPTION ("FileDescription") - 文件说明
$FV_FILEVERSION ("FileVersion") - 文件版本
$FV_INTERNALNAME ("InternalName") - 内部名称
$FV_LEGALCOPYRIGHT ("LegalCopyright") - 法律版权
$FV_LEGALTRADEMARKS ("LegalTrademarks") - 法律商标
$FV_ORIGINALFILENAME ("OriginalFilename") - 原始文件名
$FV_PRODUCTNAME ("ProductName") - 产品名称
$FV_PRODUCTVERSION ("ProductVersion") - 产品版本
$FV_PRIVATEBUILD ("PrivateBuild") - 专用编译
$FV_SPECIALBUILD ("SpecialBuild") - 特别编译
如果需要比较齐全的文件信息,看样子只能自己折腾,首先找出自己写的VBS脚本
ExplorerVer = GetProductVersion(SysWOW64Drive & "\Windows", "explorer.exe", "文件版本")
'********************************
'**
'** 读取文件扩展信息
'**
'********************************
Function GetProductVersion(Folder, FiLename, DetailsOf)
set objShell = CreateObject("shell.application")
set objFolder = objShell.NameSpace(lcase(Folder))
GetProductVersion = ""
ArrDetailsOf = Split(DetailsOf, "|")
Max_j = UBound(ArrDetailsOf)
For i = 0 to 300
For j=0 to Max_j
If objFolder.GetDetailsOf(objFolder.Items, i) = ArrDetailsOf(j) then
set objFolderItem = objFolder.ParseName(FiLename)
GetProductVersion = GetProductVersion & objFolder.GetDetailsOf(objFolderItem, i) & chr(13)
ArrDetailsOf(j) = ArrDetailsOf(Max_j)
Max_j = Max_j - 1
End If
Next
if Max_j < 0 then Exit For
Next
if GetProductVersion <> "" then GetProductVersion= Left(GetProductVersion, Len(GetProductVersion)-1)
End Function 'Function GetProductVersion
这个VBS脚本是利用信息类型获取文件对应信息
在转变为Au3代码时,硬是没把objFolder.GetDetailsOf(objFolder.Items, i) 写出来Au3对应的代码(真心脸红,我是个靠google来写代码的门外汉),幸好Au3交流群的一位大神(风过影相随)伸出援助之手
$sSourceFile = "U:\Au3\Patch\DFPHaiBaoW12-GB.TTF"
$sIndex = _GetFileDetailIndexByType($sSourceFile, "标题")
$sFileInfo = _GetFileDetailInfoByIndex($sSourceFile,$sIndex)
;// 利用信息类型获取文件对应信息的索引值
Func _GetFileDetailIndexByType($sFile, $sDetailType)
If FileExists($sFile) Then
Dim $f, $shell, $oParentShell, $oFile, $sInfoType
Local $sIndex = 0 ;//起始索引
$oFile = ObjCreate("Scripting.FileSystemObject")
$f = $oFile.GetFile($sFile) ;//返回文件对应的文件对象
$oParentShell = ObjCreate("Shell.Application")
$shell = $oParentShell.Namespace($f.ParentFolder.Path);ParentFolder......返回该文件夹
While 1
$sInfoType = $shell.GetDetailsOf(0, $sIndex) ;//文件的信息类型
If $sInfoType = '' Then ExitLoop ;//信息类型为空,跳出循环
If String($sInfoType) = String($sDetailType) Then
;//成功得到对应的索引值
$shell = 0
$oFile = 0
$oParentShell = 0
$f = 0
Return $sIndex
EndIf
$sIndex += 1 ;//索引值加1
WEnd
;//未获取对应的索引值
$shell = 0
$oFile = 0
$oParentShell = 0
$f = 0
Return SetError(2) ;//未获取对应的索引值
Else
;// 文件不存在
SetError(1)
EndIf
EndFunc ;==>_GetFileDetailIndexByType
;//利用索引值 获取文件对应索引下的 信息
Func _GetFileDetailInfoByIndex($sFile, $sIndex)
If FileExists($sFile) Then
Dim $f, $shell, $oParentShell, $oFile, $sDetailInfo
$oFile = ObjCreate("Scripting.FileSystemObject")
$f = $oFile.GetFile($sFile) ;//返回文件对应的文件对象
$oParentShell = ObjCreate("Shell.Application")
$shell = $oParentShell.Namespace($f.ParentFolder.Path);ParentFolder......返回该文件夹
$sDetailInfo = $shell.GetDetailsOf($shell.Items.Item($f.Name), $sIndex) ;//获取对应的信息
$shell = 0
$oFile = 0
$oParentShell = 0
$f = 0
Return $sDetailInfo
Else
;// 文件不存在
SetError(1)
EndIf
EndFunc ;==>_GetFileDetailInfoByIndex
最后在(风过影相随)代码基础上,重新写出了我自己需要的代码
$sSourceFile = "U:\Au3\Patch\DFPHaiBaoW12-GB.TTF"
$sFileInfo = _GetProductVersion($sSourceFile, "标题|类型")
$sFileInfo = _GetProductVersion($sSourceFile, "标题")
Func _GetProductVersion($sFile, $sDetailType)
Local $sDetailInfo = ""
If FileExists($sFile) Then
Dim $Path_, $Name_, $shell, $oParentShell, $sInfoType
Local $sIndex = 0
$Path_ = StringRegExpReplace($sFile, '(^.*)(\\.*$)', '$1')
$Name_ = StringRegExpReplace($sFile, '^.*\\', '')
$oParentShell = ObjCreate("Shell.Application")
$shell = $oParentShell.Namespace($Path_)
While 1
$sInfoType = $shell.GetDetailsOf(0, $sIndex)
If @error Then ExitLoop
If StringRegExp($sInfoType, $sDetailType) Then
$sDetailType = StringReplace($sDetailType, $sInfoType, "")
If @extended = 1 Then
$sDetailInfo = $sDetailInfo & $shell.GetDetailsOf($shell.Items.Item($Name_), $sIndex) & "|"
$sDetailType = StringTrimLeft($sDetailType, 1)
EndIf
EndIf
If $sDetailType = "" Then ExitLoop
$sIndex += 1
If $sIndex = 1000 Then ExitLoop
WEnd
EndIf
Return SetError(($sDetailInfo = "" ? 1 : 0), $sIndex, StringTrimRight($sDetailInfo, 1))
EndFunc ;==>_GetProductVersion
|
评分
-
查看全部评分
|