информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / sysadmin
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
http://www.batchfiles.co.nr/ 06.07.05 19:53  Число просмотров: 12106
Автор: whiletrue <Роман> Статус: Elderman
<"чистая" ссылка>
<sysadmin>
О, великие гуру бат-файлов, а может быть даже vbs-скриптов! I need your help… 05.07.05 07:10   [Den]
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
Постановка задачи простая... Как у теоремы Ферма ;-)

Нужно делать периодически резервные копии... При помощи популярного архиватора, к примеру RAR. И при помощи Планировщика Windows, конечно же... Конечная цель работы скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar

Внимание, вопрос: как вставить дату в имя создаваемого файла при помощи бат-файла или скрипта?
Можно, конечно же, наваять консольную софтинку... Но всё-таки хотелось бы встроенными средствами Windows.
Заранее всем огромное спасибо за примеры.
ну если ты хочешь чисто шелловскими возможностями то тогда... 31.03.06 20:27  
Автор: AL_M Статус: Незарегистрированный пользователь
<"чистая" ссылка>
ну если ты хочешь чисто шелловскими возможностями то тогда идея такая:

time > time_stamp < "ENTER"
edlin time_stamp < "2,10dENTERe"
for /f "delims=: tokens=2,3,4" %i in (time_stamp) do set time_stamp =%i_%j_%k
ну а затем вызываешь rar напр. передавая ему в качестве имени архива %time_stamp% (я просто опций рар-а не помню)

дерзай! проверено для вин2000

** в первых двух командах в "" взято содержимое предопределенных файлов которые нужно создать ручками причем маленькие буквы -- то что нужно вводить как есть БОЛЬШИЕ -- назв. спец символа (сам догадаешься какого)


> Постановка задачи простая... Как у теоремы Ферма ;-)
>
> Нужно делать периодически резервные копии... При помощи
> популярного архиватора, к примеру RAR. И при помощи
> Планировщика Windows, конечно же... Конечная цель работы
> скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar
>
> Внимание, вопрос: как вставить дату в имя создаваемого
> файла при помощи бат-файла или скрипта?
> Можно, конечно же, наваять консольную софтинку... Но
> всё-таки хотелось бы встроенными средствами Windows.
> Заранее всем огромное спасибо за примеры.
[NT+ (cmd.exe)] Делай раз, делай два... [upd3] 02.10.05 13:30  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 05.10.05 17:59  Количество правок: 13
<"чистая" ссылка>
> Постановка задачи простая... Как у теоремы Ферма ;-)
>
> Нужно делать периодически резервные копии... При помощи
> популярного архиватора, к примеру RAR. И при помощи
> Планировщика Windows, конечно же... Конечная цель работы
> скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar

Можно так:
rar a -agDD-MM-YYYY -- \_.rar ...

> Внимание, вопрос: как вставить дату в имя создаваемого
> файла при помощи бат-файла или скрипта?
> Можно, конечно же, наваять консольную софтинку... Но
> всё-таки хотелось бы встроенными средствами Windows.
> Заранее всем огромное спасибо за примеры.

Здесь так:
for /F "tokens=2,3,4 delims=- " %%i in ("%date%") do rar a %%k%%j%%i.rar ...
или
for /F "tokens=2,3,4 delims=- " %%i in ('date /t') do rar a %%k%%j%%i.rar ...

---
(Создается архив с датой в имени формата YYYYMMDD.rar
Такое именование позволяет легко сортировать архивы по именам в правильной последовательности дат.)
Обратите внимание, что данный пример приведен для представления даты в ОС формата "dd DD-MM-YYYY", где "dd" - день недели. Поэтому в delims, кроме "-" есть еще и " " (пробел).

Еще вариант:
rar a %date:~9,4%%date:~6,2%%date:~3,2%.rar ...
или
rar a %date:~-4%%date:~-7,2%%date:~-10,2%.rar ...
или
rar a %date:~-4,4%%date:~-7,-5%%date:~-10,-8%.rar ...

---
Что равносильно.
Также в формате YYYYMMDD - универсален для любых разделителей в представлении даты ОС.

А это маленький оффтоп:
(ответ Fly4life'у на http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=21&m=126845 (sorry, та ветка уже закрыта))
for /F "eol=; tokens=1,2 delims= " %%i in (rules.txt) do move /Y %%i %%j

---
Ко всему прочему, в файле rules.txt можно указывать несколько файлов, разделенных запятыми, для перемещения их в один каталог. Эта возможность поддерживается командой move.

На десерт: Frequently Asked Questions Regarding The Windows 2000 Command Processor
О, великий гуру, усложним задачу, сведя ее а очень... 03.10.05 11:33  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 03.10.05 11:35  Количество правок: 1
<"чистая" ссылка>
> А это маленький оффтоп:
> (ответ Fly4life'у на
> http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=21&m
> =126845 (sorry, та ветка уже закрыта))
> for /F "eol=; tokens=1,2 delims= " %%i in
> (rules.txt) do move /Y %%i %%j


О, великий гуру, усложним задачу, сведя ее к очень актуальной в нашей жизни. Для разгребания помойки полезно передвигать целые каталоги, если внутри нет свежих (менее полугода) файлов с рабочего на другой носитель/том/накопитель с сохранением структуры каталогов и прав доступа.
Вот примеры VBScriptов для вашей задачи 06.10.05 09:34  
Автор: svtvl Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Для разгребания помойки полезно
> передвигать целые каталоги, если внутри нет свежих (менее
> полугода) файлов с рабочего на другой
> носитель/том/накопитель с сохранением структуры каталогов и
> прав доступа.

Получение разницы дат (количество дней)
Wscript.Echo "Days Differ between today and 1 september 2005 " & DateDiff("d","1/9/2005", Date )

Получение даты файла
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("c:\windows\system32\scrrun.dll")
Wscript.Echo "Date last accessed: " & objFile.DateLastAccessed
Wscript.Echo "Date last modified: " & objFile.DateLastModified

Копирование каталога полностью, но права доступа меняются на права каталога приёмника
список всех папок в папке
strComputer = "." ' имя компютера
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colFolders = objWMIService.ExecQuery( _
"Select * from Win32_Directory where Name = 'd:\\test'")
For Each objFolder in colFolders
errResults = objFolder.copy("c:\Archive")
' Wscript.Echo errResults, err.description
' Wscript.echo err.number
Next

получение списка файлов в папке
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("d:\22")
Set colFiles = objFolder.Files
For Each objFile in colFiles
Wscript.Echo objFile.Name, objFile.Size
Next

:) Только, пожалуйста, без приколов. Ok? Если хочешь, чтоб я помог, так и скажи. ;) 03.10.05 12:32  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
А если у тебя уже есть решение, то лучше не тратить время в пустую.
Задачка интересная. Можно попробовать.
Ни каких приколов. Просто мне понравилась простота решения и... 03.10.05 16:26  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
> А если у тебя уже есть решение, то лучше не тратить время в
> пустую.
> Задачка интересная. Можно попробовать.

Ни каких приколов. Просто мне понравилась простота решения и обрадовало что встречаются еще правильно мыслящие люди.
Насчет помощи - глобально задача так пока не стоит, но очень полезно будет иметь ее решение. И я бы попользовался, и многим пригодилось бы.
Тады вот такой батничик для начала: [upd4] 04.10.05 20:33  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 05.10.05 13:29  Количество правок: 9
<"чистая" ссылка>
Скриптец позволяет расчитать дату по дельте дней от указанной даты и возвращает результат формата YYYYMMDD в стандартный вывод.
Например, при стандарте РФ в представлении даты системы, для получения даты на 183 дня (примерно полгода) раньше текущей надо делать так (в bat файле):

for /F "tokens=* " %%i in ('calcdate.bat "dd DD.MM.YYYY" "%date%" -183') do set $date=%%i
set year=%$date:~0,4%
set month=%$date:~4,2%
set day=%$date:~-2%
rem Результат
echo YYYY=%year%; MM=%month%; DD=%day%

---
Все параметры для calcdate.bat, кроме дельты, обязательно указывать в двойных кавычках.
С перемещением каталогов додумаю потом (я на работе все-таки), а пока вот вам новая "игрушка":


@echo off
rem ---------- calcdate.bat ----------
rem --- Written by Den[bugtraq.ru] ---
rem ----------------------------------
rem Enter: %1 - Формат передающейся даты в двойных кавычках: DD, MM, YYYY в любой последовательности с любыми разделителями. Пример: "dd DD-MM-YYYY", dd используются для пропускания дней недели.
rem %2 - Дата в двойных кавычках указанного в %1 формата
rem %3 - Дельта со знаком. Примеры: -180, +3
rem Exit: В стандартном выходе расчетная дата формата YYYYMMDD
setlocal
set $date=%~2
call :getpos YYYY "%~1"
if defined $pos (call set year=%%$date:~%$pos%,4%%) else goto :EOF
call :getpos MM "%~1"
if defined $pos (call set month=%%$date:~%$pos%,2%%) else goto :EOF
call :getpos DD "%~1"
if defined $pos (call set day=%%$date:~%$pos%,2%%) else goto :EOF
rem Отбрасываем признак восьмеричного числа.
for /F "tokens=* delims=0" %%i in ("%day%") do set /a daycount=%%i
for /F "tokens=* delims=0" %%i in ("%year%") do set /a year=%%i
for /F "tokens=* delims=0" %%i in ("%month%") do set /a month=%%i
rem Кол-во високосных
set /a i=(%year%-1)/4
rem Текущий после високосного, если j==4, то идет високосный
set /a j=%year%-%i%*4
rem Кол-во дней в полных годах до текущего
set /a daycount+=%i%*1461+(%j%-1)*365
set /a i=%month%

:loop
set /a i-=1
if %i%==0 goto :next
if %i%==1 set /a daycount+=31
if %i%==2 (if %j%==4 (set /a daycount+=29) else set /a daycount+=28)
if %i%==3 set /a daycount+=31
if %i%==4 set /a daycount+=30
if %i%==5 set /a daycount+=31
if %i%==6 set /a daycount+=30
if %i%==7 set /a daycount+=31
if %i%==8 set /a daycount+=31
if %i%==9 set /a daycount+=30
if %i%==10 set /a daycount+=31
if %i%==11 set /a daycount+=30
if %i%==12 set /a daycount+=31
goto :loop

:next
rem Days after christmas: %daycount%
set /a daycount+=%3
rem Result=%daycount%
set /a i=%daycount%/1461
set /a j=%daycount%-%i%*1461
if %j%==0 set /a i-=1
set /a daycount-=%i%*1461
set /a year=%i%*4
set /a i=%daycount%/365
if %j%==0 set /a i-=1
set /a j=%daycount%-%i%*365
if %j%==0 set /a i-=1
set /a daycount-=i*365
set /a i+=1
set /a year+=%i%
set /a j=%daycount%
set /a month=1

:loop_1
if %month%==1 set /a j-=31
if %month%==2 (if %i%==4 (set /a j-=29) else set /a j-=28)
if %month%==3 set /a j-=31
if %month%==4 set /a j-=30
if %month%==5 set /a j-=31
if %month%==6 set /a j-=30
if %month%==7 set /a j-=31
if %month%==8 set /a j-=31
if %month%==9 set /a j-=30
if %month%==10 set /a j-=31
if %month%==11 set /a j-=30
if %month%==12 set /a j-=31
if %j% LEQ 0 goto :next_1
set /a month+=1
set /a daycount=%j%
goto :loop_1

:next_1
set lz=0000
call :getlen "%year%"
set /a $len=4-%$len%
if not %$len%==0 call set year=%%lz:~-%$len%%%%year%
call :getlen "%month%"
set /a $len=2-%$len%
if not %$len%==0 call set month=%%lz:~-%$len%%%%month%
set /a days=%daycount%
call :getlen "%days%"
set /a $len=2-%$len%
if not %$len%==0 call call set days=%%lz:~-%$len%%%%days%
echo %year%%month%%days%
endlocal
goto :EOF


:getlen
rem Enter: %1 - Строка в двойных кавычках
rem Exit: $len - Длина строки без учета двойных кавычек
set par=%~1
set /a i=0
set $len=

:getlen_loop
call :getlen_1 "%%par:~%i%,1%%"
if defined $len goto :EOF
set /a i+=1
goto :getlen_loop

:getlen_1
if %1=="" set /a $len=%i%
goto :EOF

:getpos
rem Enter: %1 - Искомая строка в двойных кавычках
rem %2 - Строка-источник в двойных кавычках
rem Exit: $pos - Позиция искомой строки в строке-источнике без учета двойных кавычек.
call :getlen "%~1"
set /a $findlen=%$len%

call :getlen "%~2"
set /a $formatlen=%$len%-1
set par=%~2
set /a i=0
set $pos=

:getpos_loop
call :getpos_1 %i% "%~1" "%%par:~%i%,%$findlen%%%"
if defined $pos goto :EOF
if %i%==%$formatlen% goto :EOF
set /a i+=1
goto :getpos_loop

:getpos_1
if %2==%3 set /a $pos=%i%
goto :EOF
rem ---------- END calcdate.bat ----------

---
Зря я это затеял... 05.10.05 11:44  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 05.10.05 11:45  Количество правок: 1
<"чистая" ссылка>
Можно то оно скорее всего можно, но не следует этого делать на командных интерпретаторах. Если уж работа с датами такая, то обходить каталоги, просматривая файлы на предмет даты их последнего изменения, вообще будет убийство.
Не надо так думать! ;) Есть решение! [upd3] 07.10.05 17:19  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 16.07.07 16:43  Количество правок: 5
<"чистая" ссылка>
Это у меня дата расчитывается по кол-ву дней, а ведь можно и упростить, сделать расчет по месяцам почти без изменения дня месяца. Получится немного быстрее, но просядет гибкость.

> Можно то оно скорее всего можно, но не следует этого делать
> на командных интерпретаторах.

Почему же?
Все равно все это будет делаться ночью, запускаясь из шедулера. Не думаю, что у тебя уровень вложенности каталогов на столько велик, что скрипт не отработает за час.
Мы же не будем даты каталогов конвертить через calcdate.bat.

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

Это, как раз менее серьезная и менее времязатратная проблема.

Решение задачи:
(выполняется очень быстро за счет оптимизации парсинга подкаталогов)
@echo off
rem ---------- deltabkp.cmd ----------
rem --- Written by Den[bugtraq.ru] ---
rem ----------------------------------
rem Enter: %1 - Source directory
rem   %2 - Date delta
setlocal
if "%~2"=="" (
  echo !Error! Date delta not defined.
  goto :eof
)
set /a datedelta=%~2
if "%~1"=="" (
  echo !Error! File directory not defined.
  goto :eof
)
set srcdir=%~f1
if "%srcdir:~-1,1%"=="\" set srcdir=%srcdir:~0,-1%
rem --- Получаем разделитель и формат даты
:loopreg
set regfile=%random%.reg
if exist %regfile% goto :loopreg
regedit /e %regfile% "HKEY_CURRENT_USER\Control Panel\International"
if not exist %regfile% (
  echo !Error! REG file not found.
  goto :eof
)
for /F "skip=2 tokens=1,* delims== eol=[" %%i in ('type %regfile%') do if "sDate"=="%%~i" (
  set datedelim=%%~j
) else if "sShortDate"=="%%~i" set dateform= %%~j
del /Q %regfile%
if not defined datedelim (
  echo !Error! Date delimiter not defined.
  goto :eof
) else if not defined dateform (
  echo !Error! Date format not defined.
  goto :eof
)
set dateform=%dateform:d=D%
set dateform=%dateform:m=M%
for /F "delims=yY tokens=1,*" %%k in ("%dateform%") do set dateform=%%kYYYY%%l
set dateform=%dateform:~1%

rem --- Получаем позиции DD,MM,YYYY
for /F "delims=%datedelim% tokens=1,2,3" %%i in ("%dateform%") do (
  if "%%i"=="DD" (
    if "%%j"=="MM" (set $dateorder=%%z%%y%%%x
    ) else (set $dateorder=%%y%%z%%%x
  )) else if "%%i"=="MM" (
    if "%%j"=="DD" (set $dateorder=%%z%%x%%%y
    ) else (set $dateorder=%%y%%x%%%z
  )) else (
    if "%%j"=="DD" (set $dateorder=%%x%%z%%%y
    ) else (set $dateorder=%%x%%y%%%z
  ))
)
rem --- Получаем дату по дельте от текущей
for /F %%i in ('calcdate.cmd "dd %dateform%" "%date%" %datedelta%') do set $date=%%i
:looptmpfile
set tmpfile=%temp%\dbp%random%.tmp
if exist %tmpfile% goto :looptmpfile
set lvl=0
set baklvl=0
set $dir=
rem "File Not Found" error message from "dir "%~1\*" /a-d/4" command to NUL
call :nextlvl "%srcdir%" 2>nul
if exist %tmpfile% del /Q %tmpfile%
endlocal
goto :eof

:do
rem ----- START BACKUP -----
rem Examples
rem call backup.cmd "%~1"
rem rar m -cfg- -ep2 -idp -m5 -os -ow -s -t -- old_%$date%.rar "%~1"
echo dir=%1
rem ------ END BACKUP ------
goto :eof

:nextlvl
set /a lvl+=1
set /a baklvl+=1
for /F %%d in ('dir /b /ad "%~1\*"') do (
  call :nextlvl "%~1\%%d"
)
if %baklvl% LSS %lvl% (
rem --- New files in subdirectories
  set /a updlvl=%lvl%-1
  set /a lvl-=1
  goto :eof
)

set updated=0
dir "%~1\*" /a-d/4 >nul
if errorlevel 0 (
  for /F "skip=5 tokens=1 eol=  " %%f in ('dir "%~1\*" /a-d/4') do (
    for /F "tokens=1,2,3 delims=%datedelim%" %%x in ("%%f") do (
      if not "%%y"=="" (
        if %$dateorder% GTR %$date% set updated=-1
      )))
)

if %updated%==-1 (
rem --- New files found in directory
  if %baklvl% GTR %lvl% (
  rem --- Old files in subdirectories, back it up!
    for /F "tokens=*" %%f in (%tmpfile%) do call :do %%f
    del /Q %tmpfile%
  )
  set /a lvl-=1
  goto :eof
) else (
rem --- New Files not found in directory
  set baklvl-=1
  echo "%~1" >>%tmpfile%
)

:ret
set /a lvl-=1
goto :eof

---
Дык че? Типа, я зря старался? 14.10.05 18:47  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
Как это зря... Очень нужно. Сейчас загружен, есть только полчаса в день чтоб к компу подойти. Дай еще пару дней. 18.10.05 15:11  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
Таки ты попробовал? 22.03.06 13:37  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
Ну да, забыл сразу отписать. Глючит. Пару каталогов с... 22.03.06 16:38  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
Ну да, забыл сразу отписать. Глючит. Пару каталогов с файлами порядка 2002-2004 года один выдает, другой нет. С чем связано, пока не разобрался. Склепаю dir и то что она выдает и кину.
А может и не должен? [upd] 28.03.06 17:03  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 17.09.13 20:09  Количество правок: 2
<"чистая" ссылка>
Алгоритм работы следующий:

1. Если в каталоге со "старыми" файлами существует подкаталог с "новыми" файлами, то ничего не бэкапится.

2. Если в каталоге с "новыми" файлами существуют подкаталоги со "старыми" файлами, то бэкапятся подкаталоги.

3. Если в каталоге и подкаталогах только "старые" файлы, то бэкапится верхний каталог вместе с подкаталогами.

[upd]
Действительно глючило. Нашел одну серьезную ошибку. Поправил.
Добавил доп.функционал, теперь скрипт сам определяет формат даты системы.
Где новая версия? 19.09.13 00:33  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
думаю, не актуально 21.09.13 05:50  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
По-моему это твой случай 05.09.05 10:03  
Автор: apb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
http://white55.narod.ru/cmd.html
Этим занимается One-click BackUp for WinRAR... 31.08.05 09:22  
Автор: Игорь Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Постановка задачи простая... Как у теоремы Ферма ;-)
>
> Нужно делать периодически резервные копии... При помощи
> популярного архиватора, к примеру RAR. И при помощи
> Планировщика Windows, конечно же... Конечная цель работы
> скрипта -- файл архива в формате ДД-ММ-ГГГГ.rar

Этим занимается One-click BackUp for WinRAR (http://acritum.com). Есть встроенный планировщик и поддержка коммандной строки для внешнего планировщика. Программа шарварная, но в xUSSR продают за любую цену, начиная от 150 рублей :) Я купил себе через Webmoney за 200 рублей - совсем не жалею, программа реально очень удобная и стоит того, чтобы за нее заплатить. Есть русский интерфейс. Была еще совсем бесплатная версия 1.x без многих функций, добавленных в версии 2.x (очень примитивный планировщик, нет поддержки CDRW, FTP, SMTP, LAN, нет удаленного контроля через интернет и LAN, но на жесткий диск бэкапит без проблем).
Nncron и без рара бы справился 22.07.05 10:59  
Автор: Annihitor Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Можно, конечно же, наваять консольную софтинку... Но
> всё-таки хотелось бы встроенными средствами Windows.
> Заранее всем огромное спасибо за примеры.

Ненадо ничего ваять. Если бы рар не умел делать такие файлы то есть NNCRON
http://www.nncron.ru/
позволяет назначать любые задания и алгоритмы для управления ПК, дефргагментацию, архивацию, синхронизацию времени, выключение, обновление, получение почты, отработка горячих клавих, окошек и т.п. практически полностью может заменить своими макросами простые действия пользователя.
Программа просто незаменима, в некоторых случаях.
1  |  2 >>  »  




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach