Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Проверка списка имен в цикле (http://forum.oszone.net/showthread.php?t=274535)

bombording 23-12-2013 14:21 2277239

Проверка списка имен в цикле
 
Добрый день.
Имеется папка с файлами определённой структуры:
Код:

file001.sd
file002.sd
file003.sd

file009.sd
file00a.sd
file00b.sd
file00c.sd
….
file00z.sd
file010.sd
file011.sd
file012.sd
и т.д.

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

Задача:
Проверять все файлы в папке на последовательность. И в случае нарушения последовательности, выдавать ошибку. Например, если в последовательности file001 - file009 не будет файла file003 то выдавалась бы ошибка.

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

Iska 23-12-2013 15:12 2277254

Код:

Option Explicit

Dim strSourceFolder
Dim arr10To36

Dim i, j, k
Dim strFileName


strSourceFolder = "E:\Песочница\0338"
arr10To36 = Split("0;1;2;3;4;5;6;7;8;9;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z", ";")

With WScript.CreateObject("Scripting.FileSystemObject")
        If .FolderExists(strSourceFolder) Then
                For i = 0 To 35
                        For j = 0 To 35
                                For k = 0 To 35
                                        If i = 0 And j = 0 And k = 0 Then
                                        Else
                                                strFileName = "file" & arr10To36(i) & arr10To36(j) & arr10To36(k) & ".sd"
                                               
                                                If Not .FileExists(.BuildPath(strSourceFolder, strFileName)) Then
                                                        WScript.Echo "Can't find file [" & strFileName & "]."
                                                        WScript.Quit 2
                                                End If
                                        End If
                                Next
                        Next
                Next
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 1
        End If
End With

WScript.Quit 0


bombording 23-12-2013 15:40 2277262

Iska, Почему то скрипт упорно хочет найти file010.sd - которого быть не может т.к. после file009.sd идет файл file00a.sd

Iska 23-12-2013 15:47 2277265

Цитата:

Цитата bombording
Iska, Почему то скрипт упорно хочет найти file010.sd - которого быть не может т.к. после file009.sd идет файл file00a.sd »

В Вашем примере файл «file010.sd» есть. В скрипте его наличие проверяется после проверки существования «file00z.sd». Для примера добавим вывод:
Код:

Option Explicit

Dim strSourceFolder
Dim arr10To36

Dim i, j, k
Dim strFileName


strSourceFolder = "E:\Песочница\0338"
arr10To36 = Split("0;1;2;3;4;5;6;7;8;9;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z", ";")

With WScript.CreateObject("Scripting.FileSystemObject")
        If .FolderExists(strSourceFolder) Then
                For i = 0 To 35
                        For j = 0 To 35
                                For k = 0 To 35
                                        If i = 0 And j = 0 And k = 0 Then
                                        Else
                                                strFileName = "file" & arr10To36(i) & arr10To36(j) & arr10To36(k) & ".sd"
                                               
                                                If Not .FileExists(.BuildPath(strSourceFolder, strFileName)) Then
                                                        WScript.Echo "Can't find file [" & strFileName & "]."
                                                        WScript.Quit 2
                                                Else
                                                        WScript.Echo "Find file [" & strFileName & "]."
                                                End If
                                        End If
                                Next
                        Next
                Next
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 1
        End If
End With

WScript.Quit 0

А у Вас?

bombording 23-12-2013 16:10 2277284

Iska, Вы правы. Просто я для теста скрипта скопировал половину файлов.

В таком случае как узнать, какой файл последний и прекратить выполнение скрипта на нём? Ведь файлов каждый раз может быть разное количество. Список может кончаться например и на file02b.sd и на file04s.sd или на другом имени.

Iska 23-12-2013 16:16 2277288

Цитата:

Цитата bombording
В таком случае как узнать, какой файл последний и прекратить выполнение скрипта на нём? Ведь файлов каждый раз может быть разное количество. Список может кончаться например и на file02b.sd и на file04s.sd или на другом имени. »

Это входит в явное противоречие с:
Цитата:

Цитата bombording
Проверять все файлы в папке на последовательность. И в случае нарушения последовательности, выдавать ошибку. »

Надо полагать, теперь условие такое — «перечислить все отсутствующие файлы между первым и последним в алфавитном порядке», так? Я уже как-то делал здесь такое. Осталось найти среди всех своих сообщений :(.

bombording 23-12-2013 17:37 2277348

Iska, Быть может будет проще, посчитать общее количество файлов типа file*.sd и закончить цикл на шаге равном количеству файлов?

Iska 23-12-2013 23:19 2277538

Цитата:

Цитата Iska
Я уже как-то делал здесь такое. Осталось найти среди всех своих сообщений . »

Бесполезно разгребать эти авгиевы конюшни.


Цитата:

Цитата bombording
Iska, Быть может будет проще, посчитать общее количество файлов типа file*.sd и закончить цикл на шаге равном количеству файлов? »

Имеется ряд проблем при реализации такого подхода. «Мы пойдём другим путём».

читать дальше »
Код:

Option Explicit

Dim strSourceFolder
Dim arr10To36

Dim objFSO

Dim x, y, z
Dim i, j, k
Dim strFileName


strSourceFolder = "E:\Песочница\0338"
arr10To36 = Split("0;1;2;3;4;5;6;7;8;9;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z", ";")

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

If objFSO.FolderExists(strSourceFolder) Then
        If ExistLastName(x, y, z) Then
                For i = 0 To x
                        For j = 0 To y
                                For k = 0 To z
                                        If i = 0 And j = 0 And k = 0 Then
                                        Else
                                                strFileName = "file" & arr10To36(i) & arr10To36(j) & arr10To36(k) & ".sd"
                                               
                                                If Not objFSO.FileExists(objFSO.BuildPath(strSourceFolder, strFileName)) Then
                                                        WScript.Echo "Can't find file [" & strFileName & "]."
                                                End If
                                        End If
                                Next
                        Next
                Next
        End If
Else
        WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Function ExistLastName(ByRef x, ByRef y, ByRef z)
        ExistLastName = False
       
        For x = 35 To 0 Step -1
                For y = 35 To 0 Step -1
                        For z = 35 To 0 Step -1
                                If x = 0 And y = 0 And z = 0 Then
                                Else
                                        strFileName = "file" & arr10To36(x) & arr10To36(y) & arr10To36(z) & ".sd"
                                       
                                        If objFSO.FileExists(objFSO.BuildPath(strSourceFolder, strFileName)) Then
                                                ExistLastName = True
                                               
                                                Exit Function
                                        End If
                                End If
                        Next
                Next
        Next
End Function
'=============================================================================


bombording 24-12-2013 10:02 2277670

Iska, Работает! Но честно говоря не до конца понимаю как функция ExistLastName определяет что файл последний? За счет Step -1 ??

Iska 24-12-2013 10:12 2277672

Угу. Тремя вложенными циклами генерирует имена файлов с конца (т.е., с «filezzz.sd») и проверяет их существование. Как только будет найден существующий файл — происходит выход из функции. Поскольку переменные «x», «y» и «z» передаются в параметры функции по ссылке, то значения этих переменных (а не их копий в случае передаче по значению) могут быть изменены внутри функции. Посему после выхода из функции мы имеем в переменных «x», «y» и «z» 36-тиричные цифробуквы, однозначно определяющие последний существующий файл в алфавитном порядке.

bombording 24-12-2013 12:29 2277715

Iska, Большое спасибо! Весьма интересная реализация.

bombording 25-12-2013 15:38 2278357

Iska, Кстати заметил проблему сейчас.

Новая версия скрипта(которая выдергивает имя последнего файла) работает немного не корректно.
Сначала скрипт проверяет цифровые имена 001 - 090
Затем скрипт проверяет имена (буква цифра) 0a1 - 0z9

При этом скрипт не проверяет имена 01a - 09z а так же не проверяет 0aa - 0zz.
Поэтому из 600 моих файлов, скрипт проверил только 100 и успешно завершился.

Хотя старый скрипт, который не проверял последний файл (ваш пост №4), отрабатывал по всем 600 файлам.

P.S. и в переменной arr10To36 две буквы g.

Iska 25-12-2013 15:47 2278363

Цитата:

Цитата bombording
P.S. и в переменной arr10To36 две буквы g. »

Хех. Вот так и рождаются легенды. Замените вторую на «j». Тогда и первые скрипты не должны были корректно работать.

Цитата:

Цитата bombording
Кстати заметил проблему сейчас.
Новая версия скрипта(которая выдергивает имя последнего файла) работает немного не корректно.
Сначала скрипт проверяет цифровые имена 001 - 090
Затем скрипт проверяет имена (буква цифра) 0a1 - 0z9
При этом скрипт не проверяет имена 01a - 09z а так же не проверяет 0aa - 0zz.
Поэтому из 600 моих файлов, скрипт проверил только 100 и успешно завершился.
Хотя старый скрипт, который не проверял последний файл (ваш пост №4), отрабатывал по всем 600 файлам. »

Проверьте работоспособность после внесения исправления замеченной Вами описки.

bombording 25-12-2013 16:38 2278389

Iska, я до тестирования исправил вторую g на j.
Последний скрипт по прежнему проходит по 100 файлам. А вот старый скрипт безупречно отрабатывает на всех 600 файлах.... единственный минус это то что он не знает о последнем файле.

Проблема в том что мой последний файл это:
file0h5.sd

В первом скрипте проверка проходит последовательно:
Сначала с 001 по 009 потом 00a - 00z затем с 010 - 019 и так далее.
Поэтому он захватывает все 600 файлов.

А вот новый скрипт, который проверяет имя последнего файла работает немного по другому:
Сначала с 001 по 090 затем с 0a1 - 0z9 и дойдя до 0h5 (последний файл) успешно останавливается не захватывая остальные файлы с маской 01a - 09z и 0aa - 0zz. Поэтому он и отрабатывает всего около 100 файлов.


Подозреваю что проблема в
Код:

For i = 0 To x
                        For j = 0 To y
                                For k = 0 To z

Если подставить вместо x,y,z - 35, то все работает. Но не работает проверка на последний файл... :(

Iska 25-12-2013 16:45 2278391

bombording, ясно. Я посмотрю.

bombording 26-12-2013 15:36 2278869

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

Я тут сделал данную проверку. Но к сожалению умения хватило только на подсчет файлов по расширению....а не по маске file*.sd

Код:

Option Explicit

Dim strSourceFolder
Dim arr10To36

Dim i, j, k
Dim strFileName

Dim fso,f1,s1,o,n

strSourceFolder = "D:\!Project\script"
arr10To36 = Split("0;1;2;3;4;5;6;7;8;9;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z", ";")

' count files
o = 0
n = 0
Set fso = CreateObject("Scripting.FileSystemObject")
For Each f1 in fso.GetFolder(strSourceFolder).Files
If InStr(1,f1.name,".sd",0) Then
        o = o + 1
End If
Next


With WScript.CreateObject("Scripting.FileSystemObject")
        If .FolderExists(strSourceFolder) Then
                For i = 0 To 35
                        For j = 0 To 35
                                For k = 0 To 35
                                        If i = 0 And j = 0 And k = 0 Then
                                        Else
                                                If n < o Then
                                                        strFileName = "file" & arr10To36(i) & arr10To36(j) & arr10To36(k) & ".sd"
                                                       
                                                        If Not .FileExists(.BuildPath(strSourceFolder, strFileName)) Then
                                                                WScript.Echo "Can't find file [" & strFileName & "]."
                                                                WScript.Quit 2
                                                        Else
                                                                n = n + 1
                                                        End If
                                                End If
                                        End If
                                Next
                        Next
                Next
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 1
        End If
End With
WScript.Quit 0


Iska 27-12-2013 08:08 2279225

Цитата:

Цитата bombording
А вот новый скрипт, который проверяет имя последнего файла работает немного по другому:
Сначала с 001 по 090 затем с 0a1 - 0z9 »

Нет.

Я создал весь перечень из 46655 [36^3 - 1] файлов:
читать дальше »
Код:

Option Explicit

Dim strSourceFolder
Dim arr10To36

Dim objFSO

Dim i, j, k
Dim strFileName


strSourceFolder = "E:\Песочница\0339"
arr10To36 = Split("0;1;2;3;4;5;6;7;8;9;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z", ";")

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

If objFSO.FolderExists(strSourceFolder) Then
        For i = 0 To 35
                For j = 0 To 35
                        For k = 0 To 35
                                If i = 0 And j = 0 And k = 0 Then
                                Else
                                        strFileName = "file" & arr10To36(i) & arr10To36(j) & arr10To36(k) & ".sd"
                                       
                                        With objFSO.CreateTextFile(objFSO.BuildPath(strSourceFolder, strFileName))
                                                .Close
                                        End With
                                       
                                        WScript.Echo strFileName
                                End If
                        Next
                Next
        Next
Else
        WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================



Затем проверил Ваше утверждение, ограничившись файлом «file0az.sd»:
читать дальше »
Код:

Option Explicit

Dim strSourceFolder
Dim arr10To36

Dim objFSO

Dim x, y, z
Dim i, j, k
Dim strFileName


strSourceFolder = "E:\Песочница\0339"
arr10To36 = Split("0;1;2;3;4;5;6;7;8;9;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z", ";")

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

If objFSO.FolderExists(strSourceFolder) Then
        If ExistLastName(x, y, z) Then
                For i = 0 To x
                        For j = 0 To y
                                For k = 0 To z
                                        If i = 0 And j = 0 And k = 0 Then
                                        Else
                                                strFileName = "file" & arr10To36(i) & arr10To36(j) & arr10To36(k) & ".sd"
                                                WScript.Echo strFileName
                                               
                                                If strFileName = "file0az.sd" Then
                                                        WScript.Quit
                                                End If
                                        End If
                                Next
                        Next
                Next
        End If
Else
        WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Function ExistLastName(ByRef x, ByRef y, ByRef z)
        ExistLastName = False
       
        For x = 35 To 0 Step -1
                For y = 35 To 0 Step -1
                        For z = 35 To 0 Step -1
                                If x = 0 And y = 0 And z = 0 Then
                                Else
                                        strFileName = "file" & arr10To36(x) & arr10To36(y) & arr10To36(z) & ".sd"
                                       
                                        If objFSO.FileExists(objFSO.BuildPath(strSourceFolder, strFileName)) Then
                                                ExistLastName = True
                                               
                                                Exit Function
                                        End If
                                End If
                        Next
                Next
        Next
End Function
'=============================================================================


Я выделил существенные моменты:
читать дальше »
Код:

file001.sd
file002.sd
file003.sd
file004.sd
file005.sd
file006.sd
file007.sd
file008.sd
file009.sd
file00a.sd
file00b.sd
file00c.sd
file00d.sd
file00e.sd
file00f.sd
file00g.sd
file00h.sd
file00i.sd
file00j.sd
file00k.sd
file00l.sd
file00m.sd
file00n.sd
file00o.sd
file00p.sd
file00q.sd
file00r.sd
file00s.sd
file00t.sd
file00u.sd
file00v.sd
file00w.sd
file00x.sd
file00y.sd
file00z.sd
file010.sd

file011.sd
file012.sd
file013.sd
file014.sd
file015.sd
file016.sd
file017.sd
file018.sd
file019.sd
file01a.sd
file01b.sd

file01c.sd
file01d.sd
file01e.sd
file01f.sd
file01g.sd
file01h.sd
file01i.sd
file01j.sd
file01k.sd
file01l.sd
file01m.sd
file01n.sd
file01o.sd
file01p.sd
file01q.sd
file01r.sd
file01s.sd
file01t.sd
file01u.sd
file01v.sd
file01w.sd
file01x.sd
file01y.sd
file01z.sd
file020.sd
file021.sd
file022.sd
file023.sd
file024.sd
file025.sd
file026.sd
file027.sd
file028.sd
file029.sd
file02a.sd
file02b.sd
file02c.sd
file02d.sd
file02e.sd
file02f.sd
file02g.sd
file02h.sd
file02i.sd
file02j.sd
file02k.sd
file02l.sd
file02m.sd
file02n.sd
file02o.sd
file02p.sd
file02q.sd
file02r.sd
file02s.sd
file02t.sd
file02u.sd
file02v.sd
file02w.sd
file02x.sd
file02y.sd
file02z.sd
file030.sd
file031.sd
file032.sd
file033.sd
file034.sd
file035.sd
file036.sd
file037.sd
file038.sd
file039.sd
file03a.sd
file03b.sd
file03c.sd
file03d.sd
file03e.sd
file03f.sd
file03g.sd
file03h.sd
file03i.sd
file03j.sd
file03k.sd
file03l.sd
file03m.sd
file03n.sd
file03o.sd
file03p.sd
file03q.sd
file03r.sd
file03s.sd
file03t.sd
file03u.sd
file03v.sd
file03w.sd
file03x.sd
file03y.sd
file03z.sd
file040.sd
file041.sd
file042.sd
file043.sd
file044.sd
file045.sd
file046.sd
file047.sd
file048.sd
file049.sd
file04a.sd
file04b.sd
file04c.sd
file04d.sd
file04e.sd
file04f.sd
file04g.sd
file04h.sd
file04i.sd
file04j.sd
file04k.sd
file04l.sd
file04m.sd
file04n.sd
file04o.sd
file04p.sd
file04q.sd
file04r.sd
file04s.sd
file04t.sd
file04u.sd
file04v.sd
file04w.sd
file04x.sd
file04y.sd
file04z.sd
file050.sd
file051.sd
file052.sd
file053.sd
file054.sd
file055.sd
file056.sd
file057.sd
file058.sd
file059.sd
file05a.sd
file05b.sd
file05c.sd
file05d.sd
file05e.sd
file05f.sd
file05g.sd
file05h.sd
file05i.sd
file05j.sd
file05k.sd
file05l.sd
file05m.sd
file05n.sd
file05o.sd
file05p.sd
file05q.sd
file05r.sd
file05s.sd
file05t.sd
file05u.sd
file05v.sd
file05w.sd
file05x.sd
file05y.sd
file05z.sd
file060.sd
file061.sd
file062.sd
file063.sd
file064.sd
file065.sd
file066.sd
file067.sd
file068.sd
file069.sd
file06a.sd
file06b.sd
file06c.sd
file06d.sd
file06e.sd
file06f.sd
file06g.sd
file06h.sd
file06i.sd
file06j.sd
file06k.sd
file06l.sd
file06m.sd
file06n.sd
file06o.sd
file06p.sd
file06q.sd
file06r.sd
file06s.sd
file06t.sd
file06u.sd
file06v.sd
file06w.sd
file06x.sd
file06y.sd
file06z.sd
file070.sd
file071.sd
file072.sd
file073.sd
file074.sd
file075.sd
file076.sd
file077.sd
file078.sd
file079.sd
file07a.sd
file07b.sd
file07c.sd
file07d.sd
file07e.sd
file07f.sd
file07g.sd
file07h.sd
file07i.sd
file07j.sd
file07k.sd
file07l.sd
file07m.sd
file07n.sd
file07o.sd
file07p.sd
file07q.sd
file07r.sd
file07s.sd
file07t.sd
file07u.sd
file07v.sd
file07w.sd
file07x.sd
file07y.sd
file07z.sd
file080.sd
file081.sd
file082.sd
file083.sd
file084.sd
file085.sd
file086.sd
file087.sd
file088.sd
file089.sd
file08a.sd
file08b.sd
file08c.sd
file08d.sd
file08e.sd
file08f.sd
file08g.sd
file08h.sd
file08i.sd
file08j.sd
file08k.sd
file08l.sd
file08m.sd
file08n.sd
file08o.sd
file08p.sd
file08q.sd
file08r.sd
file08s.sd
file08t.sd
file08u.sd
file08v.sd
file08w.sd
file08x.sd
file08y.sd
file08z.sd
file090.sd
file091.sd

file092.sd
file093.sd
file094.sd
file095.sd
file096.sd
file097.sd
file098.sd
file099.sd
file09a.sd
file09b.sd
file09c.sd
file09d.sd
file09e.sd
file09f.sd
file09g.sd
file09h.sd
file09i.sd
file09j.sd
file09k.sd
file09l.sd
file09m.sd
file09n.sd
file09o.sd
file09p.sd
file09q.sd
file09r.sd
file09s.sd
file09t.sd
file09u.sd
file09v.sd
file09w.sd
file09x.sd
file09y.sd
file09z.sd
file0a0.sd
file0a1.sd

file0a2.sd
file0a3.sd
file0a4.sd
file0a5.sd
file0a6.sd
file0a7.sd
file0a8.sd
file0a9.sd
file0aa.sd
file0ab.sd
file0ac.sd
file0ad.sd
file0ae.sd
file0af.sd
file0ag.sd
file0ah.sd
file0ai.sd
file0aj.sd
file0ak.sd
file0al.sd
file0am.sd
file0an.sd
file0ao.sd
file0ap.sd
file0aq.sd
file0ar.sd
file0as.sd
file0at.sd
file0au.sd
file0av.sd
file0aw.sd
file0ax.sd
file0ay.sd
file0az.sd


Видно, что после «file090.sd» идёт «file091.sd», а вовсе не «file0a1.sd», который идёт, как и положено, после «file0a0.sd».

Цитата:

Цитата bombording
и дойдя до 0h5 (последний файл) успешно останавливается не захватывая остальные файлы с маской 01a - 09z и 0aa - 0zz. »

Тут, если честно, ничего не понял. «file01a.sd» и последующие превосходно попадают в перебор.

Таким образом, я пока не могу подтвердить сделанные Вами выводы. Скорее наоборот.



Как мы можем поступить? Создайте перечень Ваших файлов:
Код:

dir /b file*.sd >"List.txt"
Полученный «List.txt» упакуйте в архив и выложите сюда.

bombording 27-12-2013 09:34 2279246

Вложений: 1
Цитата:

Цитата Iska
Как мы можем поступить? Создайте перечень Ваших файлов: »

Попробуйте исполнить первый ваш скрипт и второй.

Первый отработает так (и это правильно, т.к. скрипт обработает все 617 файлов)

file001.SD
file002.SD
file003.SD
file004.SD
file005.SD
file006.SD
file007.SD
file008.SD
file009.SD
file00a.SD
file00b.SD
file00c.SD

и т.д.

Второй так (обработается только около 100 файлов из 617):

file001.SD
file002.SD
file003.SD
file004.SD
file005.SD
file006.SD
file007.SD
file008.SD
file009.SD
file010.SD
file011.SD

и т.д.

Iska 27-12-2013 09:52 2279251

bombording, кажись, дошло. Буду думать.

Iska 27-12-2013 10:53 2279264

Цитата:

Цитата Iska
кажись, дошло. »

Политкорректно это называется «Лучшее — враг хорошего». А по-простому — «меньше надо выёживаться».

Пробуйте:
читать дальше »
Код:

Option Explicit

Dim strSourceFolder
Dim arr10To36

Dim objFSO

Dim x, y, z
Dim i, j, k
Dim strFileName
Dim strLastFileName


strSourceFolder = "E:\Песочница\0340"
arr10To36 = Split("0;1;2;3;4;5;6;7;8;9;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z", ";")

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

If objFSO.FolderExists(strSourceFolder) Then
        If ExistLastName(x, y, z) Then
                strLastFileName = "file" & arr10To36(x) & arr10To36(y) & arr10To36(z) & ".sd"
               
                For i = 0 To 35
                        For j = 0 To 35
                                For k = 0 To 35
                                        If i = 0 And j = 0 And k = 0 Then
                                        Else
                                                strFileName = "file" & arr10To36(i) & arr10To36(j) & arr10To36(k) & ".sd"
                                               
                                                If Not objFSO.FileExists(objFSO.BuildPath(strSourceFolder, strFileName)) Then
                                                        WScript.Echo "Can't find file [" & strFileName & "]."
                                                End If
                                               
                                                If strFileName = strLastFileName Then
                                                        WScript.Quit 0
                                                End If
                                        End If
                                Next
                        Next
                Next
        End If
Else
        WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Function ExistLastName(ByRef x, ByRef y, ByRef z)
        ExistLastName = False
       
        For x = 35 To 0 Step -1
                For y = 35 To 0 Step -1
                        For z = 35 To 0 Step -1
                                If x = 0 And y = 0 And z = 0 Then
                                Else
                                        If objFSO.FileExists(objFSO.BuildPath(strSourceFolder, "file" & arr10To36(x) & arr10To36(y) & arr10To36(z) & ".sd")) Then
                                                ExistLastName = True
                                               
                                                Exit Function
                                        End If
                                End If
                        Next
                Next
        Next
End Function
'=============================================================================



Цитата:

Цитата bombording
Попробуйте исполнить первый ваш скрипт и второй. »

Дело в том, что пока я манипулировал на полных списках («001»-«zzz»), моя логическая ошибка никак не проявлялась. Стоило же только взять ограниченный список (до «zzz») — сразу стал виден мой несусветный ляп. Увы. Приношу Вам свои извинения.

Опиум 27-12-2013 13:32 2279309

ничо не понимаю)
Честно я бы на дельфи давно написал консольную утилиту у которой на входе имя файла, а она бы проверяла наличие файлов с именем+1 и именем-1. И выдавала errorlevel )

Запустил бы её просто для каждого файла циклом.

Iska 27-12-2013 14:40 2279334

Опиум, какая разница, на чём писать?! Я вот, например, тоже не пойму — Ваш алгоритм: при чём тут имя+1/имя-1 и errorlevel. Изложите его подробнее.

bombording 27-12-2013 15:47 2279360

Iska, Все отлично работает. Скрипт проходит по всем файлам. Большое спасибо!

Опиум 27-12-2013 16:39 2279382

Iska, алгоритм простой, на входе утилиты имя файла, на выходе имена "соседей", наличие которых нужно проверить.
читать дальше »

т.е. например
>example1.exe file1zz.sd
file1zy.sd file200.sd
>

Iska 27-12-2013 17:02 2279399

Цитата:

Цитата Опиум
Iska, алгоритм простой, на входе утилиты имя файла, на выходе имена "соседей", наличие которых нужно проверить. »

И что это нам, простите, даёт?!

bombording 07-04-2014 13:52 2334213

Iska, Добрый день. Прошу прощение за свою назойливость. Безумно признателен вам за подобное решение.

Возможно ли сделать так что бы скрипт искал файлы не по маске файла, а только по трем последним символам?
Сейчас скрипт отлично ищет файлы по маске "file" & arr10To36(x) & arr10To36(y) & arr10To36(z) & ".sd", но маска файлов недавно поменялась на хаотичную и теперь нужно что бы скрипт работал вне зависимости от маски и искал файлы только по системе счисления (три последних символа в файле 001 ... 002 ... и т.д.) ^.*arr10To36(x) & arr10To36(y) & arr10To36(z) & "\.sd$"


Код:

Option Explicit

Dim strSourceFolder
Dim arr10To36

Dim objFSO

Dim x, y, z
Dim i, j, k
Dim strFileName
Dim strLastFileName


strSourceFolder = "E:\Песочница\0340"
arr10To36 = Split("0;1;2;3;4;5;6;7;8;9;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z", ";")

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

If objFSO.FolderExists(strSourceFolder) Then
        If ExistLastName(x, y, z) Then
                strLastFileName = "file" & arr10To36(x) & arr10To36(y) & arr10To36(z) & ".sd"
               
                For i = 0 To 35
                        For j = 0 To 35
                                For k = 0 To 35
                                        If i = 0 And j = 0 And k = 0 Then
                                        Else
                                                strFileName = "file" & arr10To36(i) & arr10To36(j) & arr10To36(k) & ".sd"
                                               
                                                If Not objFSO.FileExists(objFSO.BuildPath(strSourceFolder, strFileName)) Then
                                                        WScript.Echo "Can't find file [" & strFileName & "]."
                                                End If
                                               
                                                If strFileName = strLastFileName Then
                                                        WScript.Quit 0
                                                End If
                                        End If
                                Next
                        Next
                Next
        End If
Else
        WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Function ExistLastName(ByRef x, ByRef y, ByRef z)
        ExistLastName = False
       
        For x = 35 To 0 Step -1
                For y = 35 To 0 Step -1
                        For z = 35 To 0 Step -1
                                If x = 0 And y = 0 And z = 0 Then
                                Else
                                        If objFSO.FileExists(objFSO.BuildPath(strSourceFolder, "file" & arr10To36(x) & arr10To36(y) & arr10To36(z) & ".sd")) Then
                                                ExistLastName = True
                                               
                                                Exit Function
                                        End If
                                End If
                        Next
                Next
        Next
End Function
'=============================================================================


Iska 12-04-2014 06:06 2336606

Как-то так:
читать дальше »
Код:

Option Explicit

Const adVarChar = 200


Dim strSourceFolder
Dim arr10To36

Dim objFSO
Dim objRegExp
Dim objFile

Dim strLastRightThreeSimbols

Dim objDictionary

Dim i
Dim strRightThreeSimbols


strSourceFolder = "E:\Песочница\0340"
arr10To36 = Split("0;1;2;3;4;5;6;7;8;9;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z", ";")

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

If objFSO.FolderExists(strSourceFolder) Then
        Set objRegExp = WScript.CreateObject("VBScript.RegExp")
       
        With objRegExp
                .Pattern    = "^.*([0-9a-z]{3})\.sd$"
                .IgnoreCase = True
        End With
       
        With WScript.CreateObject("ADODB.Recordset")
                With .Fields
                        .Append "RightThreeSimbols", adVarChar, 3
                End With
               
                .Open
                .Sort = "RightThreeSimbols DESC"
               
                For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                        If objRegExp.Test(objFile.Name) Then
                                .AddNew Array("RightThreeSimbols"), Array(objRegExp.Execute(objFile.Name).Item(0).Submatches.Item(0))
                        End If
                Next
               
                If .RecordCount > 0 Then
                        .MoveFirst
                        strLastRightThreeSimbols = .Fields.Item("RightThreeSimbols").Value
                       
                        .Sort = "RightThreeSimbols ASC"
                        .MoveFirst
                       
                        Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
                       
                        Do Until .EOF
                                strRightThreeSimbols = .Fields.Item("RightThreeSimbols").Value
                               
                                If Not objDictionary.Exists(strRightThreeSimbols) Then
                                        objDictionary.Add strRightThreeSimbols, strRightThreeSimbols
                                End If
                               
                                .MoveNext
                        Loop
                       
                        For i = 1 To 36^3 - 1
                                strRightThreeSimbols = DecimalTo36(i)
                               
                                If Not objDictionary.Exists(strRightThreeSimbols) Then
                                        WScript.Echo "Can't find file for mask [*" & strRightThreeSimbols & ".sd]."
                                End If
                               
                                If StrComp(strRightThreeSimbols, strLastRightThreeSimbols, vbTextCompare) = 0 Then
                                        Exit For
                                End If
                        Next
                       
                        Set objDictionary = Nothing
                Else
                        WScript.Echo "Nothing found by pattern."
                End If
               
                .Close
        End With
       
        Set objRegExp = Nothing
Else
        WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Function DecimalTo36(i)
        Dim iHundreds, iHundreds36
        Dim iTens
        Dim iOnes
       
        iHundreds = i \ 36^2
        iHundreds36 = iHundreds * 36^2
       
        iTens = (i -  iHundreds36) \ 36
       
        iOnes = (i - (iHundreds36 + iTens * 36))
       
        DecimalTo36 = arr10To36(iHundreds) & arr10To36(iTens) & arr10To36(iOnes)
End Function
'=============================================================================



Время: 05:13.

Время: 05:13.
© OSzone.net 2001-