Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как написать скрипт о проверке нужного файла на съемном носителе? (http://forum.oszone.net/showthread.php?t=133846)

Pozia 04-03-2009 23:52 1055230

Как написать скрипт о проверке нужного файла на съемном носителе?
 
Как сделать скрипт, чтобы он проверял все диски (съемные и не съемные) на предмет наличия определенного файла и при нахождении такового выполнял один EXE файл, а при не нахождении выполнял другой EXE файл? Хорошо было бы, если скрипт мог еще помимо названия искомого файла сравнивать его md5 сумму.

D_Master 05-03-2009 00:50 1055269

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


Pozia 05-03-2009 01:07 1055282

D_Master, чет не очень скрипт. При запуске слышно обращение к флопику после сего выскакивает табличка с кракобякой какой то. Нажимая Продолжить и идет далее и срабатывает. При наличии кардрийдера нажимать Продолжить нужно несколько раз. Вот в скрипте от amel27 этих глюков нет. Знаете как исправить?

D_Master 05-03-2009 01:11 1055286

Pozia, ну вы же сами попросили на всех дисках файл искать ;)
попробуйте вместо
Код:

$aDrives = DriveGetDrive("ALL")
вставить
Код:

$aDrives = DriveGetDrive("FIXED")
сам не могу проверить, т.к. картридеры отключена, а флопика нету :)

Pozia 05-03-2009 07:44 1055356

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

Так он перебором заданных букв найдет нужный файл в корне диска. Знаете как реализовать?

amel27 05-03-2009 10:05 1055453

Цитата:

Цитата Pozia
Как сделать скрипт, чтобы он проверял все диски (съемные и не съемные) на предмет наличия определенного файла и при нахождении такового выполнял один 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 1055503

Цитата:

Цитата Pozia
На флопике искать не надо. amel27 вроде как вот это реализовывал методом Автоит: »

Там он искал на драйвах (CDROM), т.е., к винтам и флопикам обращения не было.

amel27 05-03-2009 11:22 1055525

Цитата:

Цитата Pozia
Хорошо было бы, если скрипт мог еще помимо названия искомого файла сравнивать его md5 сумму. »

1. Скачать с оффсайта библитеку MD5,SHA1,CRC32,RC4,BASE64,XXTEA machine, прямой линк
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


Pozia 05-03-2009 19:01 1055895

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 1055916

Цитата:

Цитата Pozia
а как вместо запуска файла по команде:
RunWait("file1.exe")
удалить запись в реестре? »

Код:

RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\001", "1")

Pozia 05-03-2009 19:36 1055927

D_Master, в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\ остается папка 001. Ее можно удалить?

Pozia 05-03-2009 19:52 1055935

Почему не удаляются выделенные файлы? Помогите пожалуйста.

Код:

#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 1055959

Pozia, потому что надо не %systemDrive%, а @HomeDrive. %systemDrive% - это переменная командного интерпретатора.

Точнее, так:
FileDelete(@HomeDrive & "\Pro.zip")
FileDelete(@HomeDrive & "\PKU.EXE")


Время: 15:16.

Время: 15:16.
© OSzone.net 2001-2025