1

Тема: VBS: Структура кода с большим количеством if,for,else

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

Код вырос уже до 800 строк одних условий и по моим подсчетам еще около 1000 нужно прибавить что б до конца все описать условие которые указаны в конфигурационном файле.

Иногда допускаю некоторые ошибки, которые потом в результате отладка занимает очень большое количество времени.
Кто может чего посоветовать для оптимального написания и что б можно было потом быстро в нем ориентироваться?

Пример как примерно все выглядит :



Do
    For условие
        If условеи
            
            If условеи
            
                If условеи
                
                Else
                
                End If
            
            Else

                If условеи

                    If условеи
                    
                    Else
                    
                    End If
                
                Else
                
                    If условеи
                    
                        If условеи
                            For условие
                                If условеи
                                
                                Else
                                
                                End If
                            Next
                        Else
                        
                        End If
                    
                    Else
                    
                    End If
                
                End If
            
            End If
            
        Else
        
        End If
    Next
Loop условие

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

Старался использовать отступы, но чем условий становится больше тем сложнее найти логическую ошибку.
Кто что сможет посоветовать?

2

Re: VBS: Структура кода с большим количеством if,for,else

Не берусь утверждать, что это решит все проблемы, но думаю во многом поможет. По хорошему конечно нужно видеть Ваш скрипт.

1) Для удобства, код поделить на осмысленные процедуры.

2) Добавить комментарии. Желательно после каждой строки кода и у каждого заголовка процедуры / функции. Чтобы в дальнейшем было понятно для чего нужна та или иная функция или строка кода. Совсем хорошо, если ещё с пояснением причины. Возвращаясь к коду через пару месяцев, гораздо проще разобраться в причине своих решений.

3) Условия заменить, по возможности, на однострочные If a < 3 Then Exit Sub

4) Однотипные проверки из блока условий вытащить в функции.

5) Постараться избавиться от циклов Do Loop, там где это возможно.

Вот пример того как я стараюсь писать код:


Option Explicit

main()

Sub main()
    Dim sLog            'Переменная буфер для записи лога
    Dim arrProxyList    'Массив прокси
    Dim sProxy          'элемент перебора массива прокси

    'Тестовый массив прокси
    arrProxyList = Array("192.168.0.1:8080",_
                        "192.168.0.2:8080",_
                        "255.168.0.3:c",_
                        "192.255.0.4:8080",_
                        "s",_
                        "192.168.0.6:8080")

    'Перебор прокси массива
    For Each sProxy in arrProxyList
        if isValidProxy(sProxy) Then sLog = sLog & sProxy & vbCrlf
    Next

    'Выводим лог
    MsgBox sLog
End Sub

'Функция проверки прокси на валидность
Function isValidProxy(ByVal sStr)
    Dim arrStr, sAddress, sPort, sElement
    'По умолчанию выставляем значение возврата false. На случай если выход из функции произойдёт в середине.
    isValidProxy = false
    'Делим строку по двоеточию
    arrStr = Split(sStr, ":")
    'Если при делении не получилось 2 элемента (так как "<> 1" отсчёт идёт от нуля)
    if Ubound(arrStr) <> 1 Then Exit Function
    'Запоминаем в переменные элементы массива, чтобы можно было  
    sAddress = arrStr(0)
    sPort = arrStr(1)
    'Делим адрес на 4 элемента 
    arrStr = Split(sAddress, ".")
    'Проверяем количество элементов в массиве.
    if Ubound(arrStr) <> 3 Then Exit Function
    'Проверяем значения октетов на валидность  
    For Each sElement in arrStr
        if Not isPositiveInteger(sElement) Then Exit Function
        'Проверяем на пренадлежность диапазону
        if sElement < 0 or sElement => 255 Then Exit Function
    Next
    'Вычисляем числовое представление IP
    sAddress = arrStr(0) * 256 ^ 3 + arrStr(1) * 256 ^ 2 + arrStr(2) * 256 + arrStr(3)
    'Проверяем на диапазон адресов с 1.0.0.1 до 223.255.255.254
    if sAddress < 16777217 or sAddress > 3758096382 Then Exit Function
    'Проверяем на валидность значения порта (целое и положительное)
    If Not isPositiveInteger(sPort) Then Exit Function
    'Проверяем принадлежность диапазону доступных портов
    If sPort < 0 or sPort > 65536 Then Exit Function
    'Возвращаем успешный результат проверки
    isValidProxy = True
End Function

'Функция проверки значения на целое и положительность
Function isPositiveInteger(sStr)
    'Выставляем значение по умолчанию
    isPositiveInteger = False
    'Проверяем является ли значение числом
    if Not isNumeric(sStr) Then Exit Function
    'Проверяем положительное ли значение
    if sStr < 0 Then Exit Function
    'Проверяем целочисленное ли значение
    If CStr(Clng(sStr)) <> sStr Then Exit Function
    'В случае прохождения всех проверок возвращаем True
    isPositiveInteger = True
End Function

P.S Если скрипт пишет логи, то сделать функцию AppendToLog(), которая будет многократно вызываться в коде. Её можно настроить на удобное форматирование лога.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3

Re: VBS: Структура кода с большим количеством if,for,else

Не хотел выкладывать код потому что врят ли кто в нем сможет разобраться, но по крайней мере понять почерк написания думаю можно будет понять. И если что тыкнуть пальцем что здесь я не прав. Прошу сильно не ругать изучаю VBS месяца 2 - 3 этот код пишу уже 3й день.


По поводу логов я еще до этого не дошел  в этом модуле в другом использую Ваше решение заполняю данными многомерный массив.

Post's attachments

2.zip 5.72 kb, 9 downloads since 2014-03-28 

You don't have the permssions to download the attachments of this post.

4

Re: VBS: Структура кода с большим количеством if,for,else

Почему избавляться от Do loop ?

5

Re: VBS: Структура кода с большим количеством if,for,else

wildwolf007 пишет:

Почему избавляться от Do loop ?

Потому что Do Loop по сути "опасная конструкция". Бесконечный цикл, который может быть остановлен условием, опаснее цикла с ограниченным числом итераций, так как шанс того что условие либо ошибочное либо может не наступить по каким-то причинам довольно высок при отладке. Конечно и цикл с ограниченным количеством итераций можно загнать в бесконечность, но такой шанс гораздо ниже.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

6 (изменено: Rom5, 2014-03-28 19:58:56)

Re: VBS: Структура кода с большим количеством if,for,else

Отступы, стараюсь использовать всегда. Размер отступа для меня оптиальный - 2 символа.
Если использовать редакторы специализированые для исходников, то они могут сворачивать структурные блоки кода.
В завершающих операторах (End*, Next и т.п.) бывает дублирую условие из оператора сравнения - для наглядности.

WBR. Roman

7

Re: VBS: Структура кода с большим количеством if,for,else

Отступы проставляю табулятором наверное много.

8

Re: VBS: Структура кода с большим количеством if,for,else

Xameleon пишет:

Не берусь утверждать, что это решит все проблемы, но думаю во многом поможет.

Я согласен со всем, кроме пп. 3 и 5. Некорректные посылы.

wildwolf007 пишет:

Отступы проставляю табулятором наверное много.

Это правильно. Любой вменяемый редактор позволяет задавать «размер» табулятора:

+ открыть спойлер

http://img594.imageshack.us/img594/1986/7bjj.png

9 (изменено: wildwolf007, 2014-03-29 10:31:23)

Re: VBS: Структура кода с большим количеством if,for,else

Спасибо всем очень много дельных советов.

Rom5 пишет:

Если использовать редакторы специализированые для исходников, то они могут сворачивать структурные блоки кода.
В завершающих операторах (End*, Next и т.п.) бывает дублирую условие из оператора сравнения - для наглядности.

Спасибо помогло. Чето не обращал внимание на это ранее.

Rom5 пишет:

В завершающих операторах (End*, Next и т.п.) бывает дублирую условие из оператора сравнения - для наглядности.

Вы проставляете условие в виде комментария я правильно Вас понял?

Скажите, а никто не использовал протоколирование выполнения кода? Ну например команда выполнилась появилась запись в текстовичке типа тото, тото выполнено успешно такой-то такой-то строки.

10 (изменено: Rumata, 2014-03-29 10:44:02)

Re: VBS: Структура кода с большим количеством if,for,else

Согласен с несогласием коллеги alexii. И дополнительно: пункт 2. Именно эта фраза тоже сомнительный совет:

Добавить комментарии. Желательно после каждой строки кода

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

+ оффтоп

alexii, как называется используемая Вами раскраска колорера?

( 2 * b ) || ! ( 2 * b )

11

Re: VBS: Структура кода с большим количеством if,for,else

wildwolf007 пишет:

Скажите, а никто не использовал протоколирование выполнения кода? Ну например команда выполнилась появилась запись в текстовичке типа тото, тото выполнено успешно такой-то такой-то строки.

Вы точно указали основной метод отладки скриптов — «WScript.Echo» .

2Rumata:

+ открыть спойлер

«Gray a'la DN». Поскольку я сделал себе серую раскраску для самого Far Manager'a:

http://img35.imageshack.us/img35/6466/ewig.png

и использую «старую» палитру от Win9x для окна консоли Far Manager'а:
http://img837.imageshack.us/img837/271/79ao.png

(на стандартной палитре моя раскраска «сливается») — то и для редактора подобрал «серый» стиль.

12

Re: VBS: Структура кода с большим количеством if,for,else

Если выносить все в функцию, то можно вынести с несколькими параметрами, а как получить результат по каждому параметру ?



Call Check (1,2,3,4,5)

MsgBox Check

Function Check (P1,P2,P3,P4,P5)
P1 = 2
P2 = 3
P3 = 4
P4 = 5
P5 = 6

Check = Check (P1,P2,P3,P4,P5)

End Function

13

Re: VBS: Структура кода с большим количеством if,for,else

wildwolf007
Приведите лучше корректный пример, ибо то, что приведено, решается обычным цикл-счётчиком For...To.

14 (изменено: wildwolf007, 2014-03-29 15:42:09)

Re: VBS: Структура кода с большим количеством if,for,else

Я вызываю функцию с параметрами эти параметры изменяются в функции и как потом их считать получить результат по данным параметрам? Значения это не цифры это могут всевозможные параметры например путь к файлу или какое-то название параметра.

Сейчас мне приходится объявлять еще дополнительные переменные  или массив.

Например:


Dim R1,R2,R3,R4,R5

Call Check (1,2,3,4,5)

MsgBox R1
MsgBox R2
MsgBox R3
MsgBox R4
MsgBox R5

Function Check (P1,P2,P3,P4,P5)
R1 = P1 + 1
R2 = P2 + 1
R3 = P3 + 1
R4 = P4 + 1
R5 = P5 + 1

End Function

Или
Приходится парсить строку.



' Я передаю в функцию 5 параметров
Call Check (1,2,3,4,5)

Dim DataFromFunction
DataFromFunction = Split(DataFileSend,";")

msgBox DataFromFunction(0)
msgBox DataFromFunction(1)
msgBox DataFromFunction(2)
msgBox DataFromFunction(3)
msgBox DataFromFunction(4)

MsgBox Check

Function Check (P1,P2,P3,P4,P5)

Dim R1,R2,R3,R4,R5

R1 = P1 + 1
R2 = P2 + 1
R3 = P3 + 1
R4 = P4 + 1
R5 = P5 + 1

Check = R1 &";" &R2 &";" &R3 &";" &R4 &";" &R5

End Function

Или



Dim Massiv(4)
' Я передаю в функцию 5 параметров
Call Check (1,2,3,4,5)

msgBox Massiv(0)
msgBox Massiv(1)
msgBox Massiv(2)
msgBox Massiv(3)
msgBox Massiv(4)

MsgBox Check

Function Check (P1,P2,P3,P4,P5)

Massiv(0) = P1 + 1 
Massiv(1) = P2 + 1
Massiv(2) = P3 + 1
Massiv(3) = P4 + 1
Massiv(4) = P5 + 1

End Function

15

Re: VBS: Структура кода с большим количеством if,for,else

wildwolf007, подозреваю, что есть возможность решить эту задачу иначе. ТЗ имеется или подобное описание алгоритма ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

16 (изменено: wildwolf007, 2014-03-30 08:53:57)

Re: VBS: Структура кода с большим количеством if,for,else

Городил "городушки" что-то изобретал придумывал. 

Оптимизировал как Вы писали вроде стало легче. А то одних условий на 1500 строк это сложно 3 дня не мог разобрать, что сам написал. Тз точного нет, но есть задача оптимизировать что б файлы из одной группы папок попадали в другую, а если в другой нет места или  занята или не доступен ресурс или уже есть такой файл, то не попадали или выполнялись какие-то условия и только потом попадали. Ну это в кратце.

Спасибо еще раз за помощь.

Вот что получилось:

+ открыть спойлер

Do
    Dim a
    For a=0 To Ubound(Division,2) Step 1
        Dim NextCheck
        NextCheck = 0
        
        'Удаление пустых папок
        Set FolderDel = objFso.GetFolder(PutNacop &"\" &Division(3,a))
        Set CollectionFolderDel = FolderDel.SubFolders
        For Each FolderDel In CollectionFolderDel
            If FolderDel.Size = 0 Then
                WScript.Sleep 1000
                objFso.DeleteFolder FolderDel, 1
            End If
        Next
        
        
        If NextCheck = 0 Then
            'Создание папок структуры подразделений в каталоге NACOP
            If Not objFSO.FolderExists(PutNacop &"\" &Division(3,a)) Then
                objFso.CreateFolder PutNacop &"\" &Division(3,a)
                NextCheck = 1
            End If
        End If
        
        
        If NextCheck = 0 Then
            Call FillSortBufferMassiv(Division(3,a))
            If Ubound(SortBufferMassiv,1) = -1 Then
                WScript.Echo "Правил для данной папки нет" 
                NextCheck = 1
            End If
        End If
        
        
        If NextCheck = 0 Then
            If SortBufferMassiv(0,0) = "" Then
                WScript.Echo "В конфигурационном файле не указано название папки подразделения" 
                NextCheck = 1
            End If
        End If
        
        
        If NextCheck = 0 Then
            'Проверка нет ли пустого поля в отсортированном значении 
            If SortBufferMassiv(1,0) = "" Then
                WScript.Echo "В конфигурационном файле не указано подразделение копирования" 
                NextCheck = 1
            End If
        End If
        
        
        If NextCheck = 0 Then
            If SortBufferMassiv(2,0) = "" Then
                WScript.Echo "В конфигурационном файле не указано создаются ли файлы с папкой поступления или нет" 
                NextCheck = 1
            End If
        End If
        
        
        If NextCheck = 0 Then
            If SortBufferMassiv(3,0) = "" Then
                WScript.Echo "В конфигурационном файле не указано путь размещения лога подразделения" 
                NextCheck = 1
            End If
        End If
        
        
        If NextCheck = 0 Then
            If Ubound(SortBufferMassiv,2) > 0 Then
                WScript.Echo "В конфигурационном файле правил для данной папки больше одного" 
                NextCheck = 1
            End If
        End If
        
        
        If NextCheck = 0 Then
            If Not objFSO.FolderExists(SortBufferMassiv(1,0)) Then
                objFso.CreateFolder SortBufferMassiv(1,0)
            End If
        End If
        
        
        If NextCheck = 0 Then
            If Not objFSO.FolderExists(SortBufferMassiv(1,0)) Then
                WScript.Echo "Путь указанный в конфигурационном файле нет доступа к сетевому ресурсу " 
                NextCheck = 1
            End If
        End If
        
        
        If NextCheck = 0 Then
            If Not objFSO.FolderExists(PutArchiveBuffer) Then
                objFso.CreateFolder PutArchiveBuffer
            End If
        End If
        
        
        If NextCheck = 0 Then
            If Not objFSO.FolderExists(PutArchiveBuffer) Then
                objFso.CreateFolder PutArchiveBuffer
                NextCheck = 1
            End If
        End If
        
        
        If NextCheck = 0 Then
            Erase FileMassiv
            reDim preserve FileMassiv(-1)
            'Запуск рекурсии по каталогу для нахождения файлов и помещения в массив FileMassiv() с полным путем нахождения
            Call CheckFolderInFolder (PutNacop &"\" &Division(3,a) &"\")
            If Ubound(FileMassiv,1) = -1 Then
                WScript.Echo "Файлов в данном каталоге нет" 
                NextCheck = 1
            End IF
        End If
        
        
        If NextCheck = 0 Then
            Dim b
            For b=0 To Ubound(FileMassiv) Step 1
            
                NextCheck = 0
                
                If NextCheck = 0 Then
                    Set FolderArchiveBuffer = objFso.GetDrive(objFso.GetDriveName(PutArchiveBuffer))
                    Set FolderOtdel = objFso.GetDrive(objFso.GetDriveName(SortBufferMassiv(1,0)))
                    Set FileNacop = objFso.GetFile(FileMassiv(b))
                    
                    If FileNacop.Size > FolderArchiveBuffer.FreeSpace Then
                        WScript.Echo "Нет места в архиве" 
                        NextCheck = 1
                    End If
                    
                    If FileNacop.Size > FolderOtdel.FreeSpace Then
                        WScript.Echo "Нет места в подразделении" 
                        NextCheck = 1
                    End If
                End If
                
                If NextCheck = 0 Then
                    If SortBufferMassiv(2,0) = "Yes" Then
                    
                        NameDDMMYYYY = TakeFolderData
                        NameHHNNSS = TakeFolderTime
                        
                        Set FileNacop = objFso.GetFile(FileMassiv(b))
                        
                        '*****Блок копирования в архив буфера
                        If not objFSO.FolderExists(PutArchiveBuffer &"\" &NameDDMMYYYY) Then
                        WScript.Echo "Создание папки =" &PutArchiveBuffer &"\" &NameDDMMYYYY &"="
                            objFso.CreateFolder PutArchiveBuffer &"\" &NameDDMMYYYY
                        End If
                        
                        'Переменная необходима для проверки есть ли файл с таким именем или нет в архиве 0 нет дубля, 1 есть дубль
                        Set FolderArchiveCopy = objFso.GetFolder(PutArchiveBuffer &"\" &NameDDMMYYYY)
                        Set CollectionFileArchiveCopy = FolderArchiveCopy.Files
                        DecisionOfCopyToArchive = 0
                        For each FileArchiveCopy In CollectionFileArchiveCopy
                            If FileArchiveCopy.Name = FileNacop.Name Then
                                DecisionOfCopyToArchive = 1
                            End If
                        Next
                        'Если дубль с таким именем файла есть, то сработает условие else и будет создана папка дубля если нет папка создана не будет.
                        If DecisionOfCopyToArchive = 0 Then
                        WScript.Echo "Производим копирование файла =" &FileNacop &"= в директорию архива =" &PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &"="
                            WScript.Echo "Производим копирование файла из накопа в архив"
                            FileNacop.Copy PutArchiveBuffer &"\" &NameDDMMYYYY &"\"
                            WScript.Echo "Выполнено копирование в архив."
                        Else
                        WScript.Echo "Не производим перенос файла =" &FileNacop &"= в директорию =" &PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &"= файл с таким именем уже имеется в директории"
                            Set CollectionFolderArchiveCopy = FolderArchiveCopy.SubFolders
                            e = -1
                            'Производим поиск папки если такая папка существует, то тогда проверяет следующую папку под следующим номером
                            Do
                                StopFound = 0
                                e = e + 1
                                'Имя папки поиска e число
                                CreateFolderName = "DBL" &e
                                For Each SubFoldersFound In CollectionFolderArchiveCopy
                                    If SubFoldersFound.Name = CreateFolderName Then
                                        ' если папка найдена, изменяем переменную цикл Do продолжается
                                        StopFound = 1
                                    End If
                                Next
                            Loop While (StopFound = 1 )
                            WScript.Echo "Имя папки которую нужно создать =" &CreateFolderName &"="
                            If not objFSO.FolderExists(PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &CreateFolderName) Then
                                objFso.CreateFolder PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &CreateFolderName
                            End If
                            'Создаем папку с дублем куда будем копировать в архив
                            'производим копирование файла из накопа в архив
                            WScript.Echo "Производим копирование файла =" &FileNacop &"= в директорию архива =" &PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &CreateFolderName &"\" &"="
                            FileNacop.Copy PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &CreateFolderName &"\"
                        End IF
                        
                        '*****Блок переноса в подразделение
                        If Not objFSO.FolderExists(SortBufferMassiv(1,0)) Then
                        WScript.Echo "Создание папки =" &SortBufferMassiv(1,0) &"="
                            objFso.CreateFolder SortBufferMassiv(1,0)
                        End If
                        
                        If Not objFSO.FolderExists(SortBufferMassiv(1,0) &"\" &NameDDMMYYYY) Then
                        WScript.Echo "Создание папки =" &SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"="
                            objFso.CreateFolder SortBufferMassiv(1,0) &"\" &NameDDMMYYYY
                        End If
                        
                        'Проверка была ли создана папка или нет.Если создана, то переносим файл
                        If Not objFSO.FolderExists(SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS) Then
                        WScript.Echo "Создание папки =" &SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS &"="
                            objFso.CreateFolder SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS
                            WScript.Echo "Производим перенос файла =" &FileNacop &"= в директорию подразделения =" &SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS &"\" &"="
                            FileNacop.Move SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS &"\"
                            NextCheck = 1
                        Else
                        WScript.Echo "Не удалось создать папку данная папка уже существует =" &SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS &"="
                            'Проверка есть ли в данной папке дубли с таким именем файлов или нет 
                            Set FolderOtdelName = objFso.GetFolder(SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS)
                            Set CollectionFileOtdelMove = FolderOtdelName.Files
                            DecisionOfMoveToOtdel = 0
                            For each FileOtdelMove In CollectionFileOtdelMove
                                If FileOtdelMove.Name = FileNacop.Name Then
                                    DecisionOfMoveToOtdel = 1
                                End If
                            Next
                            
                            If DecisionOfMoveToOtdel = 0 Then
                            WScript.Echo "Производим перенос файла =" &FileNacop &"= в директорию подразделения =" &SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS &"\" &"="
                                'Перенос файла
                                FileNacop.Move SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS &"\" 
                                NextCheck = 1
                            Else
                            WScript.Echo "Создаем папку дубликата"
                                'Производим поиск папки если такая папка существует, то тогда проверяет следующую папку под следующим номером
                                Set CollectionFolderOtdelName = FolderOtdelName.SubFolders
                                e = -1
                                Do
                                    StopFound = 0
                                    e = e + 1
                                    'Имя папки поиска e число
                                    CreateFolderName = "DBL" &e
                                    For Each SubFoldersFound In CollectionFolderOtdelName
                                        If SubFoldersFound.Name = CreateFolderName Then
                                            ' если папка найдена, изменяем переменную цикл Do продолжается
                                            StopFound = 1
                                        End If
                                    Next
                                Loop While (StopFound = 1 )
                                'WScript.Echo "Папка которую нужно создать " &CreateFolderName
                                'Создаем папку с дублем куда будем копировать файл в отдел
                                If not objFSO.FolderExists(SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS &"\" &CreateFolderName) Then
                                    objFso.CreateFolder SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS &"\" &CreateFolderName
                                End If
                                'производим перенос файла из накопа в отдел с папкой дублем DBL 
                                WScript.Echo "Производим перенос файла =" &FileNacop &"= в директорию подразделения =" &SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS &"\" &CreateFolderName &"\" &"="
                                FileNacop.Move SortBufferMassiv(1,0) &"\" &NameDDMMYYYY &"\" &NameHHNNSS &"\" &CreateFolderName &"\"
                                NextCheck = 1
                            End If
                        End If
                    End If
                End If
                
                
                
                If NextCheck = 0 Then
                    If SortBufferMassiv(2,0) = "No" Then
                    
                        NameDDMMYYYY = TakeFolderData
                        NameHHNNSS = TakeFolderTime
                        
                        Set FileNacop = objFso.GetFile(FileMassiv(b))
                        
                        '*****Блок копирования в архив буфера
                        If not objFSO.FolderExists(PutArchiveBuffer &"\" &NameDDMMYYYY) Then
                        WScript.Echo "Создание папки =" &PutArchiveBuffer &"\" &NameDDMMYYYY &"="
                            objFso.CreateFolder PutArchiveBuffer &"\" &NameDDMMYYYY
                        End If
                        
                        'Переменная необходима для проверки есть ли файл с таким именем или нет в архиве 0 нет дубля, 1 есть дубль
                        Set FolderArchiveCopy = objFso.GetFolder(PutArchiveBuffer &"\" &NameDDMMYYYY)
                        Set CollectionFileArchiveCopy = FolderArchiveCopy.Files
                        DecisionOfCopyToArchive = 0
                        For each FileArchiveCopy In CollectionFileArchiveCopy
                            If FileArchiveCopy.Name = FileNacop.Name Then
                                DecisionOfCopyToArchive = 1
                            End If
                        Next
                        'Если дубль с таким именем файла есть, то сработает условие else и будет создана папка дубля если нет папка создана не будет.
                        If DecisionOfCopyToArchive = 0 Then
                        WScript.Echo "Производим копирование файла =" &FileNacop &"= в директорию архива =" &PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &"="
                            'Производим копирование файла из накопа в архив 
                            FileNacop.Copy PutArchiveBuffer &"\" &NameDDMMYYYY &"\"
                            WScript.Echo "Выполнено копирование архив."
                        Else
                        WScript.Echo "Не производим перенос файла =" &FileNacop &"= в директорию =" &PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &"= файл с таким именем уже имеется в директории"
                            Set CollectionFolderArchiveCopy = FolderArchiveCopy.SubFolders
                            e = -1
                            'Производим поиск папки если такая папка существует, то тогда проверяет следующую папку под следующим номером
                            Do
                                StopFound = 0
                                e = e + 1
                                'Имя папки поиска e число
                                CreateFolderName = "DBL" &e
                                For Each SubFoldersFound In CollectionFolderArchiveCopy
                                    If SubFoldersFound.Name = CreateFolderName Then
                                        ' если папка найдена, изменяем переменную цикл Do продолжается
                                        StopFound = 1
                                    End If
                                Next
                            Loop While (StopFound = 1 )
                            WScript.Echo "Имя папки которую нужно создать =" &CreateFolderName &"="
                            If not objFSO.FolderExists(PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &CreateFolderName) Then
                                objFso.CreateFolder PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &CreateFolderName
                            End If
                            'Создаем папку с дублем куда будем копировать в архив
                            'производим копирование файла из накопа в архив
                            WScript.Echo "Производим копирование файла =" &FileNacop &"= в директорию архива =" &PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &CreateFolderName &"\" &"="
                            FileNacop.Copy PutArchiveBuffer &"\" &NameDDMMYYYY &"\" &CreateFolderName &"\"
                        End IF
                        
                        '*****Блок переноса в подразделение
                        'Проверка была ли создана папка или нет.Если создана, то переносим файл
                        If Not objFSO.FolderExists(SortBufferMassiv(1,0)) Then
                        WScript.Echo "Создание папки =" &SortBufferMassiv(1,0) &"="
                            objFso.CreateFolder SortBufferMassiv(1,0)
                            WScript.Echo "Производим перенос файла =" &FileNacop &"= в директорию подразделения =" &SortBufferMassiv(1,0) &"="
                            FileNacop.Move SortBufferMassiv(1,0) &"\"
                            NextCheck = 1
                        Else
                        WScript.Echo "Не удалось создать папку данная папка уже существует =" &SortBufferMassiv(1,0) &"="
                            'Проверка есть ли в данной папке дубли с таким именем файлов или нет 
                            Set FolderOtdelName = objFso.GetFolder(SortBufferMassiv(1,0))
                            Set CollectionFileOtdelMove = FolderOtdelName.Files
                            DecisionOfMoveToOtdel = 0
                            For each FileOtdelMove In CollectionFileOtdelMove
                                If FileOtdelMove.Name = FileNacop.Name Then
                                    DecisionOfMoveToOtdel = 1
                                End If
                            Next
                            
                            If DecisionOfMoveToOtdel = 0 Then
                            WScript.Echo "Производим перенос файла =" &FileNacop &"= в директорию подразделения =" &SortBufferMassiv(1,0) &"\" &"="
                                'Перенос файла
                                FileNacop.Move SortBufferMassiv(1,0) &"\" 
                                NextCheck = 1
                            Else
                            WScript.Echo "Создаем папку дубликата"
                                'Производим поиск папки если такая папка существует, то тогда проверяет следующую папку под следующим номером
                                Set CollectionFolderOtdelName = FolderOtdelName.SubFolders
                                e = -1
                                Do
                                    StopFound = 0
                                    e = e + 1
                                    'Имя папки поиска e число
                                    CreateFolderName = "DBL" &e
                                    For Each SubFoldersFound In CollectionFolderOtdelName
                                        If SubFoldersFound.Name = CreateFolderName Then
                                            ' если папка найдена, изменяем переменную цикл Do продолжается
                                            StopFound = 1
                                        End If
                                    Next
                                Loop While (StopFound = 1 )
                                'WScript.Echo "Папка которую нужно создать " &CreateFolderName
                                'Создаем папку с дублем куда будем копировать файл в отдел
                                If not objFSO.FolderExists(SortBufferMassiv(1,0) &"\" &CreateFolderName) Then
                                    objFso.CreateFolder SortBufferMassiv(1,0) &"\" &CreateFolderName
                                End If
                                'производим перенос файла из накопа в отдел с папкой дублем DBL 
                                WScript.Echo "Производим перенос файла =" &FileNacop &"= в директорию подразделения =" &SortBufferMassiv(1,0) &"\" &CreateFolderName &"\" &"="
                                FileNacop.Move SortBufferMassiv(1,0) &"\" &CreateFolderName &"\"
                                NextCheck = 1
                            End If
                        End If
                    End If
                End If
                
            Next
        End If
    Next

    WScript.Echo Date
    WScript.Echo time
    WScript.Echo "Следующий запуск через " &TimeRepeat &" ms"
    WScript.Sleep TimeRepeat
    cls
    
Loop While Close = 0

'Процедура очистки экрана cls
Sub Cls()
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
    WshShell.Exec("mode.com con: lines=0").StdOut.ReadAll
End Sub

Хотя уже чисто спортивный интерес, что может возвращать функция  помимо строки значений?

17 (изменено: Rumata, 2014-03-30 09:42:29)

Re: VBS: Структура кода с большим количеством if,for,else

Полагаю, что организация кода в виде серии вложенных циклов и десятка внутренних однотипных проверок Do For If NextCheck = 0 говорит о некорректной реализации алгоритма.

wildwolf007, сформулируйте задачу предельно точно - мы поможем с реализацией алгоритма.

что может возвращать функция  помимо строки значений?

Зависит от языка. Функция в VBS может возвращать любое значение - скаляр, массив, объект.

( 2 * b ) || ! ( 2 * b )

18

Re: VBS: Структура кода с большим количеством if,for,else

wildwolf007: Что может возвращать функция  помимо строки значений?

Rumata: Зависит от языка. Функция в VBS может возвращать любое значение - скаляр, массив, объект.

Я создал свою функцию и хочу что б она мне вернула скаляр, массив, объект. Как ?

Алгоритм сейчас опишу.

19

Re: VBS: Структура кода с большим количеством if,for,else

В принципе уже все дописал и все работает, но как всегда остался спортивный интерес, а как бы можно было б еще построить алгоритм  по другому?

P.S. дописываю другие модули в которых данная информация может очень сильно помочь.

Поставленная задача:

+ открыть спойлер

"A" -  конфигурационный файл в нем описаны названия папок и принадлежность к определенному подразделению.

Текстовичек DataSend.txt

Название 1 для подразделение 1 ;Название 2 для подразделение 1 ;Название 3 для подразделение 1 ;TB-001(название папки)
---; - конец конфигурационного файла ниже идет описание.



"B" -  конфигурационный файл в нем описаны настройки для каждого подразделения.

Текстовичек DataBuffer.txt

TB-001;D:\OTDEL\TB-001\IN;Yes;D:\OTDEL\TB-001\LOG
---; - конец конфигурационного файла ниже идет описание.


";" -разделитель



TB-001                         - название папки.
D:\OTDEL\TB-001\IN             - путь куда будет все копироваться
Yes или No                     - будут ли создаваться папки со временем или нет
D:\OTDEL\TB-001\LOG            - размещение журнала

D:\NACOP\TB-001 - это так называемый буффер  здесь находятся и собираются файлики, а в конфиге есть путь куда эти файлики должны попасть в зависимости от имени папки.

D:\Archive\ - во время перемещения из NACOP в OTDEL(или по пути указанному в конфиге) копия файлика должна попадать в архив.

Ведение журнала передачи:
D:\LOG\LOG
D:\LOG\LOG_OTDEL
D:\LOG\ARCHIVE

Ну и + еще один путь который копируется D:\LOG\LOG_OTDEL в подразделение указанное в настройке конфигурационного файла "В"



Алгоритм:

1) Считывание данных из конфигурационного файла "A" в массив Division(a,b) a - количество столбцов, b - количество строк (в нашем случае 4 столбца )
2) Считывание данных из конфигурационного файла "В" в массив BufferMassiv(a,b) a - количество столбцов, b - количество строк
3) Создаем структуру каталогов в NACOP по массиву Division(a,b)
4) Считываем папку 1
5) Проверяем есть ли настройка для данной папки по имени папки
6) Если нет пропускаем данную папку переходим к следующей, Если больше одной настройки сообщение об ошибке, если одна записываем настройку в массив SORTBufferMassiv(a,b)
7) Проверка записанных в каждом столбце данных. Проверка существуют ли данные пути или нет, Проверка YES No(если указано что-то другое выводим ошибку),Если нет записей в каком-то столбце выдаем так же ошибку, если в случае некорректной проверки выдаем ошибки.
8) Проводим рекурсию по каталу в котором сейчас находитмя если находятся файлы начинаем обработку.
9) считываем данные файла найденной по рекурсии размер.
10 Проверяем есть ли доступ к каталогу архива и к каталогу куда необходимо переместить.
11) Проверяем есть ли место в каталоге архива и в каталоге куда нужно переместить обрабатываемый файл если нет пропускаем файл переходим к следующему.
12) если есть место в архиве и каталоге куда необходимо переместить Считываем настройку YES или NO (создавать каталоги с датой и временем или нет)
13) Если выбрано YES, то производим создание каталогов со временем и датой если выбрано нет, то не создаем.
14) Если в архиве есть такой файл создаем каталог DBL0 если данный каталог существует создаем DBL1 и т.д. с то же самое и с каталогом куда необходимо переместить.
15) Производим перемещение файла.
16) создаем запись лога о передаче в архив D:\Archive\
17) Создаем общий журнал и заносим туда информацию о том что по данному подразделению произвели перенос.D:\LOG\LOG
18) создаем журнал только по данному подразделению D:\LOG\LOG_OTDEL
19) Производим сверку только что созданного журнала с существующим журналом по конфигурационному файлу D:\OTDEL\TB-001\LOG

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

20

Re: VBS: Структура кода с большим количеством if,for,else

Я создал свою функцию и хочу что б она мне вернула скаляр, массив, объект. Как ?

WScript.Echo TypeName(MyFN1())
WScript.Echo TypeName(MyFN2())
WScript.Echo TypeName(MyFN3())

WScript.Quit

Function MyFN1()
    MyFN1 = "Scalar"
End Function

Function MyFN2()
    MyFN2 = Array("Scalar", "Scalar")
End Function

Function MyFN3()
    Set MyFN3 = WScript.CreateObject("Scripting.FileSystemObject")
End Function

21

Re: VBS: Структура кода с большим количеством if,for,else

alexii  -  Спасибо.

22

Re: VBS: Структура кода с большим количеством if,for,else

А если обычный массив ? Чет у меня не получается.




For each t in MyFN4()
    WScript.Echo t
Next

WScript.Quit


Function MyFN4()
    dim r(1)
    r(0) = 1
    r(1) = 2
    Set MyFN4 = r()
End Function

23

Re: VBS: Структура кода с большим количеством if,for,else

Присвоение через Set относится к объектам. Для массивов достаточно MyFN4 = r

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

24 (изменено: Rom5, 2014-03-31 11:08:57)

Re: VBS: Структура кода с большим количеством if,for,else

wildwolf007 пишет:
Rom5 пишет:

В завершающих операторах (End*, Next и т.п.) бывает дублирую условие из оператора сравнения - для наглядности.

Вы проставляете условие в виде комментария я правильно Вас понял?

Да. Например:


If fso.FileExists( "test.txt" )
    ' [...]'
    Do While not fspi.AtEndOfStream
        ' [...]'
        For i=1 To 10
            ' [...]'
            ' [...]'
        NEXT i
    Loop 'not fspi.AtEndOfStream
    If a>b Then
        ' [...]'
    Else 'a>b'
        ' [...]'
        If b>c Then
            ' [...]'
        End IF 'b>c'
    End IF 'a>b'
End IF 'fso.FileExists( "test.txt" )

т.е. и по самих завершающих операторах становится более менее понятно, что это был за цикл или условие. Конечно, это имеет смысл, если много вложенных условий/циклов с многострочным исполняющимся кодом.


Если функции действительно нужно возвращать несколько разноплановых значений, то, думаю, будет удобно использовать объект Словаря - Объект Dictionary.

Принявшему такой объект-результат коду будет удобно проверить и наличие установленніх ключей-результата и получение самих значений наглядно - по имени ключа.

WBR. Roman

25 (изменено: wildwolf007, 2014-03-31 11:25:52)

Re: VBS: Структура кода с большим количеством if,for,else

Интересный подход, но не знаю как у Вас, а у меня когда когда попробовал воспользоваться Вашим методом код стал казаться сильно "перегруженым" и стал тяжелее для восприятия.
Воспользовался другим способом:

При написании использую NotePade++ данная программа позволяет производить сворачивание кода и при сворачивании можно добавлять описания по каждому условию используя разные отступы





If условие Then
'Пояснение
      Код выполнения
Else
'Пояснение
      Код выполнения
End If
'Пояснение


т.к. использовали отступ для "Код выполнения", а для "Пояснения" не использовали отступ, то при сворачивании  условия IF и Else сразу все понятно. Тоже самое и для For.
После сворачивания:


If условие Then
'Пояснение
Else
'Пояснение
End If
'Пояснение

Но для себя я понял если IF становится больше 5 то данный код уже становится тяжело восприимчив и нужно использовать рекомендации Xameleon 1 и 4  + использовать маленькие блоки проверки каждого условия как я указывал "If NextCheck = 0 Then" пример в посте 16.

Такой код очень прост для понимания и не нужно особо глубоко в него вникать и дописывать что-то дополнительное очень просто. Хотя в данном случае возможно страдает производительность из-за дополнительного условия, но не факт не проверял.

Никакого другого метода для большого количества условий и циклов пока больше никто не предложил.

26

Re: VBS: Структура кода с большим количеством if,for,else

Лучше так:

If условие Then 'Пояснение
      Код выполнения
Else 'Пояснение
      Код выполнения
End If

если IF становится больше … и нужно … использовать маленькие блоки проверки каждого условия

Дело не в маленьких или больших блоках.

27

Re: VBS: Структура кода с большим количеством if,for,else

Перечитывал тему и хотел все ж таки уяснить для себя как  правильно писать код с большим количеством if,for,else?


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

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

Здесь я привожу пример и привожу доводы почему у меня возник данный вопрос:

Использовал всевозможные задачи по обработке на файловом уровне. Ну например стоит задача выполнить какую-то операцию по обработке какого-то процесса.

В параметром файле есть 10 параметров, которые нельзя структурировать по какому-либо принципу:
1) параметр - каталог откуда файлики забираются
2) параметр - куда файлики поступают
3) параметр - программа при помощи которой производится проверка.
4) параметр - директория размещения протокола проверки
5) параметр - директория хранения протокола обработки для пользователя
6) параметр - директория хранения общего протокола по обработке по всем пользователям
7) параметр - директория возврата файлов в случае некорректной проверки программой
8) параметр - установка времени ожидания перед началом обработки
9) параметр - именование файлов
10) параметр -  создания директории со временем

Таким образом получается если будем строить обработку при помощи принципа многократного вложения if for else друг в друга как я уже писал в посте 3, IF откроется на 1й строке и закроется только на 1500 строке, а внутри него будет около 10 уровней вложенных условий который еще будут вложены друг в друга и зрительно будет очень сложно прослеживать эти вложенности что б не допустить ошибку в алгоритме.

Я использовал последовательный принцип проверки по условиям с маленькими блоками проверки введением 1й переменной, которая принимает единицу или нолик в зависимости корректно ли завершился блок или нет. ну например нужно считать все 10 параметров и проверить их перед использованием маленькими блоками:



        If NextCheck = 0 Then
            If Not objFSO.FolderExists(SortBufferMassiv(3,0)) Then
                call CreateFolderTree (SortBufferMassiv(3,0))
                if RetCode <> 0 Then
                    WScript.Echo "Путь указанный в конфигурационном файле для лога нет доступа к сетевому ресурсу "  
                    NextCheck = 1
                End If
            End If
        End If

1) Нужно считать первый параметр.
2) Проверить  корректно ли указан параметр. Например есть ли доступ к ресурсу.
3) Проверить есть ли возможность чтение удаление.
4) Проверить есть ли там файл
5) Проверить не занял ли данный файл

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

Вот и получается 1 параметр мы проверили  5-ю условиями, а у нас 10 параметров и получается будет очень много условий для проверки всех параметров перед использованием.

28 (изменено: Serge Yolkin, 2014-07-19 22:57:07)

Re: VBS: Структура кода с большим количеством if,for,else

Если задача чисто академическая (или спортивная) - сделать именно так, то я разбил бы прверку на ряд функций с вызовом одной из другой: функция, проверяющая первый параметр вызывает функцию, провряющую существование папки, имя которой передано ей в качестве параметра, а эта функция может вызываться и из других функций. Ну, и т.д. Комментарий для функции + комментарий для её вызова, чтобы не мотать код туда-сюда.
Если же вопрос "как бы сделал я", то для первого параметра я бы сразу проверил доступность файла/ов в обёртке try, а в catch вернул бы то, что покажет остальному коду некорректность первого параметра... Ну и далее. Надо определить, какая информация из проверок действительно необходима для дальнейшей обработки, а какая избыточна. Если "файлики забирать" нельзя, какая разница - почему? Нельзя и баста.

29

Re: VBS: Структура кода с большим количеством if,for,else

Serge Yolkin, увы, в VBScript отсутствует удобное средство в виде «try…catch…finally».

30 (изменено: Serge Yolkin, 2014-07-20 14:43:06)

Re: VBS: Структура кода с большим количеством if,for,else

Упс... Как же там люди живут?

Ещё и && с || нет... Не понимаю...

31

Re: VBS: Структура кода с большим количеством if,for,else

Эти-то есть вроде. Нету & и |.

32

Re: VBS: Структура кода с большим количеством if,for,else

YMP пишет:

Эти-то есть вроде. Нету & и |.

оффтопа немножко

Хммм. Имеется в виду побитовые И/ИЛИ ?


Как я понимаю, в приведённом ниже фрагменте (vbs in hta) полученнное мною значение "intUAC" проверяется как раз наподобие js-ного "&" - см. конструкции "If (intUAC AND 2) OR (....."


'--- отключенность учетки'
intUAC=objRSet.Fields("userAccountControl")

'--- отображение отключенности у/з'
If intUAC AND 2 Then
    tLT_infoUsrAcc.innerHTML = tLT_infoUsrAcc.innerHTML & "This Account -- DISABLED !!!"
End If

'Вывод даты отключения, если учетка уже отключена либо эта дата - в прошлом или сегодняшняя, но не равна 01.01.1970 / 01.01.1601'
' // при проверке с текущей датой не учитываем разницу в 3 дня -- для отображения отключения в ближайшем будущем'
If (intUAC AND 2) OR ( ( CDate(Left(sDtAccExpire,10)) <= CDate(date() + 3) ) _
    AND ( CDate(Left(sDtAccExpire,10))<>CDate("01/01/1970") ) _
    AND ( CDate(Left(sDtAccExpire,10))<>CDate("01/01/1601") ) ) Then
    tLT_infoUsrAcc.innerHTML = tLT_infoUsrAcc.innerHTML & Left(sDtAccExpire,10)
End IF
    

Логические и побитовые операторы в Visual Basic

WBR. Roman

33

Re: VBS: Структура кода с большим количеством if,for,else

Serge Yolkin пишет:

....
то для первого параметра я бы сразу проверил доступность файла/ов в обёртке try, а в catch вернул бы то, что покажет остальному коду некорректность первого параметра...

Ну, пускай именно не полное подобие функционала обёртки try, но пробовать открыть файл на запись в VBS с временным отключением прерываний по ошибкам выполнения и проверкой наличия кода ошибки ведь можно ж.

msdn - On Error Statement
Или речь не об этом?

WBR. Roman

34

Re: VBS: Структура кода с большим количеством if,for,else

Об этом. И о разнице между простым и понятным обработчиком, скажем:

var oFSO=WScript.CreateObject('Scripting.FileSystemObject');
try {
    with (oFSO.OpenTextFile('c:\\boot.ini')) {
        var sContent=ReadAll();
        Close();
    }
} catch (e) {
    var sContent='';
} finally {
    WScript.Echo('['+sContent+']');
}

и громадьём кода в:

Option Explicit

Dim objFSO
Dim objTS
Dim strContent

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

On Error Resume Next
Set objTS = objFSO.OpenTextFile("c:\boot.ini")

If Err.Number = 0 Then
    On Error Goto 0
    strContent = objts.ReadAll()
    objTS.Close
Else
    Err.Clear
    On Error Goto 0
    strContent = ""
End If

WScript.Echo "[" & strContent & "]"

WScript.Quit 0

35

Re: VBS: Структура кода с большим количеством if,for,else

Rom5 пишет:
YMP пишет:

Эти-то есть вроде. Нету & и |.

Хммм. Имеется в виду побитовые И/ИЛИ ?

Да, они. Видимо, в VBS логические от побитовых отличаются как-то по контексту. Или ХЗ.

36

Re: VBS: Структура кода с большим количеством if,for,else

YMP
Я имел в виду возможность не проверять "лишние" условия, легко могу ошибится, но, кажется, Basic проверяет второе условие после And даже если первое ложно, в отличие от JS. Впрочем, ни на чём не настаиваю ввиду незнания Васика.
Применительно к данной теме намекал на конструкцию вида

if(chk1()&&chk2()...)mainProc(arg1,arg2,...)

Rom5
Вероятно, речь именно об этом, но лучше пусть выскажутся знатоки Basic'а. А то я тут уже отметился