Войти

Показать полную графическую версию : [решено] батник для apxивaции набора пaпок


Страниц : [1] 2

r-studio
10-06-2013, 20:13
Пpoсьбa o пoмoщи к пpoфи. Кaк нaписaть пaкетный фaйл, apхивиpующий нaбop пaпoк (oни пеpечисл. в текстoвoм фaйле) в pезеpвную кoпию , и чтoбы oн aвтoмaтически генеpиpoвaл имя типa гoд_месяц_день#чaс_минутa.zip. Нaпpимеp (2013_06_10#20_10) испoльзуя язык пaкетных кoмaнд винды, и apхивaтop 7Zip. Вpемя дo пoлудня дoпoлнять лидиpующими нулями.

Iska
10-06-2013, 23:42
@echo off
setlocal enableextensions enabledelayedexpansion

call :GetDateTime
set sFileName=%DateTime:~0,4%_%DateTime:~4,2%_%DateTime:~6,2%#%DateTime:~8,2%_%DateTime:~10,2%.zip

set sFolderList=%~1

if defined sFolderList (
if exist "%sFolderList%" (
"%ProgramFiles%\7-Zip\7z.exe" a -ir@%sFolderList% "%sFileName%"
) else (
echo Can't find folder list file [%sFolderList%].
)
) else (
echo Usage: %~nx0 ^<Folder list^>
)

endlocal
exit /b 0

rem ==========================================================================
rem Функция GetDateTime()
rem
rem Серый форум / CMD/BAT: получение формата дата-время для имени файла
rem (http://forum.script-coding.com/viewtopic.php?id=5066)
rem ==========================================================================
:GetDateTime
setlocal enableextensions enabledelayedexpansion

set sProcName=%~0
for /f "delims=." %%i in ('wmic.exe OS get LocalDateTime ^| find "."') do set sDateTime=%%i

endlocal & set %sProcName:~4%=%sDateTime:~0,14%
exit /b 0
rem ==========================================================================



О формате файла-списка, содержащего имена файлов и папок, прочтите в документации:
hh.exe "mk:@MSITStore:%ProgramFiles%\7-Zip\7-zip.chm::/cmdline/syntax.htm#ListFile"
Обратите внимание на кодировку файла-списка.

r-studio
11-06-2013, 14:34
Iska, Снимаю шляпу!! Спасибо за Вашу помощь. А что такое Rem Серый форум
и код файла списка это уже отдельный батник?

Iska
11-06-2013, 16:06
А что такое Rem Серый форум »
Серый форум (http://forum.script-coding.com/)
конкретно приведена ссылка на тему с использованным кодом: CMD/BAT: получение формата дата-время для имени файла (Страница 1) — CMD/BAT — Серый форум (http://forum.script-coding.com/viewtopic.php?id=5066), идея которого, в свою очередь, была почерпнута из поста (http://forum.oszone.net/post-1518362.html#post1518362) тутошнего участника amel27 (http://forum.oszone.net/member.php?userid=38813). Вот такой круговорот воды идей в природе.

и код файла списка это уже отдельный батник? »
Отдельный текстовый файл:
нaбop пaпoк (oни пеpечисл. в текстoвoм фaйле) »

vanoman
12-06-2013, 08:49
Кстати давно себе тоже искал подобную тему!

r-studio
12-06-2013, 10:29
Iska,
т.е. эту часть кода
rem ==========================================================================
rem Функция GetDateTime()
rem
rem Серый форум / CMD/BAT: получение формата дата-время для имени файла
rem (http://forum.script-coding.com/viewtopic.php?id=5066)
rem ==========================================================================
:GetDateTime
setlocal enableextensions enabledelayedexpansion

set sProcName=%~0
for /f "delims=." %%i in ('wmic.exe OS get LocalDateTime ^| find "."') do set sDateTime=%%i

endlocal & set %sProcName:~4%=%sDateTime:~0,14%
exit /b 0
rem ==========================================================================

можно опустить?

Iska
12-06-2013, 11:59
Опустить эту часть кода, конечно, можно. Только вот оставшаяся часть кода пакетного файла без этого работать не будет ;).

r-studio
14-06-2013, 22:31
вроде делал все так, но ошибка пути нашлась?

Iska
15-06-2013, 03:33
r-studio, на Вашем скриншоте невозможно разобрать буквы.

r-studio
15-06-2013, 16:12
Iska,
давайте прикреплю её.))

Iska
15-06-2013, 18:13
r-studio, ясно. Выложите архив с Вашим файлом «listfile.txt» и Вашим «1.bat».

P.S. Ежели что-то «военное» — можете отослать архив непосредственно в личку.

r-studio
15-06-2013, 19:47
Отправил личное сообщение.

Iska
15-06-2013, 20:27
Отправил личное сообщение. »
Получил.

Как я и предполагал, Вы не придали должного внимания моему замечанию:
О формате файла-списка, содержащего имена файлов и папок, прочтите в документации:
hh.exe "mk:@MSITStore:%ProgramFiles%\7-Zip\7-zip.chm::/cmdline/syntax.htm#ListFile"
Обратите внимание на кодировку файла-списка. »

В итоге, Ваш файл «listfile.txt» в кодировке ANSI/1251, а 7-zip по умолчанию ожидает увидеть там UTF-8: For list files, 7-Zip uses UTF-8 encoding by default. You can change encoding using -scs switch.

Варианта два:

1. Сохранить файл-список в кодировке UTF-8.
2. Оставить кодировку ANSI/1251, а в командную строку вызова 7-Zip'а добавить параметр «-scsWIN»:
"%ProgramFiles%\7-Zip\7z.exe" a -ir@%sFolderList% -scsWIN "%sFileName%"

r-studio
15-06-2013, 23:14
Iska, что то опять не так. я записал видео файл, где показываю, что я делаю как Вы сказали. Можете посмотреть , плизз, а где, косяк то?
файл в личку отправил;)

я просто пытаюсь понять.))

Iska
15-06-2013, 23:32
а где, косяк то? »
Возможно, здесь:
Кaк нaписaть пaкетный фaйл, apхивиpующий нaбop пaпoк »
А Вы указываете перечень файлов. Уберите «r» из «-ir@%sFolderList%».

@echo off
setlocal enableextensions enabledelayedexpansion

call :GetDateTime
set sFileName=%DateTime:~0,4%_%DateTime:~4,2%_%DateTime:~6,2%#%DateTime:~8,2%_%DateTime:~10,2%.zip

set sFolderList=%~1

if defined sFolderList (
if exist "%sFolderList%" (
"%ProgramFiles%\7-Zip\7z.exe" a -i@%sFolderList% -scsWIN "%sFileName%"
) else (
echo Can't find folder list file [%sFolderList%].
)
) else (
echo Usage: %~nx0 ^<Folder list^>
)

endlocal
exit /b 0

rem ==========================================================================
rem Функция GetDateTime()
rem
rem Серый форум / CMD/BAT: получение формата дата-время для имени файла
rem (http://forum.script-coding.com/viewtopic.php?id=5066)
rem ==========================================================================
:GetDateTime
setlocal enableextensions enabledelayedexpansion

set sProcName=%~0
for /f "delims=." %%i in ('wmic.exe OS get LocalDateTime ^| find "."') do set sDateTime=%%i

endlocal & set %sProcName:~4%=%sDateTime:~0,14%
exit /b 0
rem ==========================================================================


╔═══════════════════════ H:\флеха ═╤══════╤════════╤═════╗╔════════════════════════ E:\123 ══╤══════╤════════╤═23:31
║и Имя │Размер│ Дата │Время║║с Имя │Размер│ Дата │Время║
║⌂.. │ Вверх│15.06.13│23:28║║⌂.. │ Вверх│15.06.13│23:29║
║ǂданные диссераl xls│ 0│15.06.13│23:28║║ 2013_06_15#23_29 zip│ 334│15.06.13│23:29║
║ǂКак пользоваться DOS docx│ 0│15.06.13│23:28║║►1 bat│ 1130│15.06.13│23:29║
║ │ │ │ ║║ listfile txt│ 66│15.06.13│19:41║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
║ │ │ │ ║║ │ │ │ ║
╟──────────────────────────────────┴──────┴────────┴─────╢╟──────────────────────────────────┴────── ┴────────┴─────╢
║⌂.. ║║►1.bat ║
╚═══════════════ 0 (2) ═══ 2,444,247,040 ════════════════╝╚══════════════ 1,530 (3) ═══ 118,665,216 ═══════════════╝

E:\123>1.bat listfile.txt

7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18

Scanning

Updating archive 2013_06_15#23_29.zip

Compressing данные диссераl.xls
Compressing Как пользоваться DOS.docx

Everything is Ok

E:\123> ↑

r-studio
16-06-2013, 01:06
Iska,

скопировал Ваш поправленный код, где нет r
делаю
вот скрин. опять он недоволен
http://s019.radikal.ru/i618/1306/c7/571029d78979t.jpg (http://radikal.ru/F/s019.radikal.ru/i618/1306/c7/571029d78979.jpg.html)

http://s017.radikal.ru/i419/1306/3d/dd2f3804e024t.jpg (http://radikal.ru/F/s017.radikal.ru/i419/1306/3d/dd2f3804e024.jpg.html)

Iska
16-06-2013, 01:44
Ну, с этим-то всё просто. Текущим каталогом при вызове пакетного файла у Вас является «e:\», в котором, понятное дело, нет файла «listfile.txt» ;). Либо укажите при вызове абсолютный/относительный путь к файлу-списку, либо предварительно сделайте текущим каталог «e:\123», его содержащий.

akbyn
16-06-2013, 07:14
День добрый!
Прошу помощи.
Интересная тема. Но есть недостаток в таком способе архивирования:
При архивировании нескольких папок общий вес архива может быть очень большим.
Думаю, более рациональным будет архивирование каждой папки в отдельный архив.
Представляю это себе это, как работающий в цикле батник, берущий имена архивируемых директорий из текстового файла.
НО, реализовать не могу.

r-studio
16-06-2013, 10:08
Iska, вот теперь получилось. с этим 7zip гемора многа.

Iska
17-06-2013, 18:06
Из писем в PM:
а можно Вас попросить в сам код батника … вставить к listfile
например , чтобы в самом батнике было прописано Е:\123\listfile.txt
тут тема в том, что надо чтобы юзер просто кликнул по батнику и пошла архивация.
без входа в командную строку. Так можно сделать?
Можно. Но не нужно.

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

с этим 7zip гемора многа. »
Ничуть.




© OSzone.net 2001-2012