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

Drongo 08-05-2011 12:04 1672388

Нужен специфический скрипт для форума Лечение.
 
Привет всем.

В общем навеяно из раздела Лечение - пример. Каждый раз такую рекомендацию давать конечно можно, но обилие "сделайте\сохраните\запустите" путает пользователя. Хочется немного автоматизировать эту рекомендацию в один клик. Хочется не только рабочую версию, но и красоту скрипта. Логика пока такая:
1. Проверить есть ли папка C:\avz4
Если есть
2. Переименовать файл C:\avz4\avz.exe в C:\avz4\active.com
Иначе
Скачать отсюда - http://z-oleg.com/avz4.zip в корень диска С: и распаковать архив в папку C:\avz4 и также переименовать.
3. Создать текстовый файл script.txt с содержимым и сохранить на диск С:
Код:

begin
 ExecuteStdScr(7);
end.

4. Создать файл .vbs с содержимым и выполнить его
Код:

set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "taskkill /f /im Explorer.exe", 0
WScript.Sleep 500
WshShell.Run "C:\avz4\active.com AM=Y script=C:\script.txt"

Читая раздел скриптовые языки смог самостоятельно сделать вот так:
Код:

@Echo off

Set DirAVZ=C:\avz4
del C:\script.txt
del C:\SafeZone.vbs
ren C:\avz4\avz.exe C:\avz4\active.com

Set sScript1=begin
Set sScript2= ExecuteStdScr(7);
Set sScript3=end.

Set sRunVBS1=set WshShell = WScript.CreateObject("WScript.Shell")
Set sRunVBS2=WshShell.Run "taskkill /f /im Explorer.exe", 0
Set sRunVBS3=WScript.Sleep 500
Set sRunVBS4=WshShell.Run "C:\avz4\active.com AM=Y script=C:\script.txt"

Echo %sScript1%>>C:\script.txt
Echo %sScript2%>>C:\script.txt
Echo %sScript3%>>C:\script.txt

Echo %sRunVBS1%>>C:\SafeZone.vbs
Echo %sRunVBS2%>>C:\SafeZone.vbs
Echo %sRunVBS3%>>C:\SafeZone.vbs
Echo %sRunVBS4%>>C:\SafeZone.vbs

If Exist "%DirAVZ%\*.*"(
  Start C:\SafeZone.vbs
  )
Else(
  Echo Папки %systemdrive%\avz4\avz - не найдено!>>C:\log.txt
  )

exit.

Можно ли как-то облагородить данный скрипт и добавить проверку папки, скачивание и распаковку?

Если реально выполнить всё одним скриптом .vbs то это будет здорово.

Спасибо

Foreigner 08-05-2011 13:44 1672472

Два вопроса. Зачем vbs-скрипт и чем скачивать?
Код:

@echo off
setlocal

if not exist "c:\avz4" (

    wget http://z-oleg.com/avz4.zip
    "%programfiles%\7-zip\7z" x avz4.zip -oc:\
    del avz4.zip

)

ren c:\avz4\avz.exe active.com

1>"c:\script.txt" (

echo begin
echo  ExecuteStdScr(7^);
echo end.

)

taskkill /f /im explorer.exe && start C:\avz4\active.com AM=Y script=C:\script.txt

PS. Если в системе есть bitsadmin.exe ( в 7 HP есть из коробки ), то можно закачать им:
Код:

bitsadmin /transfer /download /priority high http://z-oleg.com/avz4.zip avz4.zip

Iska 08-05-2011 14:52 1672520

Drongo, для категории CMD/BAT я бы сделал примерно так (для реальной работы заменить «notepad.exe» на «explorer.exe»):
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sAVZFolder=%SystemDrive%\avz4
set sAVZNewName=%RANDOM%.%RANDOM%

if exist "%sAVZFolder%\." (
        copy /y "%sAVZFolder%\avz.exe" "%sAVZFolder%\%sAVZNewName%" 1>nul

        (
                echo var
                echo        sProcessName  : string;
                echo        sPath2Process : string;
                echo.
                echo begin
                echo        sProcessName  := 'notepad.exe';
                echo        sPath2Process := NormalFileName^('%SystemRoot%\' + sProcessName^);
                echo.
                echo        TerminateProcessByName^(sProcessName^);
                echo        ExecuteStdScr^(7^);
                echo.
                echo        if ExecuteFile^(sPath2Process, '', 1, 0, false^) = true then
                echo                ShowMessage^('[' + sPath2Process + '] єёях°эю чряє∙хэ'^)
                echo        else
                echo                ShowMessage^('═х єфрыюё№ чряєёЄшЄ№ [' + sPath2Process + ']'^);
                echo end.
        ) 1>"%sAVZFolder%\DrongoScript.txt"

        "%sAVZFolder%\%sAVZNewName%" AM=Y Run=Y Script="%sAVZFolder%\DrongoScript.txt"

        del /f /q "%sAVZFolder%\%sAVZNewName%"
        del /f /q "%sAVZFolder%\DrongoScript.txt"
) else (
        echo Папки [%sAVZFolder%] не найдено!>>"%SystemDrive%\DrongoLog.txt"
)

endlocal
exit /b 0

В XP загрузку с HTTP без сторонних средств (внешняя утилита, WSH, PoSH) в общем случае не решить. Распаковка из zip в рамках заявленной категории без сторонних средств тоже невозможна.

Вопрос: какова необходимость снятия процесса Проводника именно перед запуском AVZ? В приведённом мною примере я отдал сие на откуп самому AVZ (как и его запуск после выполнения скрипта AVZ).

В рамках WSH можно будет попробовать осуществить загрузку с HTTP (и, скорее всего, на этот скрипт будут ругаться антивирусы), и, возможно, распаковку средствами «Shell.Application» — то бишь, самого Проводника.

Drongo 08-05-2011 15:03 1672529

Цитата:

Цитата Foreigner
Зачем vbs-скрипт »

Если можно обойтись без него, это будет идеально. Вижу, можно.
Цитата:

Цитата Foreigner
чем скачивать? »

Так как это реализовано здесь - NoMoreAutorun - утилита для отключения автозапуска. там вроде бы как-то скачивается без dounloader'ов и без wget
Цитата:

Цитата Foreigner
PS. Если в системе есть bitsadmin.exe ( в 7 HP есть из коробки ), то можно закачать им: »

Скрипт будет применяться не только на 7, но и на висте и ХР

Drongo 08-05-2011 15:22 1672535

Цитата:

В приведённом мною примере я отдал сие на откуп самому AVZ (как и его запуск после выполнения скрипта AVZ). »
Да, в принципе это будет правильнее.
Цитата:

Цитата Iska
В рамках WSH можно будет попробовать осуществить загрузку с HTTP (и, скорее всего, на этот скрипт будут ругаться антивирусы), и, возможно, распаковку средствами «Shell.Application» — то бишь, самого Проводника. »

А как это выглядит в реализации?

Iska 08-05-2011 16:14 1672558

Цитата:

Цитата Drongo
Так как это реализовано здесь - NoMoreAutorun - утилита для отключения автозапуска. там вроде бы как-то скачивается без dounloader'ов и без wget »

Да, без «wget.exe». Но с помощью близкофункциональной утилиты «curl.exe», вложенной в архив вместе со скриптом.
Цитата:

Цитата Drongo
А как это выглядит в реализации? »

Уже пробуем лепить ;)

Foreigner 08-05-2011 16:44 1672577

Цитата:

Цитата Drongo
Скрипт будет применяться не только на 7, но и на висте и ХР »

В общем не лучший вариант для распаковки и записи в корень системного раздела. Тогда уж лучше в %username% или %temp%

Iska 08-05-2011 16:49 1672580

Примерно так:
Код:

Option Explicit

Dim objFSO
Dim objShell
Dim objWshShell

Dim strPath2AVZ
Dim strPath2Exe
Dim strPath2AVZScript

Dim strHttpSource
Dim strDownloadDest


Set objFSO      = WScript.CreateObject("Scripting.FileSystemObject")
Set objShell    = WScript.CreateObject("Shell.Application")
Set objWshShell = WScript.CreateObject("WScript.Shell")

strPath2AVZ      = "C:\AVZ"
strPath2Exe      = objFSO.BuildPath(strPath2AVZ, "avz4\avz.exe")
strPath2AVZScript = objFSO.BuildPath(strPath2AVZ, "DrongoScript.avz")

strHttpSource = "http://z-oleg.com/avz4.zip"
strDownloadDest = objFSO.BuildPath(strPath2AVZ, objFSO.GetFileName(strHttpSource))

If Not objFSO.FolderExists(strPath2AVZ) Then
        objFSO.CreateFolder strPath2AVZ
End If

If GetFileFromURL(strHttpSource, strDownloadDest) Then
        ExtractFromZip objFSO.BuildPath(strPath2AVZ, objFSO.GetFileName(strHttpSource)), strPath2AVZ
       
        CreateAVZScript strPath2AVZScript
       
        RenameAndExecuteProgram strPath2Exe, strPath2AVZScript
Else
        WScript.Echo "Can't download [" & strHttpSource & "] to [" & strDownloadDest & "]"
End If

Set objWshShell = Nothing
Set objShell    = Nothing
Set objFSO      = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub CreateAVZScript(strPath2Script)
        With objFSO.CreateTextFile(strPath2Script, True)
                .Write _
                        "var" & vbCrLf & _
                        "        sProcessName  : string;" & vbCrLf & _
                        "        sPath2Process : string;" & vbCrLf & _
                        "" & vbCrLf & _
                        "begin" & vbCrLf & _
                        "        sProcessName  := 'explorer.exe';" & vbCrLf & _
                        "        sPath2Process := NormalFileName('%SystemRoot%\' + sProcessName);" & vbCrLf & _
                        "        " & vbCrLf & _
                        "        TerminateProcessByName(sProcessName);" & vbCrLf & _
                        "        ExecuteStdScr(7);" & vbCrLf & _
                        "        " & vbCrLf & _
                        "        if ExecuteFile(sPath2Process, '', 1, 0, false) = true then" & vbCrLf & _
                        "                ShowMessage('[' + sPath2Process + '] успешно запущен')" & vbCrLf & _
                        "        else" & vbCrLf & _
                        "                ShowMessage('Не удалось запустить [' + sPath2Process + ']');" & vbCrLf & _
                        "end." & vbCrLf
               
                .Close
        End With
End Sub
'=============================================================================

'=============================================================================
Sub RenameAndExecuteProgram(strPath2Exe, strPath2AVZScript)
        ' Enum WshExecStatus
        Const WshRunning  = 0
        Const WshFinished = 1
        Const WshFailed  = 2
       
        Dim strPath2NewExe
       
       
        strPath2NewExe = objFSO.BuildPath(objFSO.GetParentFolderName(strPath2Exe), objFSO.GetTempName())
       
        objFSO.CopyFile strPath2Exe, strPath2NewExe
       
        With objWshShell.Exec("""" & strPath2NewExe & """  AM=Y Run=Y Script=""" & strPath2AVZScript & """")
                WScript.Sleep 500
               
                If .Status = WshRunning And .Status <> WshFailed Then
                        objWshShell.AppActivate .ProcessID
                       
                        Do
                                WScript.Sleep 100
                        Loop Until .Status = WshFinished
                Else
                        WScript.Echo "Can't execute [" & strPath2NewExe & "]"
                End If
        End With
       
        objFSO.DeleteFile strPath2NewExe, True
        'objFSO.DeleteFile strPath2AVZScript, True
End Sub
'=============================================================================

'=============================================================================
Function ExtractFromZip(strPath2Zip, strPath2Extract)
        Dim objFolderZIP
        Dim objFolderDest
       
        Set objFolderZIP = objShell.NameSpace(strPath2Zip)
       
        If Not objFolderZIP Is Nothing Then
                Set objFolderDest = objShell.NameSpace(strPath2Extract)
               
                If Not objFolderDest Is Nothing Then
                        objFolderDest.CopyHere objFolderZIP.Items
                       
                        Set objFolderDest = Nothing
                Else
                        WScript.Echo "Can't get folder [" & strPath2Extract & "]"
                End If
               
                Set objFolderZIP = Nothing
        Else
                WScript.Echo "Can't get zip folder [" & strPath2Zip & "]"
        End If
End Function
'=============================================================================

'=============================================================================
Function GetFileFromURL(strURL, strPath)
        ' Enum ConnectModeEnum
        Const adModeUnknown        = 0
        Const adModeRead            = 1
        Const adModeWrite          = 2
        Const adModeReadWrite      = 3
        Const adModeShareDenyRead  = 4
        Const adModeShareDenyWrite  = 8
        Const adModeShareExclusive  = 12
        Const adModeShareDenyNone  = 16
        Const adModeRecursive      = 4194304
       
        ' Enum StreamTypeEnum
        Const adTypeBinary          = 1
        Const adTypeText            = 2
       
        ' Enum SaveOptionsEnum
        Const adSaveCreateNotExist  = 1
        Const adSaveCreateOverWrite = 2
       
        Dim arrContent
       
       
        GetFileFromURL = False
       
        With WScript.CreateObject("MSXML2.XMLHTTP")
                .open "GET", strURL, False
                .send
                arrContent = .responseBody
        End With
       
        With WScript.CreateObject("ADODB.Stream")
                .Mode = adModeReadWrite
                .Type = adTypeBinary
               
                .Open
                .Write arrContent
               
                .SaveToFile strPath, adSaveCreateOverWrite
        End With
       
        If objFSO.FileExists(strPath) Then
                If objFSO.GetFile(strPath).Size <> 0 Then
                        ' Что-то загружено ;)
                        GetFileFromURL = True
                End If
        End If
End Function
'=============================================================================


Drongo 08-05-2011 20:01 1672684

Iska, Шикарно! :up: +1000 С вашими знаниями команд и ключей авз вы до сих пор не в лечении? ;)

Этот ключик командной строки лишний
Код:

Run=Y
Мы ведь уже выполняем
Код:

ExecuteStdScr(7);

Iska 09-05-2011 03:08 1672884

Drongo, это:
Цитата:

Цитата Drongo
Этот ключик командной строки лишний »

как раз убедительно характеризует моё знание ключей AVZ ;).

У меня без «Run=Y» в процессе разработки скрипт не запускался на исполнение. Сейчас попробовал ручками — скрипт AVZ сработал без «Run=Y». Скопировал тот же скрипт, запустил — скрипт AVZ сработал. Спишу на издержки долго не перезагружавшейся системы, свои кривые «ручки» ;) и забуду…

Цитата:

Цитата Drongo
…вы до сих пор не в лечении? »

Увы, покамест не научился лечить на расстоянии.


Не требуется ли что-либо подправить? Какие-нибудь дополнительные проверки?

P.S. На текущий момент, я думаю, можно сказать, что AVZ, в принципе, не имеет конкурентов в своей области, и прежде всего — из-за включения в его состав встроенного языка, позволяющего практически неограниченно расширять его функционал и гибко подстраивать на решение конкретных задач по восстановлению работоспособности системы. Встроенный язык — это всегда большой плюс, будь то Microsoft Office, або Far Manager.

Drongo 09-05-2011 12:52 1673018

Цитата:

Цитата Iska
Не требуется ли что-либо подправить? »

Да, я хотел вчера ещё попросить, при выполнении скрипта открывается папка Мои документы, это лишнее. И если можно сделать чтобы после перезагрузки компьютера открывалась папка
Код:

C:\AVZ4\LOG
На манер RunOnceEx, который при входе выполняется один раз. В общем цель, после перезагрузки открыть папку содержащую логи.
Цитата:

Цитата Iska
Какие-нибудь дополнительные проверки? »

Пока отвечал на первую часть, забыл ещё одну просьбу, вспомню, обязательно озвучу, она не сложная, но не помню. Выпало из головы совсем. :laugh:


Время: 22:30.

Время: 22:30.
© OSzone.net 2001-