PDA

Показать полную графическую версию : [решено] резервное копирование содержимого почтовой папки при выходе пользователя из системы


bootsy
25-10-2013, 16:02
Доброе время суток!
...помогите новичку
пытаюсь написать батник который раз в неделю (например только по средам) копирует все *.dbx файлы из папки почтовика в другую в момент выхода пользователя из системы и завершения работы. Написал следующий скрипт:

@echo off
rem ####резервное копирование почтовой базы
rem #### определяю переменную для дня недели
SET runday=3
echo %runday%
rem #### получаю значение дня недели и вытаскиваю из него вторую строчку с номером дня и записываю итог в переменную wd
FOR /F "SKIP=1" %%i IN ('wmic path win32_LocalTime get DayOfWeek') DO SET wd=%%i
echo %wd%
rem #### сравниваю значения в переменных и в случае равенства файлы копируются
IF /i %wd%==%runday% goto mark1 ELSE goto mark2

SET OEDBpath="C:\Documents and Settings\User\Local Settings\Application Data\Identities\{3E343025-4670-4E7C-A679-E634FB42B2AA}\Microsoft\Outlook Express"
SET BackupDRV=w:
SET BackupDir=OutlookBackup
:mark1
rem #### создаю при необходимости папку и копирую туда файлы
IF NOT EXIST %BackupDRV%\%BackupDir% md %BackupDRV%\%BackupDir%
xcopy %OEDBPath%\*.dbx %BackupDRV%\%BackupDir% /D /F /Y
:mark2

В итоге скрипт выполняет копирование при запуске в любой день (т.е. при любом значении %runday%). Он полностью игнорирует мои попытки использовать оператор IF при сравнении двух переменных %wd% и %runday%. Братцы! что я делаю неправильно? где ошибка ткните носом... плиз
заранее благодарен

Elven
25-10-2013, 17:58
Есть вариант, имхо, попроще: внести скрипт в шедуллер и создать два триггера "среда" и "logout" или использовать какой-нибудь аналог эффектор сейвера.
Но если делать так, то две ошибки.
во-первых ты используешь в for прямые апострофы, а не обратные (читай FOR /?), и во-вторых - не учитываешь, что после вывода дня недели выводится пустая строка.

вот рабочий вариант (вместо echo Friday! вставляем то что нужно сделать, ну и пятерку тройкой заменяем)
@echo off
FOR /F "usebackq" %%i IN (`wmic path win32_LocalTime get DayOfWeek ^| find "5"`) DO (
if errorlevel 1 (
echo Friday!
))

Iska
26-10-2013, 08:03
@echo off
setlocal enableextensions enabledelayedexpansion

set OEDBpath="%UserProfile%\Local Settings\Application Data\Identities\{3E343025-4670-4E7C-A679-E634FB42B2AA}\Microsoft\Outlook Express"
set BackupDRV=w:
set BackupDir=OutlookBackup

set /a iRunDay = 3

for /f "usebackq delims=" %%i in (
`wmic.exe path win32_LocalTime get DayOfWeek /value ^| find.exe /i "DayOfWeek"`
) do set i%%i

if %iRunDay% equ %iDayOfWeek% (
if not exist "%BackupDRV%\%BackupDir%\." md "%BackupDRV%\%BackupDir%"
xcopy.exe /d /f /y "%OEDBPath%\*.dbx" "%BackupDRV%\%BackupDir%\"
)
endlocal
exit /b 0

во-первых ты используешь в for прямые апострофы, а не обратные (читай FOR /?) »
Без «usebackq» как раз нужен прямой.

после вывода дня недели выводится пустая строка. »
Тоже неверное заключение.

Гуллипут
26-10-2013, 23:29
Я думаю, что участок от IF до mark1 вообще никогда не выполнится !
Поэтому так:
IF /i not %wd%==%runday% goto mark2

SET OEDBpath="C:\Documents and Settings\User\Local Settings\Application Data\Identities\{3E343025-4670-4E7C-A679-E634FB42B2AA}\Microsoft\Outlook Express"
SET BackupDRV=w:
SET BackupDir=OutlookBackup

rem #### создаю при необходимости папку и копирую туда файлы
IF NOT EXIST %BackupDRV%\%BackupDir% md %BackupDRV%\%BackupDir%
xcopy %OEDBPath%\*.dbx %BackupDRV%\%BackupDir% /D /F /Y
:mark2

bootsy
28-10-2013, 22:01
Ребят! заработало ).. как комбинация всех ваших предложений.
Спасибо каждому отозвавшемуся!
Код получился такой:

@echo off
rem ####резервное копирование почтовой базы
rem #### определяю переменную для дня недели
SET /A runday=3
SET OEDBpath="C:\Documents and Settings\User\Local Settings\Application Data\Identities\{3E343025-4670-4E7C-A679-E634FB42B2AA}\Microsoft\Outlook Express"
SET BackupDRV=w:
SET BackupDir=OutlookBackup
echo day of week to run:%runday%

rem #### получаю значение дня недели и вытаскиваю из него вторую строчку с номером дня и записываю итог в переменную wd
FOR /F "SKIP=1" %%i IN ('wmic path win32_LocalTime get DayOfWeek') DO SET /A wd=%%i
echo current day:%wd%

rem #### сравниваю значения в переменных и в случае равенства файлы копируются
IF /I %wd%==%runday% goto mark1
IF /I %wd% NEQ %runday% goto mark2
:mark1
rem #### создаю при необходимости папку и копирую туда файлы
IF NOT EXIST %BackupDRV%\%BackupDir% md %BackupDRV%\%BackupDir%
xcopy %OEDBPath%\*.dbx %BackupDRV%\%BackupDir% /D /F /Y
:mark2

возможно чуток не элегантно (топорно) с оператором IF ... но все же ))))
Пришлось, как написал Iska, использовать ключик /A в SET т.к. необходимо было указать что в переменной сидит число , а не текст... иначе просто сравнение "NEQ" и"==" не работало.

ЗЫ Хочется сделать скрипт универсальным... для каждого пользователя. Т.к. папка типа - \{3E343025-4670-4E7C-A679-E634FB42B2AA}\ у каждого своя. Попробую поломать голову над тем как сделать так чтобы скрипт в зависимости от %username% получал и имя этой папки и подставлял в скрипт...




© OSzone.net 2001-2012