VBS/WSH/JS - Проверка списка имен в цикле

Аватара пользователя
bombording

Re: VBS/WSH/JS - Проверка списка имен в цикле

Сообщение bombording »

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

Re: VBS/WSH/JS - Проверка списка имен в цикле

Сообщение bombording »

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

Re: VBS/WSH/JS - Проверка списка имен в цикле

Сообщение bombording »

Цитата bombording:



P.S. и в переменной arr10To36 две буквы g.
VBS/WSH/JS - Проверка списка имен в цикле




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




Цитата bombording:



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

Новая версия скрипта(которая выдергивает имя последнего файла) работает немного не корректно.

Сначала скрипт проверяет цифровые имена 001 - 090

Затем скрипт проверяет имена (буква цифра) 0a1 - 0z9

При этом скрипт не проверяет имена 01a - 09z а так же не проверяет 0aa - 0zz.

Поэтому из 600 моих файлов, скрипт проверил только 100 и успешно завершился.

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




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

Re: VBS/WSH/JS - Проверка списка имен в цикле

Сообщение Iska »

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, то все работает. Но не работает проверка на последний файл... Изображение
Аватара пользователя
bombording

Re: VBS/WSH/JS - Проверка списка имен в цикле

Сообщение bombording »

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

Re: VBS/WSH/JS - Проверка списка имен в цикле

Сообщение Iska »

Цитата bombording:



А вот новый скрипт, который проверяет имя последнего файла работает немного по другому:

Сначала с 001 по 090 затем с 0a1 - 0z9
VBS/WSH/JS - Проверка списка имен в цикле




Нет.



Я создал весь перечень из 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.
VBS/WSH/JS - Проверка списка имен в цикле




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



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





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



Код:

Код: Выделить всё

dir /b file*.sd >"List.txt"

Полученный «List.txt» упакуйте в архив и выложите сюда.
Аватара пользователя
Iska

Re: VBS/WSH/JS - Проверка списка имен в цикле

Сообщение Iska »

Цитата Iska:



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




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



Первый отработает так (и это правильно, т.к. скрипт обработает все 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


и т.д.
Аватара пользователя
bombording

Re: VBS/WSH/JS - Проверка списка имен в цикле

Сообщение bombording »

bombording, кажись, дошло. Буду думать.
Аватара пользователя
Iska

Re: VBS/WSH/JS - Проверка списка имен в цикле

Сообщение Iska »

Цитата Iska:



кажись, дошло.
VBS/WSH/JS - Проверка списка имен в цикле




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



Пробуйте:


читать дальше »




Код:

Код: Выделить всё

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:



Попробуйте исполнить первый ваш скрипт и второй.
VBS/WSH/JS - Проверка списка имен в цикле




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

Вернуться в «Скриптовые языки администрирования Windows»