2013-06-26 2 views
0

я написал следующую подпрограмму:Чтобы влезть в подпапки внутри папки в vbscript?

Sub Openf(fldr,fso,ByRef newf) 
    Dim subf,fpath,ext,fname,IsDone 
    Set subf=fldr.SubFolders 
    If(Not subf Is Nothing) Then 
    For Each sf in subf 
     fpath=fso.GetAbsolutePathName(sf.Path) 
     fname=fso.GetBaseName(fpath) 
     If(StrComp(fname,"mm")=0) Then 
     IsDone=Delfldr(sf.SubFolders,fso,newf) 
     End If 
     Openf sf,fso,newf 
    Next 
    Else 
    Set subf=fldr.Files 
    For Each sf in subf 
     fpath=fso.GetAbsolutePathName(sf.Path) 
     ext=CStr(fso.GetExtensionName(fpath)) 
     If(StrComp(ext,"tar.gz")=0) Then 
     Delfile subf,fso,newf 
     End If 
    Next 
    End If 
End Sub 

Предполагается рекурсивно перебрать все вложенные папки в данной папке и останавливается, когда больше нет вложенных папок не могут быть найдены. На этом уровне он должен получить коллекцию файлов, которые будут присутствовать (с расширением tar.gz), а затем вызвать подпрограмму Delfile. Еще одно условие заключается в том, что вложенные папки в папке mm должны быть удалены напрямую (с использованием функции Delfldr), не вдаваясь в них до уровня, на котором можно найти файлы.

Проблема в том, что удаляются только папки в папках mm. Скрипт, похоже, не проходит через другие подпапки, которые присутствуют на том же уровне, что и папка mm. Другими словами, файлы с расширением tar.gz не удаляются.

Иерархия выглядит следующим образом:

C:\backups → c6,mm → es → at01 → files with tar.gz extension

Кроме того, существует ли эквивалент return() заявления в VBScript? Первоначально я думал, что проблема заключается в том, что элемент управления не возвращался обратно в вызывающий оператор после выполнения подпрограммы Delfldr. Поэтому я заменил его на функцию и вернул значение bool в IsDone, думая, что оно вернет управление в подпрограмму Openf. Однако это не сработало.

+0

Отклоните свой код; это так нечитаемо – Bathsheba

+0

Пожалуйста, воздержитесь от того, чтобы ваш вопрос был менее читаемым, чем раньше. По крайней мере, если вы ожидаете, что кто-то ответит. –

ответ

1

Я вижу 2 проблемы с процедурой:

  1. SubFolders всегда Folders коллекция, поэтому sf никогда не будет Nothing и ваш код никогда не войдет в Else ветвь (таким образом, никогда не обрабатывать любые файлы). Изменение состояния с

    Not subf Is Nothing 
    

    в

    fldr.SubFolders.Count > 0 
    
  2. GetExtenstionName() возвращает только один расширение, так GetExtensionName("file.tar.gz") будет производить gz, не tar.gz, так что даже если ваш код вошел в Else ветвь (который Безразлично» t) он все равно не удалит файлы. Вам нужно что-то вроде этого, чтобы извлечь двойные расширения от имени файла:

    ext = fso.GetExtensionName(fso.GetBaseName(fname)) & "." _ 
         & fso.GetExtensionName(fname) 
    

    Кстати, вам не нужно CStr() здесь, так как GetExtensionName() уже возвращает строку.

Что касается вашего вопроса относительно return(): в каком отношении вы имеете в виду «эквивалент»? Если вы хотите, чтобы процедура/функция вернулась к вызывающему абоненту, вы можете сделать это через Exit Sub и Exit Function соответственно. Если вы хотите, чтобы вернуть значение вызывающему абоненту, вы можете сделать это путем присвоения значения имени функции:

Function Foo() 
    Foo = "bar" 
End Function 

Обратите внимание, что последний работает только для функций, а не процедуры. Кроме того, назначение может выполняться в любом месте тела функции, оно не должно быть в конце.

В более общем примечании я бы не использовал StrComp() для сравнения строк, если вы действительно не хотите использовать сравнение 3-го уровня (меньше/равно/больше). Лучше (как в «более читаемом») было бы простым сравнением:

If LCase(ext) = "tar.gz" Then 
+0

Большое спасибо за ваши исправления. Он работает сейчас. – user2522981

 Смежные вопросы

  • Нет связанных вопросов^_^