Компьютерный форум 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=134479)

Pozia 11-03-2009 23:58 1061124

Как найти и прописать в реестре запуск нужного файла?
 
Нужно запустить файл WPI.hta который находится в папке WPI, т.е. файл лежит так \WPI\WPI.hta в корне диска. Букву диска нужно определить по метке \WPI\WPI.hta. Причем файл WPI.hta может лежать на DVD/CD диске или на флешке или на диске веника. То есть скрипт должен запустить такое:

RegWrite($sKey &"\999", "1", "REG_SZ", $sDVD &"\WPI\WPI.hta")

Если пути WPI\WPI.hta нет то ничего делать не нужно.

Вот это главное что хочется.

Можно и хотелось бы сложнее скрипт. Если найдется два пути \WPI\WPI.hta или более то пусть выскакивает сообщение об этом и возможность выбора с какой буквы диска запустить скрипт.

Спасибо в любом случае.

Creat0R 12-03-2009 00:17 1061144

Цитата:

Цитата Pozia
Букву диска нужно определить по метке \WPI\WPI.hta »

Какой метке, откуда скрипт будет знать где искать диск? или сам скрипт будет там и находиться?

Pozia 12-03-2009 00:27 1061153

Creat0R, скрипт не важно откуда запущен. Он должен найти файл WPI.mht который находится в папке WPI. Сама папка WPI может находится в корне любого диска (диск винчестера, флешки, DVD...). Метка по которой скрипт должен искать и является сам путь к файлу диск:\WPI\WPI.hta

Creat0R 12-03-2009 01:20 1061174

Цитата:

Цитата Pozia
Он должен найти файл »

С этого и следовало начинать, что скрипт должен искать файл, а не определять букву диска...

Код:

#include <GuiConstantsEx.au3>
#include <ComboConstants.au3>

$sWPI_Drives = ""
$sSel_Drive = ""
$sFirst_Drive = ""

$sKey = "HKEY_LOCAL_MACHINE\SOFTWARE"

$aDrives = DriveGetDrive("All")

For $i = 1 To $aDrives[0]
    If $aDrives[$i] = "a:" And DriveStatus($aDrives[$i]) <> "READY" Then ContinueLoop

    If
FileExists($aDrives[$i] & "\WPI\WPI.hta") Then
        If
$sWPI_Drives = "" Then $sFirst_Drive = $aDrives[$i]
        $sWPI_Drives &= StringUpper($aDrives[$i]) & "|"
    EndIf
Next


$sWPI_Drives = StringRegExpReplace($sWPI_Drives, "\|+$", "")

If StringInStr($sWPI_Drives, "|") Then
    $hGUI = GUICreate("Select Drives", 300, 200)

    $Drives_Combo = GUICtrlCreateCombo("", 20, 20, 170, 20, $CBS_DROPDOWNLIST)
    GUICtrlSetData(-1, $sWPI_Drives, $sFirst_Drive)

    $OK_Button = GUICtrlCreateButton("OK", 20, 170, 60, 20)
    $Cancel_Button = GUICtrlCreateButton("Cancel", 90, 170, 60, 20)

    GUISetState(@SW_SHOW, $hGUI)

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $Cancel_Button
                Exit
            Case
$OK_Button
                $sSel_Drive
= GUICtrlRead($Drives_Combo)

                ExitLoop
        EndSwitch
    WEnd
ElseIf
$sWPI_Drives <> "" Then
    $sSel_Drive = $sWPI_Drives
EndIf

If
$sSel_Drive <> "" Then RegWrite($sKey & "\999", "1", "REG_SZ", $sSel_Drive & "\WPI\WPI.hta")


Pozia 12-03-2009 07:44 1061235

Creat0R, скрипт работает но с недостатком о котором я говорил здесь То есть из за кард рийдера выскакивает окно с сообщением непонятным и только после нескольких нажатий скрипт продолжает работу. Можно ли это обойти? Поиск на дисках кард рийдера необязателен если скрипт средствами автоит можно задать не искать там.

И еще. Можно ли уменьшить размеры окно которое появляется с выбором диска? Более коипактным его ходелось бы увидеть. Какие строки скрипта за это отвечают

Спасибо.

Creat0R 12-03-2009 10:13 1061332

Цитата:

Цитата Pozia
Поиск на дисках кард рийдера необязателен »

Поиск нужен только на CDRoom'ах?

Цитата:

Цитата Pozia
Какие строки скрипта за это отвечают »

GUICreate("Select Drives", 300, 200).

Pozia 12-03-2009 12:04 1061477

Creat0R, поиск нужен на дисках винчестера, на USВ флешках, на DVD или CD дисках и на USВ винчестерах. Вот именном кард рийдер трогать не нужно вообще. Если просто искать на DVD или CD то я вроде имею представление как поменять ваш скрипт.

Creat0R 12-03-2009 13:36 1061596

Цитата:

Цитата Pozia
кард рийдер трогать не нужно вообще »

А как определить что это кард рийдер? это ведь тоже числится как внешнее устройство (как и USB винчестер), т.е «REMOVABLE».
Или буква этого ридера известна заранее?

Pozia 12-03-2009 14:01 1061632

Creat0R, видимо никак нельзя определить что это кард рийдер а не флешка буквы дисков кард рийдера не известны. А может как то можно средствами автоит подавить возникающие окна и чтобы скрипт работал дальше не ожидая нажатия Продолжить?

Creat0R 12-03-2009 14:36 1061691

А если так:

Код:

#include <GuiConstantsEx.au3>
#include <ComboConstants.au3>
;

$sWPI_Drives = ""
$sSel_Drive = ""
$sFirst_Drive = ""

$sKey = "HKEY_LOCAL_MACHINE\SOFTWARE"

$aDrives = DriveGetDrive("All")

For $i = 1 To $aDrives[0]
    If DriveStatus($aDrives[$i]) <> "READY" Then ContinueLoop

    If
FileExists($aDrives[$i] & "\WPI\WPI.hta") Then
        If
$sWPI_Drives = "" Then $sFirst_Drive = $aDrives[$i]
        $sWPI_Drives &= StringUpper($aDrives[$i]) & "|"
    EndIf
Next


$sWPI_Drives = StringRegExpReplace($sWPI_Drives, "\|+$", "")

If StringInStr($sWPI_Drives, "|") Then
    $hGUI = GUICreate("Select Drives", 200, 100)

    $Drives_Combo = GUICtrlCreateCombo("", 20, 20, 170, 20, $CBS_DROPDOWNLIST)
    GUICtrlSetData(-1, $sWPI_Drives, $sFirst_Drive)

    $OK_Button = GUICtrlCreateButton("OK", 20, 70, 60, 20)
    $Cancel_Button = GUICtrlCreateButton("Cancel", 130, 70, 60, 20)

    GUISetState(@SW_SHOW, $hGUI)

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $Cancel_Button
                Exit
            Case
$OK_Button
                $sSel_Drive
= GUICtrlRead($Drives_Combo)

                ExitLoop
        EndSwitch
    WEnd
ElseIf
$sWPI_Drives <> "" Then
    $sSel_Drive = $sWPI_Drives
EndIf

If
$sSel_Drive <> "" Then RegWrite($sKey & "\999", "1", "REG_SZ", $sSel_Drive & "\WPI\WPI.hta")


Pozia 12-03-2009 18:21 1061939

Creat0R, все сработало. Спасибо. Как я заметил скрипт отличается строкой

If $aDrives[$i] = "a:" And DriveStatus($aDrives[$i]) <> "READY" Then ContinueLoop

Для моего общего развития можете объяснить в чем разница?

И еще. Можно ли в появляющемся окне вставить еще какой нибудь текст между буквой выбора диска и заголовком окна?

Pozia 12-03-2009 22:21 1062148

Creat0R, начал тестировать скрипт, все хорошо, только прошу добавить еще маленькую вещь. Нужно добавить такую вот запись в реестре:

RegWrite($sKey &"\910", "1", "REG_SZ","REGEDIT /S "& $sDVD &"\$OEM$\HKLM.reg")

Только в этом случае чтобы буква диска $sDVD определялась по наличию на диске файла WIN51 и никакого выбора диска как в вашем последнем скрипте не нужно делать. Поиск файла WIN51 нужно произвести на всех дисках и очень желательно чтобы не было проблемы с кардрийдером, так как в последней версии Вашего скрипта. Спасибо

Creat0R 12-03-2009 23:38 1062219

Цитата:

Цитата Pozia
в чем разница? »

В отличие от первого варианта, во втором буква диска не проверяется, для всех дисков проверяется их статус.

Цитата:

Цитата Pozia
Можно ли в появляющемся окне вставить еще какой нибудь текст между буквой выбора диска и заголовком окна? »

Можно, см. GUICtrlCreateLabel() в справке.

Цитата:

Цитата Pozia
в этом случае чтобы буква диска $sDVD определялась по наличию на диске файла WIN51 и никакого выбора диска »

Код:

$sKey = "HKEY_LOCAL_MACHINE\SOFTWARE"
$aDrives = DriveGetDrive("All")

For $i = 1 To $aDrives[0]
    If DriveStatus($aDrives[$i]) <> "READY" Then ContinueLoop

    If
FileExists($aDrives[$i] & "\WIN51") Then
        RegWrite($sKey & "\910", "1", "REG_SZ", "REGEDIT /S " & $aDrives[$i] & "\$OEM$\HKLM.reg")
        ExitLoop
    EndIf
Next



Время: 05:25.

Время: 05:25.
© OSzone.net 2001-