想要实现如下的两个目标:
1.通过 vbs判断某路径下的数个excel文件是03版本还是07版本,如果有文件是03的,跳出,如果都是07的则调用某 批处理文件.
2.同上类似,不过是单个判断,指定文件名的excel文件,判断其版本,是03跳出,07的则调用 批处理.
EXCEL2007的文件扩展名和2003不同。2003是XLS,2007是XLSX。即使是在EXCEL2007里存为XLS,那它也是2003的格式。所以这个不会有错。所以先DIR”路径\*.exl*”,然后循环dir,把所有EXCEL文件的名称得到,在循环中赋给临时变量,比如theforeverOncsdn。这个具体方法网上有很多现成的遍历文件夹内文件的例程,很多是使用FSO的方法,大体也差不多,只要能实现都可以。
在得到每个文件名的时候,就可以截取扩展名判断是XLS还是XLSX。前者则为2003,后者则为2007.
这个最通用的应该是自己解析PE文件格式,从中读取到excel.exe的版本信息,当然也可以用一些取巧的方法来实现,例如:
VBScript code:
Set oVer = WScript.GetObject(“res://C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE/16/1″)
WScript.Sleep 500
‘oInfo = Split(oVer.body.innerHTML,Chr(01))
‘For i = 1 To UBound(oInfo)
‘WScript.Echo oInfo(i)
‘Next
WScript.Echo oVer.body.innerhtml
其中就包含了excel的版本。
另外一个方法则是判断excel.exe的创建时间来判断版本,只需要用到fso对象即可。
但是上面的方法好像是不那么对的,因为“Set oVer = WScript.GetObject(“res://C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE/16/1″) ”这个方法只是能取到本机安装的EXCEL的版本,但不是具体每个EXCEL的版本,意义完全是两码事,如果安的是2007,不代表没有2003的EXCEL文档。
“另外一个方法则是判断excel.exe的创建时间来判断版本,只需要用到fso对象即可.”
这个根本是不行的。EXCEL.EXE的创建时间?这个根本说明不了什么,文件每当被复制时都可能重新设置时间,这个取决于系统的设置,有的设置是保留原始创建时间的,但有的设置就不会保留而使用复制时的时间。
“最通用的应该是自己解析PE文件格式”。PE文件是指可执行文件,EXE和DLL这样的。如果用HEX编辑器看XLS,会发觉有点像,但根本不是。不过排除这个认定错误,就说是用文件的文件头信息的话,的确是最准确的,因为扩展名也可以改(不过改了肯定会影响使用,所以正常来说不会故意改成不好使,只不过说有这种极端的可能性存在),而文件数据,其实也是可以改的,但改了就可能完全不能用了。
而且“Set oVer = WScript.GetObject(“res://C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE/16/1″) ”
而且这个方法如果只这样写,也可能完全失效。因为安装路径不可能固定就是这样,用户会自己选择驱动器和安装目录名称。如果是取本机的EXCEL版本,取注册表里EXCEL注册键的版本信息就可以。
另外,关于EXCEL文件格式,上面说了肯定不是PE,而且,当初对XLSX也稍微研究了一下,发现这个文件,可以改成ZIP扩展名使用,没错,它就是一个压缩包(所以同样内容,用EXCEL2007格式保存反而比EXCEL2003格式更小,这正是导致我这个发现的判断线索)。里面按组织存了若干文件,十分有趣,意义很明显,而且都可以编辑,基本都是XML格式,只不过不是很直观,如下的代码就能完全实现这个目标,如下:
VBScript code:
Function getStdOut(exeCstr)
on error resume next
Set ws = CreateObject("WScript.Shell")
Set oStdOut = ws.Exec(exeCstr).StdOut
Do until oStdOut.AtEndOfStream
' getStdOut = getStdOut & oStdOut.Read(1)
' getStdOut = getStdOut & oStdOut.ReadLine()
getStdOut = oStdOut.ReadAll()
Loop
End Function
Function get7zType(ExePath7z, FileName)
if ExePath7z="" then : ExePath7z="D:\7z-920\7z.exe" : end if ' Note: "ExePath7z" must be a short path name
oType = getStdOut("cmd.exe /k " & ExePath7z & " l -slt """& FileName &""" | findstr /I ""^Type.=."" && exit")
get7zType =Right(oType, Len(oType)-6)
End Function
msgbox get7zType("" , wscript.arguments(0))
1.通过 vbs判断某路径下的数个excel文件是03版本还是07版本,如果有文件是03的,跳出,如果都是07的则调用某 批处理文件.
2.同上类似,不过是单个判断,指定文件名的excel文件,判断其版本,是03跳出,07的则调用 批处理.
EXCEL2007的文件扩展名和2003不同。2003是XLS,2007是XLSX。即使是在EXCEL2007里存为XLS,那它也是2003的格式。所以这个不会有错。所以先DIR”路径\*.exl*”,然后循环dir,把所有EXCEL文件的名称得到,在循环中赋给临时变量,比如theforeverOncsdn。这个具体方法网上有很多现成的遍历文件夹内文件的例程,很多是使用FSO的方法,大体也差不多,只要能实现都可以。
在得到每个文件名的时候,就可以截取扩展名判断是XLS还是XLSX。前者则为2003,后者则为2007.
这个最通用的应该是自己解析PE文件格式,从中读取到excel.exe的版本信息,当然也可以用一些取巧的方法来实现,例如:
VBScript code:
Set oVer = WScript.GetObject(“res://C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE/16/1″)
WScript.Sleep 500
‘oInfo = Split(oVer.body.innerHTML,Chr(01))
‘For i = 1 To UBound(oInfo)
‘WScript.Echo oInfo(i)
‘Next
WScript.Echo oVer.body.innerhtml
其中就包含了excel的版本。
另外一个方法则是判断excel.exe的创建时间来判断版本,只需要用到fso对象即可。
但是上面的方法好像是不那么对的,因为“Set oVer = WScript.GetObject(“res://C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE/16/1″) ”这个方法只是能取到本机安装的EXCEL的版本,但不是具体每个EXCEL的版本,意义完全是两码事,如果安的是2007,不代表没有2003的EXCEL文档。
“另外一个方法则是判断excel.exe的创建时间来判断版本,只需要用到fso对象即可.”
这个根本是不行的。EXCEL.EXE的创建时间?这个根本说明不了什么,文件每当被复制时都可能重新设置时间,这个取决于系统的设置,有的设置是保留原始创建时间的,但有的设置就不会保留而使用复制时的时间。
“最通用的应该是自己解析PE文件格式”。PE文件是指可执行文件,EXE和DLL这样的。如果用HEX编辑器看XLS,会发觉有点像,但根本不是。不过排除这个认定错误,就说是用文件的文件头信息的话,的确是最准确的,因为扩展名也可以改(不过改了肯定会影响使用,所以正常来说不会故意改成不好使,只不过说有这种极端的可能性存在),而文件数据,其实也是可以改的,但改了就可能完全不能用了。
而且“Set oVer = WScript.GetObject(“res://C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE/16/1″) ”
而且这个方法如果只这样写,也可能完全失效。因为安装路径不可能固定就是这样,用户会自己选择驱动器和安装目录名称。如果是取本机的EXCEL版本,取注册表里EXCEL注册键的版本信息就可以。
另外,关于EXCEL文件格式,上面说了肯定不是PE,而且,当初对XLSX也稍微研究了一下,发现这个文件,可以改成ZIP扩展名使用,没错,它就是一个压缩包(所以同样内容,用EXCEL2007格式保存反而比EXCEL2003格式更小,这正是导致我这个发现的判断线索)。里面按组织存了若干文件,十分有趣,意义很明显,而且都可以编辑,基本都是XML格式,只不过不是很直观,如下的代码就能完全实现这个目标,如下:
VBScript code:
Function getStdOut(exeCstr)
on error resume next
Set ws = CreateObject("WScript.Shell")
Set oStdOut = ws.Exec(exeCstr).StdOut
Do until oStdOut.AtEndOfStream
' getStdOut = getStdOut & oStdOut.Read(1)
' getStdOut = getStdOut & oStdOut.ReadLine()
getStdOut = oStdOut.ReadAll()
Loop
End Function
Function get7zType(ExePath7z, FileName)
if ExePath7z="" then : ExePath7z="D:\7z-920\7z.exe" : end if ' Note: "ExePath7z" must be a short path name
oType = getStdOut("cmd.exe /k " & ExePath7z & " l -slt """& FileName &""" | findstr /I ""^Type.=."" && exit")
get7zType =Right(oType, Len(oType)-6)
End Function
msgbox get7zType("" , wscript.arguments(0))