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

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

r-studio 10-06-2013 20:13 2165490

батник для apxивaции набора пaпок
 
П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 2165612

Код:

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

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

Iska 11-06-2013 16:06 2165931

Цитата:

Цитата r-studio
А что такое Rem Серый форум »

Серый форум
читать дальше »
конкретно приведена ссылка на тему с использованным кодом: CMD/BAT: получение формата дата-время для имени файла (Страница 1) — CMD/BAT — Серый форум, идея которого, в свою очередь, была почерпнута из поста тутошнего участника amel27. Вот такой круговорот воды идей в природе.


Цитата:

Цитата r-studio
и код файла списка это уже отдельный батник? »

Отдельный текстовый файл:
Цитата:

Цитата r-studio
нaбop пaпoк (oни пеpечисл. в текстoвoм фaйле) »


vanoman 12-06-2013 08:49 2166263

Кстати давно себе тоже искал подобную тему!

r-studio 12-06-2013 10:29 2166294

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 2166336

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

r-studio 14-06-2013 22:31 2167873

вроде делал все так, но ошибка пути нашлась?

Iska 15-06-2013 03:33 2167948

r-studio, на Вашем скриншоте невозможно разобрать буквы.

r-studio 15-06-2013 16:12 2168139

Iska,
давайте прикреплю её.))

Iska 15-06-2013 18:13 2168198

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

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

r-studio 15-06-2013 19:47 2168243

Отправил личное сообщение.

Iska 15-06-2013 20:27 2168259

Цитата:

Цитата r-studio
Отправил личное сообщение. »

Получил.

Как я и предполагал, Вы не придали должного внимания моему замечанию:
Цитата:

Цитата Iska
О формате файла-списка, содержащего имена файлов и папок, прочтите в документации:
Код:

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

В итоге, Ваш файл «listfile.txt» в кодировке ANSI/1251, а 7-zip по умолчанию ожидает увидеть там UTF-8:
Непрочитанное Вами в файле справки 7-Zip…
Цитата:

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 2168312

Iska, что то опять не так. я записал видео файл, где показываю, что я делаю как Вы сказали. Можете посмотреть , плизз, а где, косяк то?
файл в личку отправил;)

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

Iska 15-06-2013 23:32 2168316

Цитата:

Цитата r-studio
а где, косяк то? »

Возможно, здесь:
Цитата:

Цитата r-studio
К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 2168327

Iska,

скопировал Ваш поправленный код, где нет r
делаю
вот скрин. опять он недоволен



Iska 16-06-2013 01:44 2168333

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

akbyn 16-06-2013 07:14 2168361

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

r-studio 16-06-2013 10:08 2168423

Iska, вот теперь получилось. с этим 7zip гемора многа.

Iska 17-06-2013 18:06 2169301

Из писем в PM:
Цитата:

Цитата r-studio
а можно Вас попросить в сам код батника … вставить к listfile
например , чтобы в самом батнике было прописано Е:\123\listfile.txt

Цитата:

Цитата r-studio
тут тема в том, что надо чтобы юзер просто кликнул по батнику и пошла архивация.
без входа в командную строку. Так можно сделать?

Можно. Но не нужно.

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

Цитата:

Цитата r-studio
с этим 7zip гемора многа. »

Ничуть.

r-studio 17-06-2013 20:15 2169385

Iska,
тут дело ещё в том, что на моем компе батник работает, НО на другом компе он не работает, при том, что пути к файлам, кот. указаны в листфайл.тхт на обоих компах одинаковы. Условно говоря с:\2\н.док на обоих компах одинаковы.
и я реально не понимаю в чем дело.
тут код надо редактировать.

Iska 17-06-2013 22:06 2169461

Цитата:

Цитата r-studio
НО на другом компе он не работает »

Как именно он не работает «на другом компе»?

r-studio 17-06-2013 22:28 2169475

Iska, я понял что надо сделать.
надо в батнике прописать что то, чтобы он автоматически менял кодировку на utf-8
сейчас на 7-ке стал проводить эксперименты. взял свой этот батник пересохранил его в ютф-8, а листфайл оставил прежним.эффекта нет.
тогда взял листфаил пересохранил его в ютф-8. все стало ок.
Вопрос: можно ли в батнике что то прописать, чтобы он автоматически пересохранял файлы в ютф-8

дело в том, что на хр эта процедура по ходу не требуется, а вот на 7-ке требуется.

Iska 17-06-2013 23:25 2169511

r-studio, кодировка пакетных файлов, за исключением редких случаев, должна быть в OEM/866. Разницы тут в операционных системах, будь то Windows XP, або Windows 7, нет. Потому сохранять пакетный файл в UTF-8 нет никакого смысла.

Цитата:

Цитата r-studio
тогда взял листфаил пересохранил его в ютф-8. все стало ок. »

Значит, там Вы так и оставили как было, не добавив в командную строку 7-Zip'а указание на кодировку файла-списка, отличную от умолчальной для него UTF-8. См. выше пост #13.

Цитата:

Цитата r-studio
Вопрос: можно ли в батнике что то прописать, чтобы он автоматически пересохранял файлы в ютф-8 »

Можно, но не нужно.

Цитата:

Цитата r-studio
дело в том, что на хр эта процедура по ходу не требуется, а вот на 7-ке требуется. »

Не требуется.

r-studio 17-06-2013 23:36 2169516

Iska, я добавил -scsWIN» в батник
читать дальше »
@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="e:\123\Listfile.txt"

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 ==========================================================================


на хр заработало , а вот на 7-ке тот же батник с тем же листом (пути были сохранены к файлам) ничего не стал делать.и только после пересохранения листфайла в utf8 случилось волшебство, на 7-ке заработал. При том, что параметр -scsWIN был оставлен в коде.

вот и возникла идея, чтобы он автоматически обнаруживал кодировку и исправлял её.

Iska 18-06-2013 00:48 2169547

r-studio, чудеса ;).

r-studio 18-06-2013 09:12 2169639

Да, точно:) Ну так можно код подправить,чтобы он сам кодировку изменял?)))

Iska 18-06-2013 22:31 2170349

Цитата:

Цитата r-studio
Ну так можно код подправить,чтобы он сам кодировку изменял?))) »

Поправляйте. У меня работает, посему не вижу смысла идти поперёк документации.

r-studio 18-06-2013 22:52 2170370

ладно, тема объявляется решенной. :)

Iska 26-06-2013 11:22 2174538

r-studio, почистите личку:
Цитата:

r-studio превысил(а) максимальный объем сохраненных персональных сообщений и не может получать новые сообщения, пока не удалит часть старых.

r-studio 26-06-2013 22:42 2174990

сделал


Время: 05:38.

Время: 05:38.
© OSzone.net 2001-