Показать полную графическую версию : [решено] Как написать скрипт о проверке нужного файла на съемном носителе?
Как сделать скрипт, чтобы он проверял все диски (съемные и не съемные) на предмет наличия определенного файла и при нахождении такового выполнял один EXE файл, а при не нахождении выполнял другой EXE файл? Хорошо было бы, если скрипт мог еще помимо названия искомого файла сравнивать его md5 сумму.
D_Master
05-03-2009, 00:50
Pozia, немного измененный скрипт amel27:
$sTag = "WIN51"
$sDVD = ""
$aDrives = DriveGetDrive("ALL")
While 1
For $i=1 To $aDrives[0]
If FileExists($aDrives[$i] &"\"& $sTag) Then
$sDVD = $aDrives[$i]
MsgBox(64, "Ура!", "Файл найден - запущена одна прога!")
Exit
EndIf
Next
If StringLen($sDVD)>0 Then ExitLoop
MsgBox(16, "Ошыбко", "Файл не найден - запущена другая прога!")
Exit
WEnd
D_Master, чет не очень скрипт. При запуске слышно обращение к флопику после сего выскакивает табличка с кракобякой какой то. Нажимая Продолжить и идет далее и срабатывает. При наличии кардрийдера нажимать Продолжить нужно несколько раз. Вот в скрипте от amel27 этих глюков нет. Знаете как исправить?
D_Master
05-03-2009, 01:11
Pozia, ну вы же сами попросили на всех дисках файл искать ;)
попробуйте вместо $aDrives = DriveGetDrive("ALL") вставить $aDrives = DriveGetDrive("FIXED")
сам не могу проверить, т.к. картридеры отключена, а флопика нету :)
D_Master, сейчас исчет только по дискам веника. Нормально. Но не иисчет на флешках. Плохо. На флопике искать не надо. amel27 вроде как вот это реализовывал методом Автоит:
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist %%i:\WIN51 set CDROM=%%i:
set DVD=%CDROM%
...
exit
Так он перебором заданных букв найдет нужный файл в корне диска. Знаете как реализовать?
Как сделать скрипт, чтобы он проверял все диски (съемные и не съемные) на предмет наличия определенного файла и при нахождении такового выполнял один EXE файл, а при не нахождении выполнял другой EXE файл? »
$sDRV = _DriveGetByTag("WIN51")
If $sDRV=="" Then
MsgBox(0, "Диск не найден", "Запуск файла 1")
; RunWait("file1.exe")
Else
MsgBox(0, "Диск "& $sDRV, "Запуск файла 2")
; RunWait("file2.exe")
EndIf
; Поиск буквы диска по маркерному файлу
; -------------------------------------
Func _DriveGetByTag($sTag, $sType = "ALL")
Local $sDrive = "", $aDrives = DriveGetDrive($sType)
For $i=1 To $aDrives[0]
If DriveStatus($aDrives[$i]) = "READY" Then
If FileExists($aDrives[$i] &"\"& $sTag) Then Return $aDrives[$i]
EndIf
Next
Return SetError(1,0,"")
EndFunc ; ==> _DriveGetByTag
D_Master
05-03-2009, 11:04
На флопике искать не надо. amel27 вроде как вот это реализовывал методом Автоит: »
Там он искал на драйвах (CDROM), т.е., к винтам и флопикам обращения не было.
Хорошо было бы, если скрипт мог еще помимо названия искомого файла сравнивать его md5 сумму. »
1. Скачать с оффсайта библитеку MD5,SHA1,CRC32,RC4,BASE64,XXTEA machine (http://www.autoitscript.com/forum/index.php?showtopic=76976), прямой линк (http://www.autoitscript.com/forum/index.php?act=attach&type=post&id=22412)
2. Извлечь из архива "MD5.AU3" и скопировать в "c:\Program Files\AutoIT3\Include"
#include <MD5.au3>
$sTAG = "WIN51"
$sMD5 = "0x11EBD14DA392096ADA35674D538D7FFD"
$sDRV = _DriveGetByTag($sTAG)
If $sDRV=="" Then
MsgBox(0, "Диск не найден", "Запуск файла 1")
; RunWait("file1.exe")
ElseIf _FileMD5Test($sDRV &"\"& $sTAG, $sMD5) Then
MsgBox(0, "Диск найден, MD5-сумма совпала."& $sDRV, "Запуск файла 2")
; RunWait("file2.exe")
Else
MsgBox(0, "Диск найден, MD5-сумма НЕ совпала!"& $sDRV, "Запуск файла 3")
; RunWait("file3.exe")
EndIf
; Поиск буквы диска по маркерному файлу
; -------------------------------------
Func _DriveGetByTag($sTag, $sType = "ALL")
Local $sDrive = "", $aDrives = DriveGetDrive($sType)
For $i=1 To $aDrives[0]
If DriveStatus($aDrives[$i]) = "READY" Then
If FileExists($aDrives[$i] &"\"& $sTag) Then Return $aDrives[$i]
EndIf
Next
Return SetError(1,0,"")
EndFunc ; ==> _DriveGetByTag
; Проверка MD5-хеша файла
; -----------------------
Func _FileMD5Test($sPath, $sMD5)
Local $MD5CTX, $Hash, $BufSize = 32768
Local $hFile = FileOpen($sPath, 16)
If $hFile = -1 Then Return SetError(1, 0, 0)
$MD5CTX = _MD5Init()
For $i=1 To Ceiling(FileGetSize($sPath) / $BufSize)
_MD5Input($MD5CTX, FileRead($hFile, $BufSize))
Next
$Hash = _MD5Result($MD5CTX)
ConsoleWrite($Hash &@CRLF)
FileClose($sPath)
Return $Hash=$sMD5
EndFunc ; ==> _FileMD5Test
amel27, все супер как нормально работает!!!! Спасибочки!!!
amel27, а если чуть усложнить. Нужно найти файл по указанному пути, проверив все диски. Как тогда?
Сам докумекал. Нужно записать так $sTAG = "путь\WIN51"
amel27, а как вместо запуска файла по команде:
RunWait("file1.exe")
удалить запись в реестре?
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\001]
"1"="C:\\WINDOWS\\system32\\file.exe"
Удалить нужно только "1"="C:\\WINDOWS\\system32\\file.exe"
Все остальные там записи не надо трогать
D_Master
05-03-2009, 19:22
а как вместо запуска файла по команде:
RunWait("file1.exe")
удалить запись в реестре? »
RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\001", "1")
D_Master, в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\ остается папка 001. Ее можно удалить?
Почему не удаляются выделенные файлы? Помогите пожалуйста.
#NoTrayIcon
#include <MD5.au3>
$sTAG = "Windows\500"
$sMD5 = "0x853f3f8898a16c4a591ad290a5df5ea2"
$sDRV = _DriveGetByTag($sTAG)
If _FileMD5Test($sDRV &"\"& $sTAG, $sMD5) Then
FileDelete("%SystemDrive%\Pro.zip")
FileDelete("%SystemDrive%\PKU.EXE")
RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\001", "1")
EndIf
; Поиск буквы диска по маркерному файлу
; -------------------------------------
Func _DriveGetByTag($sTag, $sType = "ALL")
Local $sDrive = "", $aDrives = DriveGetDrive($sType)
For $i=1 To $aDrives[0]
If DriveStatus($aDrives[$i]) = "READY" Then
If FileExists($aDrives[$i] &"\"& $sTag) Then Return $aDrives[$i]
EndIf
Next
Return SetError(1,0,"")
EndFunc ; ==> _DriveGetByTag
; Проверка MD5-хеша файла
; -----------------------
Func _FileMD5Test($sPath, $sMD5)
Local $MD5CTX, $Hash, $BufSize = 32768
Local $hFile = FileOpen($sPath, 16)
If $hFile = -1 Then Return SetError(1, 0, 0)
$MD5CTX = _MD5Init()
For $i=1 To Ceiling(FileGetSize($sPath) / $BufSize)
_MD5Input($MD5CTX, FileRead($hFile, $BufSize))
Next
$Hash = _MD5Result($MD5CTX)
ConsoleWrite($Hash &@CRLF)
FileClose($sPath)
Return $Hash=$sMD5
EndFunc ; ==> _FileMD5Test
D_Master
05-03-2009, 20:20
Pozia, потому что надо не %systemDrive%, а @HomeDrive. %systemDrive% - это переменная командного интерпретатора.
Точнее, так:
FileDelete(@HomeDrive & "\Pro.zip")
FileDelete(@HomeDrive & "\PKU.EXE")
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.