Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Пакетное создание файлов, целостность последовательности
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Mon Dec 15, 2008 12:01    Post subject: Пакетное создание файлов, целостность последовательности Reply with quote

Читал форум, нашел тему про то как найти недостающие элементы в последовательности файлов (со счетчиком). Автор вопроса спрашивал про плагин который мог бы собирать идущие по порядку файлы в одну строку, если встречался бы разрыв, то создавалась бы другая строка с другим периодом цифр в строке. Все это нужно для сортировки картинок, подкастов и т.д.
На днях встретился с такой же проблемой: есть около 500 подкастов, несколько не скачались. Я вспомнил про этот вопрос и, насколько помню, ответ был, но спомощью скриптов. Впринципе, можно понапрягать глаза и в ручную найти недостающие файлы; я попробовал понапрягать глаза еще больше и создал бат-файл (batch flie), чтобы автоматизировать этот процес на будущее.
Вот что у меня получилось:

_cmd_create_check_succession.bat + ключи через _run.bat описаны ниже

Code:

@echo off
rem -------------------------------------------------------------------------
rem входные данные

rem если флаг=0, то создаем файлы по маске
rem если флаг=1, то проверяем целостность последовательности файлов
rem если флаг=2, созадние папок
set flag_create_check=%7

rem КОЛИЧЕСТВО ЦИФР В СЧЕТЧИКЕ  0, 00, 000, и т.д.
set /a nnn_input=%1
rem для коммандной строки. если количество цифр задано нулем,
rem то приводим значение к работоспособному варианту
if %nnn_input%==0 set /a nnn_input=1

rem вычитание единицы из введенного КОЛИЧЕСТВА ЦИФР В СЧЕТЧИКЕ
set /a nnn=nnn_input-1

set flag_skip_drop_one_null=0
if %nnn%==0 set flag_skip_drop_one_null=1

rem часть имени файла до счетчика
set prefix1=%2
rem часть имени файла после счетчика
set prefix2=%3

rem *****************************
rem границы счетчика, что подсавляются в именя фала
rem *****************************
rem начальное число счетчика.
rem далее используется как увеличиваующийся СЧЕТЧИК в ГЛАВНОМ ЦИКЛЕ
set /a startnumber=%4

rem КОНЕЧНОЕ ЧИСЛО СЧЕТЧИКА
set /a endnumber=%5
rem ШАГ СЧЕТЧИКА
set /a shag=%6

rem имя ВЫХОДНОГО ФАЙЛА куда записываем имена пропущенных файлов
set OUTPUT_FILE="%8"

rem -------------------------------------------------------------------------
rem создание подстроки добавочных нулей

rem подстрока добавочных нулей
set digit_ape=
set /a arg=0
:nnn_loop
if %arg%==%nnn% goto nnn_end_loop
set /a digit_loop_result=arg+1
set arg=%digit_loop_result%
set digit_ape=%digit_ape%0
goto nnn_loop
:nnn_end_loop


rem -------------------------------------------------------------------------
rem создание последовательности файлов
set /a multi=10

goto begin_succession

rem изменение подстроки добавочных нулей
:drop_one_null
if %flag_skip_drop_one_null%==1 goto begin_succession
if %digit_ape%==0 set flag_skip_drop_one_null=1
set digit_ape=%digit_ape:~0,-1%
set /a arg_multi=multi*10
set /a multi=arg_multi

rem ГЛАВНЫЙ ЦЫКЛ создания или проверки файлов в зависимости от флага
rem flag_create_check
:begin_succession
rem если СЧЕТЧИК превысил
rem КОНЕЧНОЕ ЧИСЛО СЧЕТЧИКА, то заканчиваем bat-файл
if %startnumber% GTR %endnumber% goto end

if %flag_skip_drop_one_null%==1 goto skip_drop_one_null
rem если порядок 10,100,1000
rem увеличился на один, то изменяем подстроку добавочных нулей
if %startnumber% GEQ %multi% goto drop_one_null
:skip_drop_one_null

rem собираем имя файла, согласно циклу
set temp_name=%prefix1%%digit_ape%%startnumber%%prefix2%
set temp_name=%temp_name:"=%

rem условие: создаем ли файлы, проверяем наличие всех файлов в
rem последовательности или создаем папки
if %flag_create_check%==0 goto echo_creating
if %flag_create_check%==1 goto echo_missing
if %flag_create_check%==2 goto echo_creating_folder

rem создаем файл с конкретным именем, согласно циклу
:echo_creating
 cls
echo "creation of the files..."
echo. >"%9%temp_name%"
goto end_loop

rem записываем недостающее имя файла в ВЫХОДНОЙ ФАЙЛ
:echo_missing
cls
echo "checking the continuity of the succession of the files..."

if not exist "%temp_name%" echo %temp_name% >>%OUTPUT_FILE%
goto end_loop

:echo_creating_folder
mkdir "%temp_name%"

:end_loop
set /a result=startnumber + shag
set startnumber=%result%

goto begin_succession
:end



_run.bat
Code:

_cmd_create_check_succession.bat 2 "str _" "_ end.test" 1 115 6 0 "missing_files.txt"

2 - означает сколько цифр будет в счетчике
"str _" - строка перед счетчиком
"_end.test"- строка после счетчика, если создаем файлы, то test будет рашсирением
1 - начальное значение счетчика
115 - конечное
6 - шаг счетчика
0 - ключ, создание файлов (создание файлов -0 /проверка -1 /создание катологов -2)
"missing_flies.txt" -файл куда записываютеся пропущенные файлы/папки (на данном шаге не используется, но вводить параметр обязательно)

после исполнения _run.bat получаем:
Code:

str _01_ end.test
str _07_ end.test
str _13_ end.test
str _19_ end.test
str _25_ end.test
str _31_ end.test
str _37_ end.test
str _43_ end.test
str _49_ end.test
str _55_ end.test
str _61_ end.test
str _67_ end.test
str _73_ end.test
str _79_ end.test
str _85_ end.test
str _91_ end.test
str _97_ end.test
str _103_ end.test
str _109_ end.test
str _115_ end.test

далее, например удалим 13 и 55,61, 67 файлы; изменим _run.bat:
Code:

_cmd_create_check_succession.bat 2 "str _" "_ end.test" 1 115 6 1 "missing_files.txt"

заминили 0 на 1, запускаем... Создается файл "missing_files.txt" с таким содержанием:
Code:

"str _13_ end.test"
"str _55_ end.test"
"str _61_ end.test"
"str _67_ end.test"

С папками тоже самое, только при создании ключ 2, а не 0.

+ появлися вопрос: как можно сделать проверку целостности последовательности файлов, если последовательность в текстовом файле (строка-элемент)?


Last edited by _Johm on Tue Dec 23, 2008 11:25; edited 1 time in total
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Mon Dec 15, 2008 14:29    Post subject: Reply with quote

Quote:
как можно сделать проверку целостности последовательности файлов, если последовательность в текстовом файле (строка-элемент)?
Как-то не чётко...
Проверить отсутствие файлов, указанных в списке?
Или проверить непрерывность самого списка, без учёта существования файлов?

А вообще, список файлов (по одному в строке) перебирается командой
Code:
for /f "delims=" %variable in (list.txt) do command
Back to top
View user's profile Send private message
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Mon Dec 15, 2008 14:56    Post subject: Reply with quote

2Tol!k
Вроде вопрос поставлен нормально.
Quote:

Проверить отсутствие файлов, указанных в списке?
Или проверить непрерывность самого списка, без учёта существования файлов?

имелось ввиду второе "...без учета существования файлов"

Но "проверить отсутствие файлов, указанных в списке" тоже интересно...

У меня собственно почему возник вопрос:
у меня не получилось создать текстовый файл из имен выделенных файлов;

-есть команда cm_SaveSelectionToFile но после нажатия кнопки TC предлагает ввести имя файла. Можно ли, что бы это происходило автоматически, например, создавался бы файл в этой же папке с заранее заданным именем.
(Кстати что делает cm_SaveSelection в отличии от cm_SaveSelectionToFile)
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Mon Dec 15, 2008 15:31    Post subject: Reply with quote

Список выделенного можно получить через параметры %L, %l, %F, %f, %D, %d
----------------- кнопка -----------------
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\list.bat
%F
%COMMANDER_PATH%\TOTALCMD.EXE
Selection


-1


----------------- list.bat -----------------
@echo off
chcp 1251 > nul
rem Selection
echo Используем напрямую
for /f "delims=" %%a in (%1) do echo %%a
echo Сохраняем в файл
copy %1 Selection.txt
pause


Last edited by Tol!k on Mon Dec 15, 2008 16:02; edited 1 time in total
Back to top
View user's profile Send private message
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Mon Dec 15, 2008 16:01    Post subject: Reply with quote

Спасибо.
PS. А что значит TOTALCMD#BAR#DATA?
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Mon Dec 15, 2008 16:07    Post subject: Reply with quote

Всё, что синего цвета - это текст кнопки для TC (такой у неё формат). Выдели и вставь на свободное место на панели инструментов.
Код list.bat подправил
Back to top
View user's profile Send private message
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Mon Dec 15, 2008 16:20    Post subject: Reply with quote

Еще раз спасибо! Вон оно что с кнопками: выделил и вставил, а я раньше все вручную...

А что недоставало здесь:
list.bat
copy %1 selection.txt
?

При выполнении в cmd.exe окне русские буквы отображаются некоректно. Как поправить?
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Mon Dec 15, 2008 17:42    Post subject: Reply with quote

Code:
copy %1 selection.txt

здесь ничего не изменилось, я добавил пример использования временного файла TC без создания своего временного файла
Code:
for /f "delims=" %%a in (%1) do echo %%a

нужно только помнить, что он сотрётся, когда отработает list.bat

Quote:
русские буквы отображаются некоректно

нужна команда
Code:
chcp 1251
Back to top
View user's profile Send private message
Моторокер



Joined: 06 May 2005
Posts: 1496
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Mon Dec 15, 2008 19:07    Post subject: Re: Пакетное создание файлов, целостность последовательности Reply with quote

_Johm wrote:
На днях встретился с такой же проблемой: есть около 500 подкастов, несколько не скачались.

А полный список файлов есть? Тех, которые нужно скачать?

В мою программу АвтоФормат вставить список имеющихся файлов.
Отделить пустой строкой/строками.
Вставить список файлов, которые должны иметься.
Quote:
1
3

1
2
3

Удалить дубликаты.
Quote:
1
3

2

Во втором списке останутся только те имена файлов, которых нет в первом.

Если второго списка нет, но он например числовой, его можно сгенерировать.
_________________
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2204
Location: Москва, Россия

Post (Separately) Posted: Mon Dec 15, 2008 19:20    Post subject: Reply with quote

Что-то у меня от слова "подкасты" в голове шумит.

Задача - сравнить два списка и сформировать третий, включающий элементы, существующие во втором списке, но отсутствующие в первом?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2572
Location: Большая деревня Москва

Post (Separately) Posted: Mon Dec 15, 2008 19:33    Post subject: Reply with quote

Еще к теме о нумерации: http://powerpro.wincmd.ru/Scripts/CheckCounter.htm.

Quote:
Что-то у меня от слова "подкасты" в голове шумит
Странно... Все просто: отделы-подотделы, классы-подклассы, касты-подкасты Wink
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Lev



Joined: 02 Mar 2005
Posts: 392

Post (Separately) Posted: Mon Dec 15, 2008 19:36    Post subject: Reply with quote

Я для подобных целей пользуюсь wfx плагином Sequences 0.10. Списка отсутствующих файлов он не создаст, но некоторую визуальную помощь окажет.
Back to top
View user's profile Send private message
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Mon Dec 15, 2008 20:00    Post subject: Reply with quote

Sequences - то что надо!
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2204
Location: Москва, Россия

Post (Separately) Posted: Tue Dec 16, 2008 11:29    Post subject: Reply with quote

Вахмурка wrote:
Все просто: отделы-подотделы, классы-подклассы, касты-подкасты

Вообще-то, это была шутка. Просто хотелось от автора услышать более четкую постановку задачи. Решил, было, написать vbs-скрипт, но раз ответа нет, то значит, в решении никто не нуждается.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Bomm



Joined: 15 Jan 2005
Posts: 245
Location: Москва

Post (Separately) Posted: Tue Dec 16, 2008 11:37    Post subject: Reply with quote

Quote:
нужна команда
Код:
chcp 1251

А можно ли сделать так, чтобы имена файлов с русскими буквами выводидись корректно
Точно также, если использовать команду
type имя_файла_со списком_файлов
а в списке есть русские имена, они выводятся "крякозябликами", какую бы кодовую страеницу не выберешь
_________________
Юрий Бомштейн
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group