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

bootsy 25-10-2013 16:02 2240964

резервное копирование содержимого почтовой папки при выходе пользователя из системы
 
Доброе время суток!
...помогите новичку
пытаюсь написать батник который раз в неделю (например только по средам) копирует все *.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 2241024

Есть вариант, имхо, попроще: внести скрипт в шедуллер и создать два триггера "среда" и "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 2241283

Код:

@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

Цитата:

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

Без «usebackq» как раз нужен прямой.


Цитата:

Цитата Elven
после вывода дня недели выводится пустая строка. »

Тоже неверное заключение.

Гуллипут 26-10-2013 23:29 2241649

Я думаю, что участок от 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 2242844

Ребят! заработало ).. как комбинация всех ваших предложений.
Спасибо каждому отозвавшемуся!
Код получился такой:
Код:

@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% получал и имя этой папки и подставлял в скрипт...


Время: 21:53.

Время: 21:53.
© OSzone.net 2001-