标题: [技术讨论] VBS脚本String()字符串数组怎样读取其值 [打印本页]
作者: czjt1234 时间: 2024-9-20 22:23 标题: VBS脚本String()字符串数组怎样读取其值
今天在测试FolderItem.ExtendedProperty方法时,发现了vbs的String()字符串数组类型
但是无法读取其值
比如 C:\Users\Administrator\Desktop\1.docx
在文档里面随便打几个字,然后,文件 属性 详细信息 作者 就可以读写了- s = "C:\Users\Administrator\Desktop\1.docx"
- Set oFSO = CreateObject("Scripting.FileSystemObject")
- Set oShell = CreateObject("Shell.Application")
- Set oFolder = oShell.NameSpace(oFSO.GetParentFolderName(s))
- Set oFolderItem = oFolder.ParseName(oFSO.GetFileName(s))
- s = oFolderItem.ExtendedProperty("DocAuthor")
- MsgBox TypeName(s) 'String()
- MsgBox VarType(s) '8200 = vbArray + vbString
复制代码
但是试了半天都无法读取其值
作者: flashercs 时间: 2024-9-20 22:38
- s = oFolderItem.ExtendedProperty("System.Author")
复制代码
或者- s = oFolderItem.ExtendedProperty("{F29F85E0-4FF9-1068-AB91-08002B27B3D9}, 4")
复制代码
作者: czjt1234 时间: 2024-9-21 05:14
本帖最后由 czjt1234 于 2024-9-21 05:44 编辑
回复 2# flashercs
也是一样的啊,无法读取String()的具体的值
还有
s = FolderItem.ExtendedProperty("Size")
这个TypeName(s)不能读取类型,报错
VarType(s)返回值为19
这是个什么类型?
MsgBox s 能正确显示数值
作者: flashercs 时间: 2024-9-21 08:10
回复 3# czjt1234 - // Name: System.Size -- PKEY_Size
- // Type: UInt64 -- VT_UI8
- // FormatID: (FMTID_Storage) {B725F130-47EF-101A-A5F1-02608C9EEBAC}, 12 (PID_STG_SIZE)
复制代码
Size类型是uint64,而vbs不支持此数据类型,故VarType=19,而TypeName异常.而uint64其实可以通过CDbl()转换成Double;- // Name: System.Author -- PKEY_Author
- // Type: Multivalue String -- VT_VECTOR | VT_LPWSTR (For variants: VT_ARRAY | VT_BSTR) Legacy code may treat this as VT_LPSTR.
- // FormatID: (FMTID_SummaryInformation) {F29F85E0-4FF9-1068-AB91-08002B27B3D9}, 4 (PIDSI_AUTHOR)
复制代码
string()不能识别估计是因为VT_LPWSTR/VT_BSTR这两种字符串类型?
这些都可以被powershell正确识别
作者: czjt1234 时间: 2024-9-21 08:16
回复 4# flashercs
感谢
作者: flashercs 时间: 2024-9-21 08:23
回复 5# czjt1234
测试在vba中可以读取string()值的.
作者: jyswjjgdwtdtj 时间: 2024-9-21 13:13
本帖最后由 jyswjjgdwtdtj 于 2024-9-21 13:34 编辑
- $oshell=new-object -comobject shell.application
- $s="C:\Users\xx\Desktop\1.docx"
- $ofolder=$oshell.NameSpace(17)
- $ofolderitem=$ofolder.ParseName($s)
- $ss=$ofolderitem.ExtendedProperty("DocArthor")
- $ss.GetType()
- #IsPublic IsSerial Name BaseType
- #-------- -------- ---- --------
- #True True String[] System.Array
- $ss.length
- #1
复制代码
用c#鼓捣半天总是报错
- [DispId(1610809345)]
- [return: MarshalAs(UnmanagedType.Struct)]
- object ExtendedProperty([In][MarshalAs(UnmanagedType.BStr)] string bstrPropName);
复制代码
vbs的ubound函数可以正常使用至于为什么会是个string()可能是允许一个文档有多个作者吧
作者: flashercs 时间: 2024-9-21 14:21
回复 7# jyswjjgdwtdtj
"DocAuthor"本来就是返回string();- dynamic shell =Microsoft.VisualBasic.Interaction.CreateObject("Shell.Application");
复制代码
直接用Late binding (Dynamic binding)要简单的多,后面跟vbs一样操作.
作者: jyswjjgdwtdtj 时间: 2024-9-21 14:31
回复 8# flashercs
我试图这样- String s = s = @"C:\Users\xx\Desktop\1.docx";
- var ofolder =(new Shell32.Shell()).NameSpace(17);
- var ofolderitem = (Shell32.FolderItem2)ofolder.ParseName(s);
- var ss = ofolderitem.ExtendedProperty("DocAuthor");
复制代码
作者: czjt1234 时间: 2024-9-22 08:14
ExtendedProperty("System.Photo.ISOSpeed")
VarType(s)返回值为18
这个又是什么类型?
作者: czjt1234 时间: 2024-9-22 09:41
根据7楼的代码,VarType(s)返回值为18是无符号双字节整数
本来以为VarType(s)返回值为19是用户自定义类型的,看来19就是无符号八字节整数
作者: jyswjjgdwtdtj 时间: 2024-9-22 21:51
本帖最后由 jyswjjgdwtdtj 于 2024-9-22 21:53 编辑
不用猜了- public static VariantType VarType(object VarName) {
- if (VarName == null) {
- return VariantType.Object;
- }
- return VarTypeFromComType(VarName.GetType());
- }
- internal static VariantType VarTypeFromComType(Type typ) {
- if ((object) typ == null) {
- return VariantType.Object;
- }
-
- if (typ.IsArray) {
- typ = typ.GetElementType();
- if (typ.IsArray) {
- return (VariantType) 8201;
- }
-
- VariantType variantType = VarTypeFromComType(typ);
- if ((variantType & VariantType.Array) != 0) {
- return (VariantType) 8201;
- }
-
- return variantType | VariantType.Array;
- }
-
- if (typ.IsEnum) {
- typ = Enum.GetUnderlyingType(typ);
- }
-
- if ((object) typ == null) {
- return VariantType.Empty;
- }
-
- switch (Type.GetTypeCode(typ)) {
- case TypeCode.String:
- return VariantType.String;
- case TypeCode.Int32:
- return VariantType.Integer;
- case TypeCode.Int16:
- return VariantType.Short;
- case TypeCode.Int64:
- return VariantType.Long;
- case TypeCode.Single:
- return VariantType.Single;
- case TypeCode.Double:
- return VariantType.Double;
- case TypeCode.DateTime:
- return VariantType.Date;
- case TypeCode.Boolean:
- return VariantType.Boolean;
- case TypeCode.Decimal:
- return VariantType.Decimal;
- case TypeCode.Byte:
- return VariantType.Byte;
- case TypeCode.Char:
- return VariantType.Char;
- case TypeCode.DBNull:
- return VariantType.Null;
- default:
- if ((object) typ == typeof(Missing) || (object) typ == typeof(Exception) || typ.IsSubclassOf(typeof(Exception))) {
- return VariantType.Error;
- }
-
- if (typ.IsValueType) {
- return VariantType.UserDefinedType;
- }
-
- return VariantType.Object;
- }
- }
- public enum VariantType {
- Empty = 0, Null = 1, Short = 2, Integer = 3, Single = 4, Double = 5, Currency = 6, Date = 7, String = 8, Object = 9, Error = 10, Boolean = 11, Variant = 12, DataObject = 13, Decimal = 14, Byte = 17, Char = 18, Long = 20, UserDefinedType = 36, Array = 8192
- }
复制代码
这里的short对应vbsint interger对于vbslong
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |