Показать полную графическую версию : [решено] Нужен специфический скрипт для форума Лечение.
Привет всем.
В общем навеяно из раздела Лечение - пример (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
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» — то бишь, самого Проводника.
Зачем vbs-скрипт »Если можно обойтись без него, это будет идеально. Вижу, можно.
чем скачивать? »Так как это реализовано здесь - NoMoreAutorun - утилита для отключения автозапуска. (http://forum.oszone.net/thread-141480.html) там вроде бы как-то скачивается без dounloader'ов и без wgetPS. Если в системе есть bitsadmin.exe ( в 7 HP есть из коробки ), то можно закачать им: »Скрипт будет применяться не только на 7, но и на висте и ХР
В приведённом мною примере я отдал сие на откуп самому AVZ (как и его запуск после выполнения скрипта AVZ). »Да, в принципе это будет правильнее.В рамках WSH можно будет попробовать осуществить загрузку с HTTP (и, скорее всего, на этот скрипт будут ругаться антивирусы), и, возможно, распаковку средствами «Shell.Application» — то бишь, самого Проводника. »А как это выглядит в реализации?
Так как это реализовано здесь - NoMoreAutorun - утилита для отключения автозапуска. там вроде бы как-то скачивается без dounloader'ов и без wget »
Да, без «wget.exe». Но с помощью близкофункциональной утилиты «curl.exe», вложенной в архив вместе со скриптом.
А как это выглядит в реализации? »
Уже пробуем лепить ;)
Foreigner
08-05-2011, 16:44
Скрипт будет применяться не только на 7, но и на висте и ХР »
В общем не лучший вариант для распаковки и записи в корень системного раздела. Тогда уж лучше в %username% или %temp%
Примерно так:
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
'=============================================================================
Iska, Шикарно! :up: +1000 С вашими знаниями команд и ключей авз вы до сих пор не в лечении? ;)
Этот ключик командной строки лишний
Run=YМы ведь уже выполняем
ExecuteStdScr(7);
Drongo, это:
Этот ключик командной строки лишний »
как раз убедительно характеризует моё знание ключей AVZ ;).
У меня без «Run=Y» в процессе разработки скрипт не запускался на исполнение. Сейчас попробовал ручками — скрипт AVZ сработал без «Run=Y». Скопировал тот же (http://forum.oszone.net/post-1672580.html#post1672580) скрипт, запустил — скрипт AVZ сработал. Спишу на издержки долго не перезагружавшейся системы, свои кривые «ручки» ;) и забуду…
…вы до сих пор не в лечении? »
Увы, покамест не научился лечить на расстоянии.
Не требуется ли что-либо подправить? Какие-нибудь дополнительные проверки?
P.S. На текущий момент, я думаю, можно сказать, что AVZ, в принципе, не имеет конкурентов в своей области, и прежде всего — из-за включения в его состав встроенного языка, позволяющего практически неограниченно расширять его функционал и гибко подстраивать на решение конкретных задач по восстановлению работоспособности системы. Встроенный язык — это всегда большой плюс, будь то Microsoft Office, або Far Manager.
Не требуется ли что-либо подправить? »Да, я хотел вчера ещё попросить, при выполнении скрипта открывается папка Мои документы, это лишнее. И если можно сделать чтобы после перезагрузки компьютера открывалась папка C:\AVZ4\LOGНа манер RunOnceEx, который при входе выполняется один раз. В общем цель, после перезагрузки открыть папку содержащую логи.Какие-нибудь дополнительные проверки? »Пока отвечал на первую часть, забыл ещё одну просьбу, вспомню, обязательно озвучу, она не сложная, но не помню. Выпало из головы совсем. :laugh:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.