Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Проверка списка имен в цикле

Ответить
Настройки темы
VBS/WSH/JS - Проверка списка имен в цикле

Старожил


Сообщения: 226
Благодарности: 4

Профиль | Отправить PM | Цитировать


Добрый день.
Имеется папка с файлами определённой структуры:
Код: Выделить весь код
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 то выдавалась бы ошибка.

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

-------
Альтернатива Всему!


Отправлено: 14:21, 23-12-2013

 

Старожил


Сообщения: 226
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

-------
Альтернатива Всему!


Отправлено: 12:29, 24-12-2013 | #11



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

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


Старожил


Сообщения: 226
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

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

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

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

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

-------
Альтернатива Всему!

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:38, 25-12-2013 | #12


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата bombording:
P.S. и в переменной arr10To36 две буквы g. »
Хех. Вот так и рождаются легенды. Замените вторую на «j». Тогда и первые скрипты не должны были корректно работать.

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

Отправлено: 15:47, 25-12-2013 | #13


Старожил


Сообщения: 226
Благодарности: 4

Профиль | Отправить PM | Цитировать


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, 25-12-2013 в 17:31.


Отправлено: 16:38, 25-12-2013 | #14


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:45, 25-12-2013 | #15


Старожил


Сообщения: 226
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

-------
Альтернатива Всему!


Отправлено: 15:36, 26-12-2013 | #16


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата 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» упакуйте в архив и выложите сюда.

Последний раз редактировалось Iska, 27-12-2013 в 10:57. Причина: Зачеркнул некорректные выводы.


Отправлено: 08:08, 27-12-2013 | #17


Старожил


Сообщения: 226
Благодарности: 4

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt List.txt
(7.2 Kb, 4 просмотров)

Цитата 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

и т.д.

-------
Альтернатива Всему!


Отправлено: 09:34, 27-12-2013 | #18


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:52, 27-12-2013 | #19


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата 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») — сразу стал виден мой несусветный ляп. Увы. Приношу Вам свои извинения.
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:53, 27-12-2013 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Проверка списка имен в цикле

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Цикл в Цикле deamon7 Скриптовые языки администрирования Windows 5 15-04-2023 09:04
CMD/BAT - Проверка файлов в сетевом каталоге, и создание списка из тех которые по размеру < N wonted Скриптовые языки администрирования Windows 21 17-03-2014 13:40
VBS/WSH/JS - [решено] Сравнить три списка имен файлов между собой. bombording Скриптовые языки администрирования Windows 2 19-12-2013 15:19
запуск GUICtrlSetData в цикле bugmenotagain AutoIt 10 04-08-2012 16:30
CMD/BAT - [решено] Множественная проверка в цикле (IF) с оперратором "ИЛИ"(OR) Nuclears Скриптовые языки администрирования Windows 7 29-12-2011 13:13




 
Переход