PDA

Показать полную графическую версию : [решено] Как с помощью скрипта создать архив с динамичным названием учитывая нужные критерии


yaoleg2
20-01-2011, 14:18
Есть несколько файлов (количество файлов постоянно меняется), с разным названием и расширением (Например: Документ1.doc, Новый документ.xls, *.dbf и т.д. и т.п.). Нужно эти файлы заархивировать с помощью Winrar .
Но основная проблема не в самой архивации, а в создании нужного имени архива. Например, нужно заархивировать файлы в rar-архив с названием этого архива P20aabc1.P01, где:

– Р и Р01…Р99(причем вместо Р может быть любая буква латинского/английского алфавита которая выбирается пользователем). При формировании названия архива, нужно чтобы скрипт «спрашивал», что писать в расширении архива Р01 или Р02…Р99 и соответственно если пользователь ответит С01, то название будет типа С20аabc1.С01;

– 20 - сегодняшнее число месяца;

– а - буквенный «номер» месяца (a-январь;b-февраль;c-март; d-апрель; e-май; f-июнь; g-июль; h-август; i-сентябрь; j-октябрь; k-ноябрь; l-декабрь;);

– abc- три буквы латинского алфавита которые есть постоянные(статичные) в отличие от букв обозначающих месяц создание архива они неизменны в отличии от остальных символов;

– 1 - это номер архива по порядку от 1 до 9(после девятого архива номер снова должен начинаться с 1, прежде всего это связано с тем, что название созданного архива должно соответствовать 8 символом название и 3символа расширение архива).

Вероятность, что название архива в один день будет одинакова – ничтожна, ибо символы Р и Р01 меняются в зависимости от выбора пользователя(можно выбрать А и А01…А99).

Между первой буквой названия архива и расширением (Р и Р01) есть взаимосвязь, то есть в названии архива не должно быть А20aabc1.P01 или P20aabc1.А01 – должно быть P20aabc1.P01 или А20aabc1.А01.

1. затем скопировать в архивную директорию C:\YYYY\MM\DD\ (Например сегодня папка архива будет – С:\2011\01\20\);
2. потом этот файл скопировать в другую папку D:\mail\out.

Возможно ли процесс создания названия архивного файла написать с помощь скрипта или тут поможет только язык программирования?

SendMessage
20-01-2011, 15:58
Что-то вроде такого?
@echo off

:ArchiveName
set /a i+=1
if %i% gtr 9 set i=1
echo.
echo ****************************
echo Формирование названия архива
echo ****************************
echo.
set /p ext=Выберите расширение архива (например, С01):
call:ReplaceMonthName %date:~3,2%
echo.
echo ArchiveName : %ext:~0,1%%date:~0,2%%month%abc%i%.%ext%
echo.
::Далее идут команды для архивирования. Предполагается, что Вы их знаете.
set /p next=Продолжить? (y):
if "%next%"=="y" goto ArchiveName else goto:eof

:ReplaceMonthName
set month=%1
set month=%month:01=a%
set month=%month:02=b%
set month=%month:03=c%
set month=%month:04=d%
set month=%month:05=e%
set month=%month:06=f%
set month=%month:07=g%
set month=%month:08=h%
set month=%month:09=i%
set month=%month:10=j%
set month=%month:11=k%
set month=%month:12=l%
exit /b

SendMessage
20-01-2011, 16:19
Забыл совсем про копирование. :)

xcopy /i /y /q "ArchivePath" "c:\%date:~6,4%\%date:~3,2%\%date:~0,2%\"
xcopy /i /y /q "ArchivePath" "d:\mail\out\"

yaoleg2
21-01-2011, 00:58
SendMessage, Спасибо за помощь!!!

Но скрипт должен быть "одноразовым", а не формировать сразу все названия архивов используя номер архива по порядку от 1 до 9. Нужно запустить один раз скрипт, сформировать название архива, скопировать в папки и завершить работу скрипта. Потом снова запустить скрипт(когда будет нужно), но нумерация не должна начинаться с 1, а должна начинаться учитывая последний номер созданного архива, то есть ели был файл после первого запуска С20аabc1.С01, соответственно при следующем запуске название будет С20аabc2.С01, а не С20аabc1.С01 как сейчас.

Большое спасибо за помощь!

SendMessage
21-01-2011, 04:24
yaoleg2, не совсем ясна постановка - номер архива должен увеличиваться только при прочих равных символах в названии и расширении, или как? Например, если поменять раширение с С01 на С02, то счетчик опять должен начинаться с единицы?
нумерация не должна начинаться с 1, а должна начинаться учитывая последний номер созданного архива, то есть ели был файл после первого запуска С20аabc1.С01, соответственно при следующем запуске название будет С20аabc2.С01, а не С20аabc1.С01 как сейчас. »
Нужно сканировать папку (только какую, где все эти архивы хранятся, если не считать того, что они скопированы в соответствующие папки?) на соответствие имени, выбирать среди найденных наибольший по нумерации и увеличивать индекс. А если уже предел до 9 достигнут, начнет затирать старые или автоматически должен увеличиваться номер архива в расширении?
Короче говоря: неясностей много. Но, при полной и ясной постановке задачи - решение вполне возможно.

yaoleg2
21-01-2011, 09:45
Нумерация должна быть "сквозной", независимо от расширения архива.
Я думаю лучше в папке со скриптом создать текстовый файл в котором записывать какая цифра была последней, и при создании нового названия архива считывать значение из файла увеличивая на единицу. Но на следующий день - число должно быть 1 и т.д. Даже если в текстовом файле стоит 3(или любое другое число), с нового дня архив должен начинаться с единицы!
Нумерации после 9 должна снова идти по "кругу" 1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9, ибо вероятность создания двух архивов с одинаковыми названиями ничтожна из-за того что расширение архива в основном разное.

SendMessage
21-01-2011, 19:11
@echo off

if exist index.txt (set /p n=<index.txt) else (set n=0%date:~0,2%)
set "day=%date:~0,2%"
if not "%n:~1,2%"=="%day%" (set i=1) else (set /a i=%n:~0,1%+1)
if %i% gtr 9 set i=1
echo.
echo ****************************
echo Формирование названия архива
echo ****************************
echo.
set /p ext=Выберите расширение архива (например, С01):
call:ReplaceMonthName %date:~3,2%
echo.
echo ArchiveName : %ext:~0,1%%day%%month%abc%i%.%ext%
echo.
::Далее идут команды для архивирования. Предполагается, что Вы их знаете.
xcopy /i /y /q "ArchivePath" "c:\%date:~6,4%\%date:~3,2%\%date:~0,2%\"
xcopy /i /y /q "ArchivePath" "d:\mail\out\"
echo.%i%%day%>index.txt
goto:eof

:ReplaceMonthName
set month=%1
set month=%month:01=a%
set month=%month:02=b%
set month=%month:03=c%
set month=%month:04=d%
set month=%month:05=e%
set month=%month:06=f%
set month=%month:07=g%
set month=%month:08=h%
set month=%month:09=i%
set month=%month:10=j%
set month=%month:11=k%
set month=%month:12=l%
exit /b

yaoleg2
24-01-2011, 20:17
Спасибо, все работает на УРА!!! :ok: :laiel:

Только еще один нюанс. При вводе расширения архива нужно вводить только три символа английского алфавита: одну букву и две цифры. Можно сделать контроль ввода этих символов???:dont-know

Большущее СПАСИБО!!! :yahoo:

Busla
25-01-2011, 11:21
попахивает госструктурой

SendMessage
25-01-2011, 16:25
Только еще один нюанс. При вводе расширения архива нужно вводить только три символа английского алфавита: одну букву и две цифры. Можно сделать контроль ввода этих символов??? »
Поменяй код вот в этом месте (не хочу опять портянку постить):
echo ****************************
echo Формирование названия архива
echo ****************************
:ArchiveName
echo.
set /p ext=Выберите расширение архива (например, С01):
echo.%ext%|findstr /i "\<[a-z][0-9][0-9]\>">nul||(echo Расширение выбрано неверно.&goto ArchiveName)
call:ReplaceMonthName %date:~3,2%
Красным выделено новое.

yaoleg2
07-11-2013, 09:50
Нумерации после 9 должна снова идти по "кругу" 1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9, ибо вероятность создания двух архивов с одинаковыми названиями ничтожна из-за того что расширение архива в основном разное. »
Условия изменились, все-таки архивы иногда получаются с одинаковыми названиями, поэтому нужно сделать продолжение нумерации архивов после 9 архива начинать нумерацию по латинскому алфавиту, то есть с: A, B, C, и т.д. (1,2,3,4,5,6,7,8,9, a,b, c, ...) Насколько это реально?
Спасибо за помощь!!!

Iska
07-11-2013, 10:06
Условия изменились, все-таки архивы иногда получаются с одинаковыми названиями, поэтому нужно сделать продолжение нумерации архивов после 9 архива начинать нумерацию по латинскому алфавиту, то есть с: A, B, C, и т.д. (1,2,3,4,5,6,7,8,9, a,b, c, ...) Насколько это реально? »
Насколько реально, что и букв латинского алфавита не хватит? Может, не стоит изобретать себе на голову приключения:
Нумерации после 9 должна снова идти по "кругу" 1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9, ибо вероятность создания двух архивов с одинаковыми названиями ничтожна из-за того что расширение архива в основном разное. »
а потом их героически решать?

yaoleg2
07-11-2013, 21:17
Iska, такая ситуация бывает редко, но когда бывает перезаписываются некоторые архивы, что не есть хорошо :(

Iska
07-11-2013, 22:07
yaoleg2, знаете выход из этой ситуации? Достаточно просто добавлять к имени архива дату и время его создания. Без изобретения всяких игр с нумерацией цифрами, а затем латинским алфавитом.

yaoleg2
07-11-2013, 22:23
Iska, все было-бы проще если б не правила создания архива, которым эти архивы и должны соответствовать иначе мы будем наказаны :yes:
Или может быть, можно как-нибудь проверять архивную директорию на наличие файла с таким названием и если есть такое название архива менять цифру 1 на 2 или 3 ...9 ?

Гуллипут
08-11-2013, 14:16
А какие проблемы добавить if exist ?

Например:

if not "%n:~1,2%"=="%day%" (set i=1) else (set /a i=%n:~0,1%+1)
:loop
if exist ... (
set /A i+=1
goto loop
)



Да и с заменой номера на букву проблем нет:


Setlocal EnableDelayedExpansion
set ABC= 123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
set i=%1

set d=!ABC:~%i%,1!
echo d=%d%
REM теперь в переменной d цифра 1-9 или буква A-Z



Только надо позаботиться, чтобы i не превысило 35.




© OSzone.net 2001-2012