Книга: Windows Script Host для Windows 2000/XP
Резервное копирование документов пользователя при окончании сеанса работы
Разделы на этой странице:
Резервное копирование документов пользователя при окончании сеанса работы
Для каждого пользователя Windows ХР в каталоге Documents and Settings автоматически создается личная папка, имя которой совпадает с именем этого пользователя. В подкаталоге "Мои документы" (My Documents) этой папки по умолчанию сохраняются все созданные пользователем документы. Для того чтобы всегда иметь резервную копию документов пользователей, можно написать универсальный сценарий выхода, в котором будет происходить копирование всех файлов и подкаталогов из пользовательского каталога "Мои документы" в другой каталог с именем пользователя. В нашем примере резервные копии документов будут сохраняться в каталоге D:Backup, т.е. при выходе пользователя Popov все его документы скопируются в каталог D:BackupPopov, а при выходе пользователя Kazakov — в каталог D:BackupKazakov.
Командный файл
Самым быстрым решением поставленной задачи является создание командного файла Logoff.bat (листинг 11.11) и назначение его в качестве сценария выхода для всех пользователей. Результат работы этого пакетного файла будет виден в командном окне (рис. 11.20).
Листинг 11.11. Командный файл-сценарий выхода, позволяющий производить : резервное копирование документов пользователя
@ECHO OFF
REM Имя: Logoff.bat
REM Описание: BAT-файл, выполняющий резервное копирование
REM документов пользователя
ECHO Окончание сеанса пользователя %UserName%.
ECHO.
ECHO Начинаем копирование документов в каталог D:Backup%UserName%...
XCOPY /C /D /E /I /Y "%HomeDrive%%HomePath%Мои документы" D:Backup%UserName%
ECHO.
ECHO Копирование документов завершено.
PAUSE
Как мы видим, вся работа файла Logoff.bat заключается в вызове команды XCOPY
для нужных каталогов:
XCOPY /С /D /Е /I /Y "%HomeDrive%%HomePath%Мои документы" "D:Backup%UserName%"
Рис. 11.20. Результат работы сценария выхода Logoff.bat для пользователя Popov
Здесь для XCOPY
указаны несколько ключей, которые позволяют:
? не прерывать копирование при возникновении ошибки (ключ /С
);
? копировать только те файлы, которые были изменены (ключ /D
);
? копировать все подкаталоги, включая пустые (ключ /Е
);
? создавать, при необходимости, каталог, в который производится копирование (ключ /I
);
? перезаписывать файлы без подтверждения пользователя (ключ /Y).
Замечание
Подробнее о ключах команды XCOPY
можно узнать из встроенной справки для этой команды. Для вывода этой справки на экран необходимо в командном окне запустить XCOPY
с ключом /?
; для вывода справки в текстовый файл нужно воспользоваться символом перенаправления вывода '>
', например: XCOPY /? > spr.txt
.
Пути к каталогу, где хранятся документы пользователя, и к каталогу, в который будет производиться копирование, формируются с помощью переменных среды %HomeDir%
, %HomePath%
и %UserName%
. Описание этих и некоторых других переменных среды, которые определены в Windows, приведено в табл. 11.2.
Таблица 11.2. Переменные среды, полезные для использования в сценариях входа/выхода
Переменная | Описание |
---|---|
%COMSPEC% |
Путь к командному интерпретатору |
%HOMEDIR% |
Буква переопределенного диска на компьютере пользователя, которая ссылается на сетевой ресурс, содержащий личный каталог пользователя |
%HOMEDRIVE% |
Локальный, либо перенаправленный диск, на котором расположен личный каталог |
%HOMEPATH% |
Путь к личному каталогу |
%HOMESHARE% |
Имя каталога общего доступа, включающее личный каталог и локальный, либо переопределенный диск |
%OS% |
Операционная система, управляющая рабочей станцией |
%PROCESSOR_ARCHITECTURE% |
Архитектура процессора (например, х86) рабочей станции пользователя |
%SYSTEMDRIVE% |
Диск, на котором находится системный каталог Windows |
%SYSTEMROOT% |
Путь к системному каталогу Windows |
%PROCESSOR_LEVEL% |
Тип процессора рабочей станции пользователя |
%TEMP% |
Путь к каталогу для хранения временных файлов |
%USERDOMAIN% |
Домен, в котором зарегистрирован пользователь |
%USERNAME% |
Имя, под которым регистрировался при входе в сеть пользователь |
Так как имена каталогов, присутствующих в команде XCOPY, могут содержать пробелы, эти имена взяты в кавычки.
Сценарий WSH
Для создания нужных нам резервных копий можно также написать сценарий WSH (назовем этот сценарий Logoff.js), который, конечно, будет намного больше по объему, чем командный файл, но будет выводить сообщения в красивые графические диалоговые окна (рис. 11.21–11.23).
Сначала в сценарии Logoff.js создаются экземпляры объектов WshShell
, FileSystemObject
и WshSpecialFolders
, после чего в переменную SHomePath
заносится путь к каталогу с документами текущего пользователя (специальная папка с именем My Documents):
//Создаем объект WshShell
WshShell = WScript.CreateObject("WScript.Shell");
//Создаем объект FileSystemObject
FSO = WScript.CreateObject("Scripting.FileSystemObject");
//Создаем объект WshSpecialFolders
WshFldrs=WshShell.SpecialFolders;
//Определяем путь к папке выборочной автозагрузки
SHomePath=WshFldrs.item("MyDocuments");
Путь к каталогу, в который будет производиться копирование документов, формируется с помощью переменной среды %UserName%
; значение такой переменной извлекается c помощью метода ExpandEnvironmentStrings()
объекта WshShell
:
//Определяем имя пользователя
SUserName=WshShell.ExpandEnvironmentStrings("%UserName%");
//Формируем полный путь к каталогу с резервными копиями документов
//пользователя
SBackupPath+=SUserName;
Копирование документов мы будем производить только после утвердительного ответа пользователя на соответствующий вопрос (см. рис. 11.21):
//Запрос на создание резервной копии
Res=WshShell.Popup("Выполнить резервное копирование документов вn" + SBackupPath + " ?", 0, "Выход пользователя " + SUserName, vbQuestion+vbYesNo);
Рис. 11.21. Диалоговое окно с запросом о необходимости копирования
Если пользователь согласен, мы копируем нужный каталог с помощью метода CopyFolder()
, причем делаем это внутри блока try
конструкции try…catch
.
IsError=false;
try {
//Производим копирование каталога
FSO.CopyFolder(SHomePath,SBackupPath);
}
В случае возникновения ошибки переменной IsError в блоке catch присваивается значение true, а на экран выводится диалоговое окно с соответствующим сообщением (см. рис. 11.22):
catch (е) { //Обрабатываем возможные ошибки
if (е != 0) {
//Выводим сообщение об ошибке
IsError=true;
Mess="Ошибка при копировании каталога "+SHomePath+"nКод ошибки: " + е.number + "nОписание: " + е.description;
WshShell.Popup(Mess, 0, "Выход пользователя " + SUserName, vbCritical);
}
}
Рис. 11.22. Диалоговое окно с сообщением о возникшей ошибке
Если же в процессе копирования ошибок не возникло (переменная IsError
равна false
), то пользователю также выдается сообщение об этом (см. рис. 11.23):
if (!IsError) {
//Производим копирование каталога
FSO.CopyFolder(SHomePath, SBackupPath);
//Все в порядке
Mess = "Копирование документов произведено";
WshShell.Popup(Mess, 0, "Выход пользователя " + SUserName, vbInformation);
}
Рис. 11.23. Диалоговое окно с сообщением о возникшей ошибке
Полностью текст сценария Logoff.js приведен в листинге 11.12.
Листинг 11.12. JScript-сценарий выхода, позволяющий производить резервное копирование документов пользователя
/********************************************************************/
/* Имя: Logoff.js */
/* Язык: JScript */
/* Описание: Сценарий выхода, позволяющий производить резервное */
/* копирование документов пользователя */
/********************************************************************/
//Объявляем переменные
var
WshShell, //Экземпляр объекта WshShell
WshFldrs, //Экземпляр объекта WshSpecialFolders
FSO, //Экземпляр объекта FileSystemObject
SUserDocPath, //Путь к папке с документами пользователя
SUserName, //Имя пользователя
SBackupPath="D:Backup", //Каталог для резервных копий документов
Res,IsError;
//Инициализируем константы для диалоговых окон
var vbYesNo=4,vbQuestion=32,vbInformation=64,vbYes=6,vbOkOnly=0,
vbCritical=16;
//Создаем объект WshShell
WshShell = WScript.CreateObject("WScript.Shell");
//Создаем объект FileSystemObject
FSO = WScript.CreateObject("Scripting.FileSystemObject");
//Создаем объект WshSpecialFolders
WshFldrs=WshShell.SpecialFolders;
//Определяем путь к папке выборочной автозагрузки
SHomePath=WshFldrs.item("MyDocuments");
//Определяем имя пользователя
SUserName=WshShell.ExpandEnvironmentStrings("%UserName%");
//Формируем полный путь к каталогу с резервными копиями документов
//пользователя
SBackupPath+=SUserName;
//Запрос на создание резервной копии
Res=WshShell.Popup("Выполнить резервное копирование документов вn"+
SBackupPath+" ?", 0, "Выход пользователя "+SUserName, vbQuestion+vbYesNo);
if (Res==vbYes) { //Нажата кнопка Да
IsError=false;
try {
//Производим копирование каталога
FSO.CopyFolder(SHomePath,SBackupPath);
} catch (e) { //Обрабатываем возможные ошибки
if (e != 0) {
//Выводим сообщение об ошибке
IsError=true;
Mess="Ошибка при копировании каталога "+SHomePath+"nКод ошибки: "+
e.number+"nОписание: "+e.description;
WshShell.Popup(Mess,0,"Выход пользователя "+SUserName,vbCritical);
}
}
if (!IsError) {
//Все в порядке
Mess="Копирование документов произведено";
WshShell.Popup(Mess,0,"Выход пользователя "+SUserName,vbInformation);
}
}
/************* Конец *********************************************/
- Резервное копирование базы данных InterBase
- Резервное копирование многофайловых баз данных
- Резервное копирование при работе InterBase в режиме 24x7
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Сохранение информации о пользователях при миграции
- Реальный (RID) и эффективный (EUID) идентификаторы пользователя
- 12. Лекция: Создание приложений с графическим интерфейсом пользователя.
- Создание пользователя и группы на рабочей станции
- 6.1.6. Печать документов
- 1.1 Режимы ядра и пользователя Windows
- 6.2. Создание и автоматическое заполнение бланков стандартных документов
- Просмотр библиотек документов