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

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

Ответить
Настройки темы
CMD/BAT - [решено] Проверка последовательности в файлах.

Новый участник


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

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


Здравствуйте! Есть такая задача:
В некой папке есть файлы. Имена файлов - порядковый набор цифр. Расширение - буква и две цифры. Нужно проверить, идут ли файлы подряд или некоторых не хватает. Например:

12345001.В12
12345002.В12
12345004.В12

Не хватает 12345003.В12

Вторая беда в том, что расширения могут быть разными, соответственно номера файлов могут повторяться. Например:

12345001.В10
12345001.В12
12345002.В10
12345002.В12
12345003.В10
12345004.В10
12345004.В12

Всё ещё не хватает 12345003.В12

В принципе, можно руками вводить номер, с которого начинать проверять и расширение. Но я всё равно не знаю, как проверить, что оно идёт попорядку.

Зарание благодарен за любую помощь!

Отправлено: 14:55, 16-05-2013

 

Ветеран


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

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


subuday77, приведите пример имён реальных файлов: важно увидеть длину и выделить постоянную часть.

Отправлено: 17:14, 16-05-2013 | #2



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

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


Старожил


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

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


http://wincmd.ru/plugring/seq_wfx.html

Отправлено: 17:23, 16-05-2013 | #3


Новый участник


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

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


Iska, Оно так и выглядит. Первые 5 цифр номер лицензии, 3 цифры - номер архива, расширение показывает, с какого сервера файл. Собственно в одном массиве первые 5 цифр чаще всего одинаковыми, кроме случаев, когда на одной машине работают несколько клиентов. Но длина имени всегда 5+3 . 3

kiripanda, спасибо, но не вариант. Проверка выпоняется на машинах клиентов.

Отправлено: 21:31, 16-05-2013 | #4


Ветеран


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

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


subuday77, для двух расширений файлов:

Код: Выделить весь код
@ECHO OFF
SET Folder=E:\Work\
SET Extension_1=.‚10
SET Extension_2=.‚12
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=1 delims=." %%I IN ('DIR %Folder% /B /O:N') DO (
SET Name=%%I
GOTO #
)
:#
FOR /F "tokens=1 delims=." %%I IN ('DIR %Folder% /B /O:N') DO (
  SET /A Skip=%%I-!Name!-1
  IF !Skip! GEQ 1 (
    FOR /L %%K IN (1,1,!Skip!) DO (
     SET /A Missing_File=!Name!+%%K
     ECHO !Missing_File!%Extension_1%
     ECHO !Missing_File!%Extension_2%
)
   IF NOT EXIST %Folder%%%I%Extension_1% ECHO %%I%Extension_1%
   IF NOT EXIST %Folder%%%I%Extension_2% ECHO %%I%Extension_2%
   SET Name=%%I
) ELSE (
   IF NOT EXIST %Folder%%%I%Extension_1% ECHO %%I%Extension_1%
   IF NOT EXIST %Folder%%%I%Extension_2% ECHO %%I%Extension_2%
   SET Name=%%I
))
PAUSE>nul
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:13, 17-05-2013 | #5


Ветеран


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

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


Цитата subuday77:
Iska, Оно так и выглядит. Первые 5 цифр номер лицензии, 3 цифры - номер архива, расширение показывает, с какого сервера файл. Собственно в одном массиве первые 5 цифр чаще всего одинаковыми, кроме случаев, когда на одной машине работают несколько клиентов. Но длина имени всегда 5+3 . 3 »
subuday77, Вам как удобнее задавать потребную папку, постоянную часть имени («Первые 5 цифр номер лицензии») и расширение («расширение показывает, с какого сервера файл») — будете менять непосредственно в теле пакетного файла, будете задавать параметрами пакетного файла, будете вводить в ответ на запрос пакетного файла?

Можно, например, перетаскивать какой-либо файл (из набора потребных для проверки) на пакетный файл, а пакетный файл по переданному имени уже сам будет определять папку, постоянную часть имени и расширение, иначе — запрашивать то. другое и третье в диалоге:
читать дальше »
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sFullFileName=%~1

if defined sFullFileName (
	set sFolder=%~dp1
	set sTempValue=%~n1
	set sConstPart=!sTempValue:~0,5!
	set sExt=%~x1
) else (
	set /p sTempValue=Enter folder name:
	set sFolder=!sTempValue!\
	set /p sConstPart=Enter constant part of file name:
	set /p sTempValue=Enter extension of file name:
	set sExt=.!sTempValue!
)

if exist "%sFolder%." (
	for /l %%i in (999, -1, 1) do (
		set sPattern=000%%i
		set sFileName=%sConstPart%!sPattern:~-3!%sExt%
		
		if exist "%sFolder%!sFileName!" if not defined sLastIndex set sLastIndex=%%i
	)

	if defined sLastIndex (
		for /l %%i in (1, 1, !sLastIndex!) do (
			set sPattern=000%%i
			set sFileName=%sConstPart%!sPattern:~-3!%sExt%
			
			if not exist "%sFolder%!sFileName!" echo !sFileName!
		)
	) else (
		echo Not found any file in folder [%sFolder%] by pattern [%sConstPart%xxx%sExt%].
	)
) else (
	echo Folder [!sFolder!] not found.
)
	
pause

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

Отправлено: 05:26, 17-05-2013 | #6


Ветеран


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

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


subuday77, вот простой и почти универсальный вариант:

Код: Выделить весь код
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET Folder=E:\Work
SET n=0
FOR /F "tokens=2 delims=." %%I IN ('DIR "%Folder%" /B /O:E') DO IF NOT "%%I"=="!Extension!" SET Extension=%%I&&SET /A n=!n!+1&&SET Extension_!n!=%%I
SET Max_Name=0
FOR %%I IN ("%Folder%\*") DO IF %%~nI GEQ !Max_Name! SET Max_Name=%%~nI
SET Min_Name=!Max_Name!
FOR %%I IN ("%Folder%\*") DO IF %%~nI LEQ !Min_Name! SET Min_Name=%%~nI
FOR /L %%I IN (!Min_Name!,1,!Max_Name!) DO FOR /F "tokens=2 delims==" %%J IN ('SET Extension_') DO IF NOT EXIST "%Folder%\%%I.%%J" ECHO %%I.%%J
PAUSE>nul
В качестве рабочей переменной задаётся только каталог. Число расширений и длина имени файла не лимитированы. Необходимо только, чтобы в имени файла были только цифры без нулей в начале.

Последний раз редактировалось Georgio, 17-05-2013 в 15:46. Причина: добавление комментария

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

Отправлено: 13:11, 17-05-2013 | #7


Новый участник


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

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


Iska, Georgio, спасибо! В воскресенье выйду на работу, буду пробовать.

Отправлено: 17:09, 17-05-2013 | #8


Ветеран


Contributor


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

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


Цитата subuday77:
Первые 5 цифр номер лицензии, 3 цифры - номер архива, расширение показывает, с какого сервера файл. Собственно в одном массиве первые 5 цифр чаще всего одинаковыми, кроме случаев, когда на одной машине работают несколько клиентов. Но длина имени всегда 5+3 . 3
Вот решение, если имена файлов (первые 5 знаков) в папке возможны разные, при этом:

-имена файлов 5+3, где 5 знаков префикс, 3 знака номер,
-для каждого префикса могут быть свой набор расширений,
-начало и конец нумерации для каждого префикса может быть своя,
Код: Выделить весь код
@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion

Set Where=E:\DDDDDDDDD\bbbb

Set Name=

FOR /F "usebackq delims=" %%n IN (`Dir "%Where%\*.*" /B /O:N`) DO (
	Set N=%%~nn
	Set NN1=1!N:~-3!
	Set N=!N:~0,5!
	If /I Not "!Name!"=="!N!" (
		Set Name=!N!
		Set NN2=""
		FOR /F "usebackq delims=" %%m IN (`Dir "%Where%\!Name!???.*" /B /O:-N`) DO If !NN2!=="" Set NN2=%%~nm
		Set NN2=1!NN2:~-3!

		Set Ext=
		FOR /F "usebackq delims=" %%m IN (`Dir "%Where%\!Name!???.*" /B /O:E`) DO (
			If /I Not "!Ext!"=="%%~xm" (
				Set Ext=%%~xm
				FOR /L %%i IN (!NN1!,1,!NN2!) DO (
					Set FNo=%%i
					Set FNo="%Where%\!Name!!FNo:~-3!!Ext!"
					If Not Exist !FNo! Echo !FNo!
				)
			)
		)

	)
)
Вместо E:\DDDDDDDDD\bbbb пропишите свой путь без \ и БЕЗ ПРОБЕЛОВ в конце строки
Если нумерация в имени обязательно должна начинаться с 001,
читать дальше »
то вместо имеющегося надо написать цикл
Код: Выделить весь код
FOR /L %%i IN (1001,1,!NN2!) DO (
хотя, в принципе, в этом случае батник можно упростить
читать дальше »
Код: Выделить весь код
@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion

Set Where=E:\DDDDDDDDD\bbbb

Set Name=

FOR /F "usebackq delims=" %%n IN (`Dir "%Where%\*.*" /B /O:-N`) DO (
	Set N=%%~nn
	Set NN2=1!N:~-3!
	Set N=!N:~0,5!
	If /I Not "!Name!"=="!N!" (
		Set Name=!N!

		Set Ext=
		FOR /F "usebackq delims=" %%m IN (`Dir "%Where%\!Name!???.*" /B /O:E`) DO (
			If /I Not "!Ext!"=="%%~xm" (
				Set Ext=%%~xm
				FOR /L %%i IN (1001,1,!NN2!) DO (
					Set FNo=%%i
					Set FNo="%Where%\!Name!!FNo:~-3!!Ext!"
					If Not Exist !FNo! Echo !FNo!
				)
			)
		)

	)
)

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 17-05-2013 в 22:42.


Отправлено: 21:49, 17-05-2013 | #9


Ветеран


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

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


Мой вариант
Код: Выделить весь код
@echo off
setlocal

pushd "C:\test"

for /f %%i in ('dir /b') do set "ext_%%~xi=%%~xi"
for /f "tokens=2 delims==" %%i in ('set ext_') do call:1 "%%i"
popd
goto:eof

:1
for %%i in (*%~1) do if not defined min (set min=%%~ni) else (set max=%%~ni)
for /l %%i in (%min%,1,%max%) do if not exist %%i%~1 echo %%i%~1

for %%i in (min max) do set "%%i="

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



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Esc-последовательности в BAT-файлах (ansi.sys) AndreyY89 Microsoft Windows 2000/XP 8 16-03-2012 07:05
Выполнение последовательности действий нажатий кнопок мышки DREDivan AutoIt 3 05-09-2010 19:25
ASCII-последовательности lunas Программирование и базы данных 2 09-02-2003 23:54
ASCII-последовательности lunas Хочу все знать 6 05-02-2003 14:24




 
Переход