PDA

Показать полную графическую версию : Проверка списка имен в цикле


Страниц : 1 [2]

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

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

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

bombording
27-12-2013, 15:47
Iska, Все отлично работает. Скрипт проходит по всем файлам. Большое спасибо!

Опиум
27-12-2013, 16:39
Iska, алгоритм простой, на входе утилиты имя файла, на выходе имена "соседей", наличие которых нужно проверить.

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

Iska
27-12-2013, 17:02
Iska, алгоритм простой, на входе утилиты имя файла, на выходе имена "соседей", наличие которых нужно проверить. »
И что это нам, простите, даёт?!

bombording
07-04-2014, 13:52
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
Как-то так:
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
'=============================================================================




© OSzone.net 2001-2012