Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как с помощью скрипта создать архив с динамичным названием учитывая нужные критерии (http://forum.oszone.net/showthread.php?t=197136)

yaoleg2 20-01-2011 14:18 1593068

Как с помощью скрипта создать архив с динамичным названием учитывая нужные критерии
 
Есть несколько файлов (количество файлов постоянно меняется), с разным названием и расширением (Например: Документ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 1593166

Что-то вроде такого?
Код:

@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 1593187

Забыл совсем про копирование. :)
Код:

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 1593550

SendMessage, Спасибо за помощь!!!

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

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

SendMessage 21-01-2011 04:24 1593598

yaoleg2, не совсем ясна постановка - номер архива должен увеличиваться только при прочих равных символах в названии и расширении, или как? Например, если поменять раширение с С01 на С02, то счетчик опять должен начинаться с единицы?
Цитата:

Цитата yaoleg2
нумерация не должна начинаться с 1, а должна начинаться учитывая последний номер созданного архива, то есть ели был файл после первого запуска С20аabc1.С01, соответственно при следующем запуске название будет С20аabc2.С01, а не С20аabc1.С01 как сейчас. »

Нужно сканировать папку (только какую, где все эти архивы хранятся, если не считать того, что они скопированы в соответствующие папки?) на соответствие имени, выбирать среди найденных наибольший по нумерации и увеличивать индекс. А если уже предел до 9 достигнут, начнет затирать старые или автоматически должен увеличиваться номер архива в расширении?
Короче говоря: неясностей много. Но, при полной и ясной постановке задачи - решение вполне возможно.

yaoleg2 21-01-2011 09:45 1593685

Нумерация должна быть "сквозной", независимо от расширения архива.
Я думаю лучше в папке со скриптом создать текстовый файл в котором записывать какая цифра была последней, и при создании нового названия архива считывать значение из файла увеличивая на единицу. Но на следующий день - число должно быть 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 1594198

Код:

@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 1596405

Спасибо, все работает на УРА!!! :ok: :laiel:

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

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

Busla 25-01-2011 11:21 1596726

попахивает госструктурой

SendMessage 25-01-2011 16:25 1596983

Цитата:

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

Поменяй код вот в этом месте (не хочу опять портянку постить):
Код:

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 2249032

Цитата:

Цитата yaoleg2
Нумерации после 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 2249045

Цитата:

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

Насколько реально, что и букв латинского алфавита не хватит? Может, не стоит изобретать себе на голову приключения:
Цитата:

Цитата yaoleg2
Нумерации после 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 2249503

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

Iska 07-11-2013 22:07 2249580

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

yaoleg2 07-11-2013 22:23 2249596

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

Гуллипут 08-11-2013 14:16 2250005

А какие проблемы добавить 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.


Время: 01:22.

Время: 01:22.
© OSzone.net 2001-