Объект не поддерживает это свойство или метод: oFldr.GetFolder

#vbscript

#vbscript

Вопрос:

Я продолжаю получать ошибку в этой функции в моем коде.

 Function Recurse(oFldr)
    If IsAccessible(oFldr.GetFolder(sSearchRoot)) Then
        For Each oSubFolder In oFldr.SubFolders
            Recurse oSubFolder

            'For Each oFile In oFldr.Files  
            For Each oFile In oFldr.Files

                If LCase(oFSO.GetExtensionName(oFile)) = "txt" Then
                    ContentSearchTxt(oFile)
                End If

                If LCase(oFSO.GetExtensionName(oFile)) = "doc" Or "docx" Then
                    ContentSearchWord(oFile)
                End If

                If LCase(oFSO.GetExtensionName(oFile)) = "xls" Or "xlsx" Then
                    ContentSearchExcel(oFile)
                End If
            Next
        Next
    End If
End Function
  

Ошибка, похоже, возникает при моем первом if statement :

 If IsAccessible(oFldr.GetFolder(sSearchRoot)) Then
  

Я действительно новичок в использовании VBS, и мне было интересно, сможет ли кто-нибудь подтолкнуть меня в правильном направлении для начала?

Комментарии:

1. Кроме того, вы не можете этого сделать: If LCase(oFSO.GetExtensionName(oFile)) = "xls" Or "xlsx" . Каждое OR предложение должно быть полным выражением. Лучшей реализацией может быть использование Select Case инструкции. Затем вы можете перечислить каждое расширение. Например: Select Case LCase(oFSO.GetExtensionName(oFile)) а затем перечислите ваши операторы обращения: Case "doc", "docx" , Case "xls", "xlsx" и т.д. Case инструкции позволяют вам указывать только то значение, которое вы пытаетесь сопоставить.

Ответ №1:

.GetFolder — это метод FileSystemObject. Поэтому измените

 If IsAccessible(oFldr.GetFolder(sSearchRoot)) Then
  

Для

 If IsAccessible(oFSO.GetFolder(sSearchRoot)) Then
  

где oFSO определяется как

 Set oFSO = CreateObject("Scripting.FileSystemObject")
  

Комментарии:

1. Спасибо за ответ. Когда я это делаю, я получаю еще одно сообщение об ошибке Object required: 'oFldr' . Хочу ли я изменить все экземпляры oFldr на oFSO be? Я чувствую, что это было бы не так, поскольку oFSO не поддерживало бы .Files

2. @scapegoat17 — нет, просто внесите одно изменение, о котором я упоминаю. (Или используйте FSO, который у вас, вероятно, есть в любом случае)

3. Будет ли эта ошибка выше связана с чем-то другим? например, не удается найти файлы в этом расположении?

4. @scapegoat17 — Object required: 'oFldr' означает: oFldr не является объектом. Учитывая код, с которого вы начали, я подозреваю, что вы изменили имя параметра на свою функцию.

5.Это то, что я делаю до моей функции: Set oFSO = CreateObject( "Scripting.FileSystemObject" ) Set oFldr = oFSO.GetFolder(StartDir) Recurse(oFldr) Recurse(oFSO.GetFolder(sSearchRoot))

Ответ №2:

Проблема, скорее всего, в параметре, который вы передаете этой функции.

Перед Function Recurse(oFldr)

Добавить

 Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFldr = oFSO.GetFolder("C:Root_Dir_To_Recurse")
Recurse oFldr
  

Также, когда функция вызывается таким образом, оператор If не требуется.

«Следующий» в вашем для каждой папки операционной системы находится в неправильном месте.

Кроме того, у вас также есть ошибки в ваших операторах «Или». Вот модифицированная версия вашей функции с комментариями If и End If. Операторы OR также были изменены. Вы не можете просто использовать ИЛИ указать другое значение, вы должны выполнить ИЛИ другое условие, а не просто другое значение.

Вот модифицированная версия вашей функции. Поскольку эта функция не имеет возвращаемого значения, я бы также посоветовал вам изменить ее на подпрограмму следующим образом:

 Sub Recurse(oFldr)
    'If IsAccessible(oFldr.GetFolder(sSearchRoot)) Then
        For Each oSubFolder In oFldr.SubFolders
            Recurse oSubFolder
        Next

            'For Each oFile In oFldr.Files  
            For Each oFile In oFldr.Files

                If LCase(oFSO.GetExtensionName(oFile)) = "txt" Then
                    ContentSearchTxt(oFile)
                End If

                If LCase(oFSO.GetExtensionName(oFile)) = "doc" Or LCase(oFSO.GetExtensionName(oFile)) = "docx" Then
                    ContentSearchWord(oFile)
                End If

                If LCase(oFSO.GetExtensionName(oFile)) = "xls" Or LCase(oFSO.GetExtensionName(oFile)) ="xlsx" Then
                    ContentSearchExcel(oFile)
                End If
            Next

    'End If
End Sub
  

Комментарии:

1. Я выполнил следующее в соответствии с тем, что вы сказали, но я все еще получаю сообщение об ошибке Object required: 'oFldr' . Есть идеи?

2. Спасибо, теперь я понимаю, и протестировал это на своем компьютере, а также обнаружил другие проблемы в коде. Я обновил свой ответ тем, что я нашел.