尝试在VBScript中使用Shell对象和FileSystemObject进行文件操作



我正在尝试递归地遍历数百个目录和数千个JPG文件,以便按日期收集新文件夹中的文件。到目前为止,我能够使用Shell命名空间对象单独GetDetailsOf文件,并且还能够使用FileSystemObject递归地遍历目录。但是,当我尝试将它们放在函数等中时,当我试图从照片中获取DateTaken属性时,我什么也得不到。

下面是我的代码:
sFolderPathspec = "C:LocationOfFiles"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objDir = objFSO.GetFolder(sFolderPathspec)
Dim arrFiles()

getInfo(objDir)
Sub getInfo(pCurrentDir)
    fileCount = 0
    For Each strFileName In pCurrentDir.Files
        fileCount = fileCount + 1
    Next
    ReDim arrFiles(fileCount,2) 
    i=0
    For Each aItem In pCurrentDir.Files
        wscript.Echo aItem.Name
        arrFiles(i,0) = aItem.Name
        strFileName = aItem.Name
        strDir = pCurrentDir.Path
        wscript.echo strDir
        dateVar = GetDatePictureTaken(strFileName, strDir)  
        'dateVar = Temp2 & "_" & Temp3 & "_" & Temp1
        arrFiles(i,1) = dateVar
        WScript.echo i & "." & "M:" & monthVar & " Y:" & yearVar
        WScript.echo i & "." & strFileName & " : " & arrFiles(i,1) & " : " & dateVar
        i=i+1
    Next
    For Each aItem In pCurrentDir.SubFolders
       'wscript.Echo aItem.Name & " passing recursively"
       getInfo(aItem)
    Next
End Sub
Function GetDatePictureTaken(strFileName, strDir)
    Set objShell = CreateObject ("Shell.Application")
    Set objCurrFolder = objShell.Namespace(strDir)
    'wscript.Echo cstr(objCurrFolder.GetDetailsOf(strFileName, 12))
    strFileNameDate = cstr(objCurrFolder.GetDetailsOf(strFileName, 12))
    strFileNameDate = CleanNonDisplayableCharacters(strFileNameDate)
    arrDate = split(strFileNameDate, "/")
    '''FAILS HERE WITH A SUBSCRIPT OUT OF RANGE ERROR SINCE IT GETS NULL VALUES BACK FROM THE GET DETAILS OF FUNCTION'''
    monthVar = arrDate(0)
    yearVar = arrDate(1)
    dayVar = arrDate(2)
    GetDatePictureTaken = monthVar & "" & dayVar & "" & yearVar
End Function

Function CleanNonDisplayableCharacters(strInput)
      strTemp = ""
      For i = 1 to len(strInput)
          strChar = Mid(strInput,i,1)
          If Asc(strChar) < 126 and not Asc(strChar) = 63 Then
              strTemp = strTemp & strChar
          End If
      Next
      CleanNonDisplayableCharacters = strTemp
End Function

访问arrDate(0)时出现"Subscript out of range"错误,原因是arrDate为空(UBound(arrDate) == -1)。由于分割非空字符串将返回一个数组,即使没有找到分隔符,并且尝试分割Null将引发"Invalid use of Null"错误,我们可以确定strFileNameDate是"。

可能的原因:

  1. "拍摄日期"的索引是25 (XP)而不是12 (win7)——或者盖茨先生在win8中想到的任何东西。
  2. 未填写DPT属性
  3. 你的清理功能搞砸了。

您必须测试包含有效日期的strFileNameDate,并决定在哪里放置没有有效DPT的文件。

注:您应该考虑使用

来代替递归循环。
dir /s/b path*.jpg > pictures.txt

并处理该文件

最新更新