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

Компьютерный форум 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

 

Ветеран


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

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


Код: Выделить весь код
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

Последний раз редактировалось Iska, 25-12-2013 в 15:46. Причина: Исправлена описка

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

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



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

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


Старожил


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

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


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

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


Отправлено: 15:40, 23-12-2013 | #3


Ветеран


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

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


Цитата 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
А у Вас?

Последний раз редактировалось Iska, 25-12-2013 в 15:46. Причина: Исправлена описка

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

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


Старожил


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

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


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

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

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


Отправлено: 16:10, 23-12-2013 | #5


Ветеран


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

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


Цитата bombording:
В таком случае как узнать, какой файл последний и прекратить выполнение скрипта на нём? Ведь файлов каждый раз может быть разное количество. Список может кончаться например и на file02b.sd и на file04s.sd или на другом имени. »
Это входит в явное противоречие с:
Цитата bombording:
Проверять все файлы в папке на последовательность. И в случае нарушения последовательности, выдавать ошибку. »
Надо полагать, теперь условие такое — «перечислить все отсутствующие файлы между первым и последним в алфавитном порядке», так? Я уже как-то делал здесь такое. Осталось найти среди всех своих сообщений .

Отправлено: 16:16, 23-12-2013 | #6


Старожил


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

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


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

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


Отправлено: 17:37, 23-12-2013 | #7


Ветеран


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

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


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

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

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

Отправлено: 23:19, 23-12-2013 | #8


Старожил


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

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


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

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


Отправлено: 10:02, 24-12-2013 | #9


Ветеран


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

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


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

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



Компьютерный форум 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




 
Переход