#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. Спасибо, теперь я понимаю, и протестировал это на своем компьютере, а также обнаружил другие проблемы в коде. Я обновил свой ответ тем, что я нашел.