【问题标题】:Trying to use Shell object and FileSystemObject in VBScript for file manipulation尝试在 VBScript 中使用 Shell 对象和 FileSystemObject 进行文件操作
【发布时间】:2013-01-10 06:30:12
【问题描述】:

我正在尝试递归循环数百个目录和数千个 JPG 文件,以收集按日期对新文件夹中的文件进行排序。到目前为止,我能够使用 Shell NameSpace 对象单独 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

【问题讨论】:

    标签: vbscript windows-shell filesystemobject


    【解决方案1】:

    访问 arrDate(0) 时出现“下标超出范围”错误是由于 arrDate 为空 (UBound(arrDate) == -1)。由于对非空字符串的拆分将返回一个数组,即使未找到分隔符,并且尝试拆分 Null 将引发“无效使用 Null”错误,我们可以确定 strFileNameDate 为“”。

    可能的原因:

    1. “拍摄日期”的索引是 25 (XP) 而不是 12 (Win 7) - 或者是盖茨先生想到的 Win 8。
    2. DPT 属性未填写。
    3. 您的清洁功能搞砸了。

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

    附:而不是进行递归循环,您应该考虑使用

    dir /s/b path\*.jpg > pictures.txt
    

    并处理该文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-19
      • 2021-02-07
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多