PDA

Показать полную графическую версию : [решено] выбрать, заархивировать, скопировать


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

Hrust2010
15-11-2010, 22:34
Доброго времени суток!

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

Спасибо.

NiOl
16-11-2010, 00:23
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
Спасибо большое. То что нужно.
Признаю, не совсем корректный пример привел с папкой с:\temp

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

Спасибо!

NiOl
16-11-2010, 11:15
После копирования созданного архива на новое место, удалить его там где он создавался, »

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

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


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

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

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

gora
20-01-2011, 09:42
что означают параметры после cmp »
Это параметры передаваемые в подпрограмму cmp:
%%~tf - дата\время создания файла (подробнее см. FOR /? ). Этот параметр в п\п будет в переменной %1
%%f - имя файла. Этот параметр в п\п будет в переменной %2, правда в коде она, видимо ошибочно, прописана как %3, т.к. %2 я не увидел.откуда идет вызов этого скрипта? Немного не понимаю почему не указывается путь, откуда запускается 7z »
Используется автономный архиватор 7za.exe, лежащий рядом со скриптом. В этом случае путь к нему можно не указывать.что означает ключ /w после start? В хелпе это не описано или я невнимательно прочла »Ключ /w - одна из форм записи ключа /WAITWAIT - Запуск приложения с ожиданием его завершения.

Sirimika
20-01-2011, 11:57
попыталась повторить сделать что-то подобное.
Сначала объясню ситуацию.
мне нужно из папки 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
из папки scan все содержимое архивировать »
1 В один архив или каждый файл и каждую вложенную папку (а они у Вас там видимо есть) в отдельный архив?
2 В этом одном архиве должна быть заархивирована сама папка scan или только ее содержимое, т.е. в архиве все должно быть БЕЗ папки scan ?

Sirimika
20-01-2011, 12:09
1 В один архив или каждый файл и каждую вложенную папку (а они у Вас там видимо есть) в отдельный архив? »
все должно быть в одном архиве

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

gora
20-01-2011, 12:34
@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
Здорово. Все оказалось намного проще =)
Только еще один момент. Нужно обойтись одним скриптом.
Структура папок такова:
something
|
|_MSK
| |
| |_scan
| |_arhive
|
|_SPB
|
|_scan
|_arhive

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

gora
20-01-2011, 13:15
@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
Можно еще один глупый вопрос?
Я так и не поняла, что означает
1>Nul и 2>Nul
Не могли бы вы пояснить это

gora
21-01-2011, 09:59
Не могли бы вы пояснить это »
На форуме есть "Поиск" (в верхней части страницы) ;)
1>Nul и 2>Nul
(http://forum.oszone.net/post-1053769.html#post1053769)

Sirimika
21-01-2011, 10:06
не внимательно искала :blush2:
Огромное спасибо за помощь =)

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

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

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

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

gora
31-01-2011, 18:07
если папка 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
Запись
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
Большое спасибо. Понимаю, что мои проблемы в том, что я не знаю команд.

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

Позволю не согласиться. Тут я совершила опечатку. У меня в коде было написано:
dir "%SrcDir%%i%\*" /a-d 2>Nul >Nul && goto1




© OSzone.net 2001-2012