На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела Windows
1. Указывайте версию Вашей ОС.
2. Запрещается размещать запросы и ссылки на кряки, серийники и т.п., а также вопросы нарушения лицензии ПО и его взлома.
3. Не разрешается давать советы из разряда "Поставь Linux".
4. Переустановка ОС - крайнее и безотказное лекарство, которое знают все. В таких советах никто не нуждается.
5. При публикации скриптов пользоваться тегами code. Тип подсветки кода выбирать строго в соответствии с языком публикуемого кода.
6. Прежде чем задать вопрос, обязательно загляните в FAQ и следуйте написанным рекомендациям для устранения проблемы. И если не помогло, а поиск по разделу не дал результатов - только тогда задавайте вопрос на форуме.
7. Вопросы, связанные с проблемами ПО, задавайте в разделе Программное обеспечение
Модераторы: Akina
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Проблема с 7zip
    Здравствуйте!

    Нашел скрипт для автоархивации, при простом запуске все отлично работает.
    Прописал его для запуска при "завершении работы" - в лог пишется, что процесс завершился с ошибкой 2.

    Не подскажете, в чем проблема?

    Код:

    ExpandedWrap disabled
      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
      Хотя бы на секунду задумайся - от имени какой учётной записи он запускается при завершении...
      Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
      Есть претензии ко мне как к участнику? да ради бога.
      Не нравятся мои ответы? не читайте их.
      В общем, берегите себя. Нервные клетки не восстанавливаются.
        А разве он запускается не непосредственно перед завершением работы? :blink: Тогда, видимо, от имени текущей. :(

        Если не так и проблема в этом - как можно реализовать данную задачу?
          Также вопрос: как с помощью батника/vbs запустить программу от администратора? :oops:
            ExpandedWrap disabled
              runas
            Ще не вмерла Україна, ні слава, ні воля,
            Ще нам, браття-українці, усміхнеться доля.

            Згинуть наші воріженьки, як роса на сонці,
            Запануємо й ми, браття, у своїй сторонці!
              Цитата --= Eagle =-- @
              ExpandedWrap disabled
                runas

              Спасибо!

              Я вот подумал: у меня же учетка обладает правами админа... Что не так тогда?
                В том, что ты пытаешься стартовать процесс, в то время когда ОС все процессы финиширует.
                Intel Core i7 2600K, 16Gb
                Windows 7 Максимальная Service Pack 1
                Индекс производительности: 7,7-VIDEO, 7,8-CPU&RAM, 7,9-HDD
                  teem0n
                  Событие "завершение работы" придумано для того, чтобы корректно ЗАКРЫТЬ задачу, а не плодить новые :-)
                  Максимум что можно сделать - сказать, что НИЗЗЯ завершать. Юзер либо снимет такую задачу, либо отменит завершение.
                  +++++++++++++++++++++++++++++++
                  Кстати есть честное решение. Заранее в отдельном потоке запустить 7zip с нужными параметрами и засуспедить (suspend) поток. Когда будет "завершение" - отпустить поток. Но если там длительная операция - опять поимеем сообщение для юзера.
                  И возможен геморой - система может поток закрыть.
                  Сообщение отредактировано: ValterG -
                  В мире сегодня, много бизнеса имеет место по Интернету с загрузками программного обеспечения, бывшими распространенными очень.
                  Сэр Ребристый
                    Цитата ValterG @
                    teem0n
                    Событие "завершение работы" придумано для того, чтобы корректно ЗАКРЫТЬ задачу, а не плодить новые :-)
                    Максимум что можно сделать - сказать, что НИЗЗЯ завершать. Юзер либо снимет такую задачу, либо отменит завершение.
                    +++++++++++++++++++++++++++++++
                    Кстати есть честное решение. Заранее в отдельном потоке запустить 7zip с нужными параметрами и засуспедить (suspend) поток. Когда будет "завершение" - отпустить поток. Но если там длительная операция - опять поимеем сообщение для юзера.
                    И возможен геморой - система может поток закрыть.

                    Получается, то, что я задумал, вообще невозможно сделать?

                    Такая мысль возникла: может можно средствами скрипта (например, "Отправить в...->сжатая zip-папка"), не запуская .ехе, сделать это?

                    Ведь в таком варианте должно сработать!
                    Сообщение отредактировано: teem0n -
                      Цитата teem0n @
                      Получается, то, что я задумал, вообще невозможно сделать?

                      А, по-моему, тебе как раз дали всё необходимое для эксперимента...
                      Цитата ValterG @
                      Максимум что можно сделать - сказать, что НИЗЗЯ завершать.

                      То есть в твоём скрипте можно отменить выключение, выполнить необходимую операцию, а после её завершения снова инициировать выключение. И остаётся предусмотреть такую мелочь, что это повторное завершение снова запустит скрипт, т.е. надо где-то сделать статическую пометку, что скрипт уже отработал.
                      Попробуй...
                      Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
                      Есть претензии ко мне как к участнику? да ради бога.
                      Не нравятся мои ответы? не читайте их.
                      В общем, берегите себя. Нервные клетки не восстанавливаются.
                        Вроде бы, в процессе завершения нельзя создавать новые процессы, иначе хотя бы как они получат уже посланные ранее нотифи о завершении работы системы и поймут, что надо выгружаться, зато можно создавать новые нитки, иначе было бы невозможно отлаживать эти самые процедуры завершения, ибо отладчику требуется создавать новые нити при аттаче.
                        Одни с годами умнеют, другие становятся старше.
                          Цитата Akina @
                          Цитата teem0n @
                          Получается, то, что я задумал, вообще невозможно сделать?

                          А, по-моему, тебе как раз дали всё необходимое для эксперимента...
                          Цитата ValterG @
                          Максимум что можно сделать - сказать, что НИЗЗЯ завершать.

                          То есть в твоём скрипте можно отменить выключение, выполнить необходимую операцию, а после её завершения снова инициировать выключение. И остаётся предусмотреть такую мелочь, что это повторное завершение снова запустит скрипт, т.е. надо где-то сделать статическую пометку, что скрипт уже отработал.
                          Попробуй...

                          Классный вариант, вполне устраивает!

                          Попробовал так:

                          WScript.Shell.Run("shutdown /a")

                          Не работает :( Как правильно остановить выключение?
                            Цитата 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
                            Сценарии завершения работы выполняются с правами локальной системы и имеют полные права, связанные с запуском в качестве локальной системы.
                            Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
                            Есть претензии ко мне как к участнику? да ради бога.
                            Не нравятся мои ответы? не читайте их.
                            В общем, берегите себя. Нервные клетки не восстанавливаются.
                              Ок. А как запускать с указанием учетки?

                              Попробовал так: runas /noprofile /user:mymachine\alex shutdown -a > ""C:\1.txt""

                              Валится с ошибкой.
                                Сделал через скрипт cmd в итоге!
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1989 ]   [ 17 queries used ]   [ Generated: 23.10.19, 05:03 GMT ]