PDA

Показать полную графическую версию : [решено] Нужен специфический скрипт для форума Лечение.


Drongo
08-05-2011, 12:04
Привет всем.

В общем навеяно из раздела Лечение - пример (http://forum.oszone.net/post-1667182-9.html). Каждый раз такую рекомендацию давать конечно можно, но обилие "сделайте\сохраните\запустите" путает пользователя. Хочется немного автоматизировать эту рекомендацию в один клик. Хочется не только рабочую версию, но и красоту скрипта. Логика пока такая:
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
Два вопроса. Зачем vbs-скрипт и чем скачивать?

@echo off
setlocal

if not exist "c:\avz4" (

wget (http://gnuwin32.sourceforge.net/packages/wget.htm) 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
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
Зачем vbs-скрипт »Если можно обойтись без него, это будет идеально. Вижу, можно.
чем скачивать? »Так как это реализовано здесь - NoMoreAutorun - утилита для отключения автозапуска. (http://forum.oszone.net/thread-141480.html) там вроде бы как-то скачивается без dounloader'ов и без wgetPS. Если в системе есть bitsadmin.exe ( в 7 HP есть из коробки ), то можно закачать им: »Скрипт будет применяться не только на 7, но и на висте и ХР

Drongo
08-05-2011, 15:22
В приведённом мною примере я отдал сие на откуп самому AVZ (как и его запуск после выполнения скрипта AVZ). »Да, в принципе это будет правильнее.В рамках WSH можно будет попробовать осуществить загрузку с HTTP (и, скорее всего, на этот скрипт будут ругаться антивирусы), и, возможно, распаковку средствами «Shell.Application» — то бишь, самого Проводника. »А как это выглядит в реализации?

Iska
08-05-2011, 16:14
Так как это реализовано здесь - NoMoreAutorun - утилита для отключения автозапуска. там вроде бы как-то скачивается без dounloader'ов и без wget »
Да, без «wget.exe». Но с помощью близкофункциональной утилиты «curl.exe», вложенной в архив вместе со скриптом.
А как это выглядит в реализации? »
Уже пробуем лепить ;)

Foreigner
08-05-2011, 16:44
Скрипт будет применяться не только на 7, но и на висте и ХР »
В общем не лучший вариант для распаковки и записи в корень системного раздела. Тогда уж лучше в %username% или %temp%

Iska
08-05-2011, 16:49
Примерно так:
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
Iska, Шикарно! :up: +1000 С вашими знаниями команд и ключей авз вы до сих пор не в лечении? ;)

Этот ключик командной строки лишний
Run=YМы ведь уже выполняем
ExecuteStdScr(7);

Iska
09-05-2011, 03:08
Drongo, это:
Этот ключик командной строки лишний »
как раз убедительно характеризует моё знание ключей AVZ ;).

У меня без «Run=Y» в процессе разработки скрипт не запускался на исполнение. Сейчас попробовал ручками — скрипт AVZ сработал без «Run=Y». Скопировал тот же (http://forum.oszone.net/post-1672580.html#post1672580) скрипт, запустил — скрипт AVZ сработал. Спишу на издержки долго не перезагружавшейся системы, свои кривые «ручки» ;) и забуду…

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

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

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

Drongo
09-05-2011, 12:52
Не требуется ли что-либо подправить? »Да, я хотел вчера ещё попросить, при выполнении скрипта открывается папка Мои документы, это лишнее. И если можно сделать чтобы после перезагрузки компьютера открывалась папка C:\AVZ4\LOGНа манер RunOnceEx, который при входе выполняется один раз. В общем цель, после перезагрузки открыть папку содержащую логи.Какие-нибудь дополнительные проверки? »Пока отвечал на первую часть, забыл ещё одну просьбу, вспомню, обязательно озвучу, она не сложная, но не помню. Выпало из головы совсем. :laugh:




© OSzone.net 2001-2012