Компьютерный форум 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=191322)

Hrust2010 15-11-2010 22:34 1543508

выбрать, заархивировать, скопировать
 
Доброго времени суток!

Помогите пожалуйста вот с чем.
В определенную папку, допустим с:\temp, каждый день создается бэкап, нужно этот файл определить по дате, заархивировать (если возможно присваивать каждый раз архиву имя в виде даты архивации) и потом готовый архив скопировать на другой компьютер по сети.

Спасибо.

NiOl 16-11-2010 00:23 1543595

1. Вы уверены, что в папке со временным мусором, коего за день может быть не одна сотня файлов, вы можете выловить нужный файл, только потому, что дата его создания равна сегодняшней дате?

Посмотрите, сколько файлов удовлетворит Вашему условию:
Код:

@echo off
setlocal EnableExtensions

for %%f in (c:\TEMP\*.*) do call :cmp %%~tf "%%f"
exit
:cmp
if %1==%date% echo %3
exit /b

у меня их оказалось более 2 десятков.

Если же у Вас только один файл и он - тот, что нужен - чтож, вынужден Вас поздравить.
Тогда попробуйте сейскрипт:
Код:

@echo off
setlocal EnableExtensions

Set SrcDir=C:\TEMP
Set Server=\\MyServer\MyShare\MyDir

set dt=%Date%
for %%f in (%SrcDir%\*.*) do call :cmp %%~tf "%%f"
pause
exit
:cmp
if not %1==%dt% exit /b
set archName=%time::=-%
set archName=%date:~6,4%-%date:~3,2%-%date:~0,2%_%archName:~0,-3%.zip
set archName="%SrcDir%\%archName: =0%"
start /w "" 7za a %archName% %3
copy /b %archName% "%Server%\"
exit /b

в батнике в качестве архиватора использован "7za.exe". Если намереваетесь использовать другой архиватор - в переменной %archName% лежит имя архива, а в %3 - имя файла, совпавшего по дате, оба уже в кавычках.
Также, в переменных %SrcDir% и %Server% указываются (ВАМИ) пути к каталогу поиска и к папке на сервере.

Hrust2010 16-11-2010 10:45 1543752

Спасибо большое. То что нужно.
Признаю, не совсем корректный пример привел с папкой с:\temp

Еще одна маленькая прозьба, если возможно.
После копирования созданного архива на новое место, удалить его там где он создавался, дабы не накапливались архивы в двух местах.

Спасибо!

NiOl 16-11-2010 11:15 1543785

Цитата:

Цитата Hrust2010
После копирования созданного архива на новое место, удалить его там где он создавался, »

так я думал ;)
просто замените copy /b на move /y

в догонку - а файл "бэкапа" часом удалять ненадо?


Цитата:

Цитата gora
Тогда проще создавать архив сразу на сервере: »

много проще и удобнее, особенно в условиях нехватки локального дискового пространства, но с большими файлами опаснее - любой сетевой сбой (комп, а тем более сервак обычно висит на УПС, а сетевое оборудование запитано через УПС далеко не у всех) :yes:

gora 16-11-2010 11:39 1543801

NiOl, полностью согласен с Вами, и если надежность на первом месте, то лучше оставить Copy, потом сравнить размеры файлов архивов, дабы убедится, что файл дошел до получателя в целости, а потом удалять локальный архив (при желании и исходный файл).

Sirimika 19-01-2011 16:19 1592399

поясните пожалуйста несколько моментов:
1.
Код:

for %%f in (%SrcDir%\*.*) do call :cmp %%~tf "%%f"
что означают параметры после cmp
2. откуда идет вызов этого скрипта? Немного не понимаю почему не указывается путь, откуда запускается 7z
3. что означает ключ /w после start? В хелпе это не описано или я невнимательно прочла

gora 20-01-2011 09:42 1592888

Цитата:

Цитата Sirimika
что означают параметры после cmp »

Это параметры передаваемые в подпрограмму cmp:
%%~tf - дата\время создания файла (подробнее см. FOR /? ). Этот параметр в п\п будет в переменной %1
%%f - имя файла. Этот параметр в п\п будет в переменной %2, правда в коде она, видимо ошибочно, прописана как %3, т.к. %2 я не увидел.
Цитата:

Цитата Sirimika
откуда идет вызов этого скрипта? Немного не понимаю почему не указывается путь, откуда запускается 7z »

Используется автономный архиватор 7za.exe, лежащий рядом со скриптом. В этом случае путь к нему можно не указывать.
Цитата:

Цитата Sirimika
что означает ключ /w после start? В хелпе это не описано или я невнимательно прочла »

Ключ /w - одна из форм записи ключа /WAIT
Цитата:

WAIT - Запуск приложения с ожиданием его завершения.

Sirimika 20-01-2011 11:57 1592974

попыталась повторить сделать что-то подобное.
Сначала объясню ситуацию.
мне нужно из папки scan все содержимое архивировать в zip c названием ггггммдд и переносить в папку arhive, после чего папка scan должна быть пустая.
Структура папок в приложении.

Код:

@echo on
setlocal EnableExtensions
Set SrcDir=E:\something\SPB\scan
Set Arhive=E:\something\SPB\arhive

set dt=%Date%
for %%a in (%SrcDir%\*.*) do call :cmp %%~ta
pause
exit
:cmp
if not %1==%dt% exit /b
set arhName=%date:~6,4%%date:~3,2%%date:~0,2%.zip
start /w "" 7z a -tzip %arhName%
move /y %arhName% %Arhive%
exit /b
Set SrcDir=E:\something\MSC\scan
Set Arhive=E:\something\MSC\arhive

у меня пока получается полная хрень. Он архивирует все что в папке something и создает архив в папке SPB с названием arhive и непонятно каких расширением.

gora 20-01-2011 12:06 1592981

Цитата:

Цитата Sirimika
из папки scan все содержимое архивировать »

1 В один архив или каждый файл и каждую вложенную папку (а они у Вас там видимо есть) в отдельный архив?
2 В этом одном архиве должна быть заархивирована сама папка scan или только ее содержимое, т.е. в архиве все должно быть БЕЗ папки scan ?

Sirimika 20-01-2011 12:09 1592983

Цитата:

Цитата gora
1 В один архив или каждый файл и каждую вложенную папку (а они у Вас там видимо есть) в отдельный архив? »

все должно быть в одном архиве

Цитата:

Цитата gora
2 В этом одном архиве должна быть заархивирована сама папка scan или только ее содержимое, т.е. в архиве все должно быть БЕЗ папки scan ? »

только содержимое папки

gora 20-01-2011 12:34 1592998

Код:

@echo Off
Set SrcDir=e:\something\SPB\scan
Set Arhive=e:\something\SPB\arhive

7z a "%Arhive%\%Date:~6,4%%Date:~3,2%%Date:~0,2%.zip" "%SrcDir%\*">Nul
cd /d "%SrcDir%"
RD /S /Q %SrcDir% 2>Nul
pause


Sirimika 20-01-2011 12:51 1593010

Здорово. Все оказалось намного проще =)
Только еще один момент. Нужно обойтись одним скриптом.
Структура папок такова:
something
|
|_MSK
| |
| |_scan
| |_arhive
|
|_SPB
|
|_scan
|_arhive

Нужно для MSK делать тоже самое, что и для SPB

gora 20-01-2011 13:15 1593030

Код:

@echo Off
SETLOCAL enabledelayedexpansion
Set SrcDir1=e:\something\SPB\scan
Set Arhive1=e:\something\SPB\arhive
Set SrcDir2=e:\something\MSK\scan
Set Arhive2=e:\something\MSK\arhive

Set FS=%CD%
For /L %%i In (1,1,2) Do (
        7z a "!Arhive%%i!\%Date:~6,4%%Date:~3,2%%Date:~0,2%.zip" "!SrcDir%%i!\*">Nul
        cd /d "!SrcDir%%i!"
        RD /S /Q "!SrcDir%%i!" 2>Nul
        cd /d "%FS%"
)
pause


Sirimika 21-01-2011 09:49 1593689

Можно еще один глупый вопрос?
Я так и не поняла, что означает
1>Nul и 2>Nul
Не могли бы вы пояснить это

gora 21-01-2011 09:59 1593698

Цитата:

Цитата Sirimika
Не могли бы вы пояснить это »

На форуме есть "Поиск" (в верхней части страницы) ;)
1>Nul и 2>Nul

Sirimika 21-01-2011 10:06 1593703

не внимательно искала :blush2:
Огромное спасибо за помощь =)

Sirimika 31-01-2011 16:16 1601281

А как можно реализовать проверку: если папка scan пустая, то ничего не делать.
Сейчас он в любом случае создает архив, даже если файлов нет, то архив получается пустой

дописала строчку перед самим архивированием
if not exist "!SrcDir%%i!\*.*"goto End
но он все равно создает пустой архив.

Как правильно ему указать, что нужно проверять наличие файлов в папке, а не существование самой папки

Запись
dir "%ScrDir%%i\*%" /a-d 2>nul >nul && goto 1
тоже не дает желаемого эффекта

gora 31-01-2011 18:07 1601353

Цитата:

Цитата Sirimika
если папка scan пустая, то ничего не делать »

Код:

@Echo Off
SETLOCAL enabledelayedexpansion
Set SrcDir1=e:\something\SPB\scan
Set Arhive1=e:\something\SPB\arhive
Set SrcDir2=e:\something\MSK\scan
Set Arhive2=e:\something\MSK\arhive
Set FS=%CD%
For /L %%i In (1,1,2) Do (
        RD "!SrcDir%%i!" 2>Nul
        If Exist "!SrcDir%%i!" (
                7z a "!Arhive%%i!\%Date:~6,4%%Date:~3,2%%Date:~0,2%.zip" "!SrcDir%%i!\*">Nul
                cd /d "!SrcDir%%i!"
                RD /S /Q "!SrcDir%%i!" 2>Nul
                cd /d "%FS%"
        ) Else MD "!SrcDir%%i!" 2>Nul
)
Pause


Iska 31-01-2011 20:07 1601438

Цитата:

Цитата Sirimika
Запись
dir "%ScrDir%%i\*%" /a-d 2>nul >nul && goto 1
тоже не дает желаемого эффекта »

У меня даёт:
Код:

dir "E:\Песочница\0031\*.*" /a:-d 1>nul 2>&1 && echo 1 || echo 2
Процент «%» лишний?

Sirimika 01-02-2011 09:18 1601830

Большое спасибо. Понимаю, что мои проблемы в том, что я не знаю команд.

Цитата:

Цитата Iska
Процент «%» лишний? »

Позволю не согласиться. Тут я совершила опечатку. У меня в коде было написано:
Код:

dir "%SrcDir%%i%\*" /a-d 2>Nul >Nul && goto1

Iska 01-02-2011 21:36 1602357

Цитата:

Цитата Sirimika
Позволю не согласиться. Тут я совершила опечатку. »

Sirimika, есть такое, недоглядел.

Dr.Kifir4ik 08-02-2011 02:55 1607316

У меня пишет: "7z не является внутренней или внещней командой...", подскажите что не так.

я разобрался - скопировал 7z.exe в папку с батником.


Время: 16:44.

Время: 16:44.
© OSzone.net 2001-