Board logo

标题: [技术讨论] VBS脚本String()字符串数组怎样读取其值 [打印本页]

作者: czjt1234    时间: 2024-9-20 22:23     标题: VBS脚本String()字符串数组怎样读取其值

今天在测试FolderItem.ExtendedProperty方法时,发现了vbs的String()字符串数组类型
但是无法读取其值

比如 C:\Users\Administrator\Desktop\1.docx
在文档里面随便打几个字,然后,文件 属性 详细信息 作者 就可以读写了
  1. s = "C:\Users\Administrator\Desktop\1.docx"
  2. Set oFSO = CreateObject("Scripting.FileSystemObject")
  3. Set oShell = CreateObject("Shell.Application")
  4. Set oFolder = oShell.NameSpace(oFSO.GetParentFolderName(s))
  5. Set oFolderItem = oFolder.ParseName(oFSO.GetFileName(s))
  6. s = oFolderItem.ExtendedProperty("DocAuthor")
  7. MsgBox TypeName(s)    'String()
  8. MsgBox  VarType(s)    '8200 = vbArray + vbString
复制代码
但是试了半天都无法读取其值
作者: flashercs    时间: 2024-9-20 22:38

  1. s = oFolderItem.ExtendedProperty("System.Author")
复制代码
或者
  1. 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
  1. //  Name:     System.Size -- PKEY_Size
  2. //  Type:     UInt64 -- VT_UI8
  3. //  FormatID: (FMTID_Storage) {B725F130-47EF-101A-A5F1-02608C9EEBAC}, 12 (PID_STG_SIZE)
复制代码
Size类型是uint64,而vbs不支持此数据类型,故VarType=19,而TypeName异常.而uint64其实可以通过CDbl()转换成Double;
  1. //  Name:     System.Author -- PKEY_Author
  2. //  Type:     Multivalue String -- VT_VECTOR | VT_LPWSTR  (For variants: VT_ARRAY | VT_BSTR)  Legacy code may treat this as VT_LPSTR.
  3. //  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 编辑
  1. $oshell=new-object -comobject shell.application
  2. $s="C:\Users\xx\Desktop\1.docx"
  3. $ofolder=$oshell.NameSpace(17)
  4. $ofolderitem=$ofolder.ParseName($s)
  5. $ss=$ofolderitem.ExtendedProperty("DocArthor")
  6. $ss.GetType()
  7. #IsPublic IsSerial Name                                     BaseType
  8. #-------- -------- ----                                     --------
  9. #True     True     String[]                                 System.Array
  10. $ss.length
  11. #1
复制代码

用c#鼓捣半天总是报错
  1.     [DispId(1610809345)]
  2.     [return: MarshalAs(UnmanagedType.Struct)]
  3.     object ExtendedProperty([In][MarshalAs(UnmanagedType.BStr)] string bstrPropName);
复制代码
vbs的ubound函数可以正常使用至于为什么会是个string()可能是允许一个文档有多个作者吧
作者: flashercs    时间: 2024-9-21 14:21

回复 7# jyswjjgdwtdtj

"DocAuthor"本来就是返回string();
  1. dynamic shell =Microsoft.VisualBasic.Interaction.CreateObject("Shell.Application");
复制代码
直接用Late binding (Dynamic binding)要简单的多,后面跟vbs一样操作.
作者: jyswjjgdwtdtj    时间: 2024-9-21 14:31

回复 8# flashercs


   我试图这样
  1.         String s = s = @"C:\Users\xx\Desktop\1.docx";
  2.         var ofolder =(new Shell32.Shell()).NameSpace(17);
  3.         var ofolderitem = (Shell32.FolderItem2)ofolder.ParseName(s);
  4.         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 编辑

不用猜了
  1. public static VariantType VarType(object VarName) {
  2.     if (VarName == null) {
  3.         return VariantType.Object;
  4.     }
  5.     return VarTypeFromComType(VarName.GetType());
  6. }
  7. internal static VariantType VarTypeFromComType(Type typ) {
  8.     if ((object) typ == null) {
  9.         return VariantType.Object;
  10.     }
  11.     if (typ.IsArray) {
  12.         typ = typ.GetElementType();
  13.         if (typ.IsArray) {
  14.             return (VariantType) 8201;
  15.         }
  16.         VariantType variantType = VarTypeFromComType(typ);
  17.         if ((variantType & VariantType.Array) != 0) {
  18.             return (VariantType) 8201;
  19.         }
  20.         return variantType | VariantType.Array;
  21.     }
  22.     if (typ.IsEnum) {
  23.         typ = Enum.GetUnderlyingType(typ);
  24.     }
  25.     if ((object) typ == null) {
  26.         return VariantType.Empty;
  27.     }
  28.     switch (Type.GetTypeCode(typ)) {
  29.         case TypeCode.String:
  30.             return VariantType.String;
  31.         case TypeCode.Int32:
  32.             return VariantType.Integer;
  33.         case TypeCode.Int16:
  34.             return VariantType.Short;
  35.         case TypeCode.Int64:
  36.             return VariantType.Long;
  37.         case TypeCode.Single:
  38.             return VariantType.Single;
  39.         case TypeCode.Double:
  40.             return VariantType.Double;
  41.         case TypeCode.DateTime:
  42.             return VariantType.Date;
  43.         case TypeCode.Boolean:
  44.             return VariantType.Boolean;
  45.         case TypeCode.Decimal:
  46.             return VariantType.Decimal;
  47.         case TypeCode.Byte:
  48.             return VariantType.Byte;
  49.         case TypeCode.Char:
  50.             return VariantType.Char;
  51.         case TypeCode.DBNull:
  52.             return VariantType.Null;
  53.         default:
  54.             if ((object) typ == typeof(Missing) || (object) typ == typeof(Exception) || typ.IsSubclassOf(typeof(Exception))) {
  55.                 return VariantType.Error;
  56.             }
  57.             if (typ.IsValueType) {
  58.                 return VariantType.UserDefinedType;
  59.             }
  60.             return VariantType.Object;
  61.     }
  62. }
  63. public enum VariantType {
  64.     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
  65. }
复制代码
这里的short对应vbsint interger对于vbslong




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2