Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.219.236.62] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте!
Нашел скрипт для автоархивации, при простом запуске все отлично работает. Прописал его для запуска при "завершении работы" - в лог пишется, что процесс завершился с ошибкой 2. Не подскажете, в чем проблема? Код: Const SRC = """C:\Users\Alex\Dropbox\Мосты\*""" 'каталог и маска для резервирования 'Const SRC = """%AppData%\Opera\Opera\*""" 'здесь допускаются переменные окружения 'Const SRC = "@files.txt" 'можно взять список каталогов из текстового файла 'куда копировать? Const PREFIX = "DropboxFullBackup" 'префикс имени архива, условное название архивируемого ресурса Const BackupFolder = "C:\backup\" Const EXT = ".7z" 'расширение архивного файла Const HISTORY = 3 'количество полных архивов в истории 'чем упаковывать? Const PROGRAM = """C:\Program Files (x86)\7-Zip\7z.exe""" 'если 7-Zip установлен 'Const PROGRAM = "7z.exe" 'если архиватор лежит рядом со скриптом Const OPTIONS = "-r -mx5 -x@exclude.txt" 'опции архиватора 'где отмечать? Const REPORT = "report.txt" 'файл журнала 'не завершать скрипт аварийно On Error Resume Next '== ОБЩИЕ ОПРЕДЕЛЕНИЯ 'записать сообщение в журнал Sub Log(msg) Const APPEND = 8 'добавить в конец файла Dim fso, f Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(REPORT, APPEND, True) f.WriteLine Now & " " & msg f.Close End Sub 'объект для работы с файлами Dim fso Set fso = WScript.CreateObject("Scripting.FileSystemObject") Dim full 'имя последнего полного архива '== СОЗДАНИЕ АРХИВА 'выбрать способ архивации Dim arg, cmd cmd = "" 'команда архиватора Set arg = WScript.Arguments If arg.Count > 0 Then If arg.Item(0) = "diff" Then cmd = "u" ElseIf arg.Item(0) = "full" Then cmd = "a" Else cmd = "" End If End If 'полный архив If cmd = "a" Then 'имя нового архива full = BackupFolder & PREFIX & "-" & FormatDateTime(Date, vbShortDate) & "-full" & EXT Log full & ": Start!" 'если сегодня архив уже делали - не продолжать If (fso.FileExists(full)) Then Log full & ": создан РАНЕЕ и не будет перезаписан" WScript.Quit End If 'опции командной строки opt = OPTIONS 'разностный архив ElseIf cmd = "u" Then 'найти полный архив Dim dir, fc, f, last Set dir = fso.GetFolder(BackupFolder) 'рабочий каталог Set fc = dir.Files 'коллекция файлов full = "" last = 0 'дата последнего полного архива For Each f In fc If Left(f.name, Len(PREFIX & "-")) = PREFIX & "-" _ And Right(f.name, Len("-full" & EXT)) = "-full" & EXT _ And f.DateLastModified > last Then full = f.name last = f.DateLastModified End If Next 'без полного архива не продолжать If Len(full) = 0 Then Log "ОШИБКА! Полный архив НЕ НАЙДЕН, разностный архив не может быть создан" WScript.Quit End If 'имя нового архива diff = BackupFolder & Left(full, Len(full) - Len("full" & EXT)) & FormatDateTime(Date, vbShortDate) & EXT Log diff & ": Start!" 'если сегодня архив уже делали - не продолжать If (fso.FileExists(diff)) Then Log diff & ": создан РАНЕЕ и не будет перезаписан" WScript.Quit End If 'опции командной строки opt = OPTIONS & " -u- -up0q3x2z0!" & diff 'справка Else WScript.Echo "Ежедневное разностное резервное копирование:" & vbCrLf _ & SRC & vbCrLf _ & vbCrLf _ & "Отчет в файле:" & vbCrLf _ & REPORT & vbCrLf _ & vbCrLf _ & "Опции командной строки:" & vbCrLf _ & "full - создание полного архива" & vbCrLf _ & "diff - создание разностного архива" WScript.Quit End If 'если нет файла со списком исключений exclude.txt - создать 'файл указан в опциях архиватора и поэтому должен существовать, хотя бы пустой If Not fso.FileExists("exclude.txt") Then Dim tf Set tf = fso.CreateTextFile("exclude.txt") tf.Close End If 'создать архив MsgBox(PROGRAM & " " & cmd & " " & full & " " & opt & " " & SRC) Dim sho, ret Set sho = WScript.CreateObject("WSCript.Shell") ret = sho.Run(PROGRAM & " " & cmd & " " & full & " " & opt & " " & SRC, 1, true) '7 = в свернутом виде 'результат Dim msg Select Case ret Case 0 msg = "Ok" Case 1 msg = "Некоторые файлы были ЗАНЯТЫ и поэтому не добавлены в архив" Case 2 msg = "ОШИБКА при создании архива" Case 7 msg = "ОШИБКА в командной строке" Case 8 msg = "ОШИБКА - недостаточно памяти" Case 255 msg = "ОШИБКА - создание архива было ПРЕРВАНО пользователем" Case Else msg = "ОШИБКА при создании архива, код " & ret End Select If cmd = "a" Then Log full & ": " & msg Else Log diff & ": " & msg End If |
Сообщ.
#2
,
|
|
|
Хотя бы на секунду задумайся - от имени какой учётной записи он запускается при завершении...
|
Сообщ.
#3
,
|
|
|
А разве он запускается не непосредственно перед завершением работы? Тогда, видимо, от имени текущей.
Если не так и проблема в этом - как можно реализовать данную задачу? |
Сообщ.
#4
,
|
|
|
Также вопрос: как с помощью батника/vbs запустить программу от администратора?
|
Сообщ.
#5
,
|
|
|
runas |
Сообщ.
#6
,
|
|
|
Цитата --= Eagle =-- @ runas Спасибо! Я вот подумал: у меня же учетка обладает правами админа... Что не так тогда? |
Сообщ.
#7
,
|
|
|
В том, что ты пытаешься стартовать процесс, в то время когда ОС все процессы финиширует.
|
Сообщ.
#8
,
|
|
|
teem0n
Событие "завершение работы" придумано для того, чтобы корректно ЗАКРЫТЬ задачу, а не плодить новые :-) Максимум что можно сделать - сказать, что НИЗЗЯ завершать. Юзер либо снимет такую задачу, либо отменит завершение. +++++++++++++++++++++++++++++++ Кстати есть честное решение. Заранее в отдельном потоке запустить 7zip с нужными параметрами и засуспедить (suspend) поток. Когда будет "завершение" - отпустить поток. Но если там длительная операция - опять поимеем сообщение для юзера. И возможен геморой - система может поток закрыть. |
Сообщ.
#9
,
|
|
|
Цитата ValterG @ teem0n Событие "завершение работы" придумано для того, чтобы корректно ЗАКРЫТЬ задачу, а не плодить новые :-) Максимум что можно сделать - сказать, что НИЗЗЯ завершать. Юзер либо снимет такую задачу, либо отменит завершение. +++++++++++++++++++++++++++++++ Кстати есть честное решение. Заранее в отдельном потоке запустить 7zip с нужными параметрами и засуспедить (suspend) поток. Когда будет "завершение" - отпустить поток. Но если там длительная операция - опять поимеем сообщение для юзера. И возможен геморой - система может поток закрыть. Получается, то, что я задумал, вообще невозможно сделать? Такая мысль возникла: может можно средствами скрипта (например, "Отправить в...->сжатая zip-папка"), не запуская .ехе, сделать это? Ведь в таком варианте должно сработать! |
Сообщ.
#10
,
|
|
|
Цитата teem0n @ Получается, то, что я задумал, вообще невозможно сделать? А, по-моему, тебе как раз дали всё необходимое для эксперимента... Цитата ValterG @ Максимум что можно сделать - сказать, что НИЗЗЯ завершать. То есть в твоём скрипте можно отменить выключение, выполнить необходимую операцию, а после её завершения снова инициировать выключение. И остаётся предусмотреть такую мелочь, что это повторное завершение снова запустит скрипт, т.е. надо где-то сделать статическую пометку, что скрипт уже отработал. Попробуй... |
Сообщ.
#11
,
|
|
|
Вроде бы, в процессе завершения нельзя создавать новые процессы, иначе хотя бы как они получат уже посланные ранее нотифи о завершении работы системы и поймут, что надо выгружаться, зато можно создавать новые нитки, иначе было бы невозможно отлаживать эти самые процедуры завершения, ибо отладчику требуется создавать новые нити при аттаче.
|
Сообщ.
#12
,
|
|
|
Цитата Akina @ Цитата teem0n @ Получается, то, что я задумал, вообще невозможно сделать? А, по-моему, тебе как раз дали всё необходимое для эксперимента... Цитата ValterG @ Максимум что можно сделать - сказать, что НИЗЗЯ завершать. То есть в твоём скрипте можно отменить выключение, выполнить необходимую операцию, а после её завершения снова инициировать выключение. И остаётся предусмотреть такую мелочь, что это повторное завершение снова запустит скрипт, т.е. надо где-то сделать статическую пометку, что скрипт уже отработал. Попробуй... Классный вариант, вполне устраивает! Попробовал так: WScript.Shell.Run("shutdown /a") Не работает Как правильно остановить выключение? |
Сообщ.
#13
,
|
|
|
Цитата teem0n @ А разве он запускается не непосредственно перед завершением работы? Тогда, видимо, от имени текущей. Всё-таки собрался и нашёл. Цитата http://support.microsoft.com/kb/311787/en-us Shutdown scripts run after the user logs off Цитата http://technet.microsoft.com/ru-ru/library/cc771106(v=WS.10).aspx Сценарии завершения работы выполняются с правами локальной системы и имеют полные права, связанные с запуском в качестве локальной системы. |
Сообщ.
#14
,
|
|
|
Ок. А как запускать с указанием учетки?
Попробовал так: runas /noprofile /user:mymachine\alex shutdown -a > ""C:\1.txt"" Валится с ошибкой. |
Сообщ.
#15
,
|
|
|
Сделал через скрипт cmd в итоге!
|