Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: ViSiToR
Дата сообщения: 05.07.2007 21:03
Maza Faka

Цитата:
а нельзя ли без них?

Можно конечно, использовать структуры функции взятых с этих же библиотек:


Код:
#include <Array.au3> ;Только для показа массива

$RetArr = ReturnEmptyDirs("c:\")

_ArrayDisplay($RetArr)

Func ReturnEmptyDirs($sPath)
Local $RetArray[1], $EmptyDirsArr, $FindNextFile, $CurrentPath, $CheckEmptyDir
While StringRight($sPath, 1) = "\"
$sPath = StringTrimRight($sPath, 1)
WEnd

Local $FindFirstFile = FileFindFirstFile($sPath & "\*.*")
If @error = 1 Then Return SetError(1, 0, -1)

While 1
$FindNextFile = FileFindNextFile($FindFirstFile)
If @error = 1 Then ExitLoop
$CurrentPath = $sPath & "\" & $FindNextFile
If StringInStr(FileGetAttrib($CurrentPath), "D") Then
$CheckEmptyDir = FileFindFirstFile($CurrentPath & "\*.*")
FileClose($CheckEmptyDir)
If $CheckEmptyDir = -1 Then
ReDim $RetArray[UBound($RetArray)+1]
$RetArray[UBound($RetArray)-1] = $CurrentPath
Else
$EmptyDirsArr = ReturnEmptyDirs($CurrentPath)
If IsArray($EmptyDirsArr) Then
For $i = 1 To UBound($EmptyDirsArr)-1
ReDim $RetArray[UBound($RetArray)+1]
$RetArray[UBound($RetArray)-1] = $EmptyDirsArr[$i]
Next
EndIf
EndIf
EndIf
WEnd
FileClose($FindFirstFile)
$RetArray[0] = UBound($RetArray)-1
Return $RetArray
EndFunc
Автор: RwR
Дата сообщения: 05.07.2007 23:30
Спасибо большое, работает!
Автор: RwR
Дата сообщения: 06.07.2007 06:27
Ещё вопрос. Почему не работает вот такой фрагмент?


Код: FileMove ($var & "\1.exe", $var & "\1.exe.bak")
Автор: Maza Faka
Дата сообщения: 06.07.2007 06:38
RwR

Цитата:
Почему не работает

У меня работает:

Код:
$var = "c:\temp"
FileMove($var & "\1.exe", $var & "\1.exe.bak")
Автор: ViSiToR
Дата сообщения: 06.07.2007 06:45
RwR

Цитата:
Как сделать, чтобы заработал?

Закон номер 1 (почти в любом деле, а в программировании тем более) - Для решения проблемы, в первую очередь ищем источник проблемы (корень, базу), другими словами, первый вопрос который должен быть задан - “по какой причине, может не работать?”

В данном случае, вижу одну причину - переменная $var имеет неправильное значение (не путь к каталогу где лежит 1.exe, или путь к каталогу где НЕ лежит 1.exe ).
Поэтому в первую очередь, следует проверять именно эту переменную.
Автор: RwR
Дата сообщения: 06.07.2007 06:47
Ой, точно. Ступил, простите, что зря потревожил. Просто выдрал кусок из скрипта, чтобы проверить, а $var = "xxx" добавиь забыл.
Автор: ViSiToR
Дата сообщения: 06.07.2007 06:48
А нет, вижу ещё одну причину (точнее вспомнил о ней) - “Файл занят другим приложением”
Автор: RwR
Дата сообщения: 06.07.2007 06:49
А “Файл занят другим приложением”. Но это не мешает его переименовывать.
Автор: Maza Faka
Дата сообщения: 06.07.2007 08:32

Код:
$result = ""
findTxt("d:\trash")
MsgBox(64, "", $result)

Func findTxt($path)
$search = FileFindFirstFile($path & "\*.txt")
While 1
    $file = FileFindNextFile($search)
    If @error Then Return
        $file = $path & "\" & $file
        If StringInStr($file, "txt") > 0 Then $result&=$file & @CRLF
        WEnd
    EndFunc
Автор: RwR
Дата сообщения: 06.07.2007 09:49
Так, есть проблема. Почему может не работать команда Shutdown?
Автор: ViSiToR
Дата сообщения: 06.07.2007 11:07
RwR

Цитата:
это не мешает его переименовывать

Иногда мешает

Maza Faka

Цитата:
как сделать, что бы искал, так же и во вложенных каталогах?


Подобно тому как поиск пустых каталогов, только проверять файлы ...


Код:
#include <Array.au3>

$Results = _FileFind("d:\trash", "txt")

_ArrayDisplay($Results)

Func _FileFind($sPath, $Ext, $Flag=0)
Local $RetPathArr[1], $FindNextFile, $CurrentPath, $SubDirFindArr
If StringInStr($Ext, "*") Then $Ext = StringReplace($Ext, "*.", "")

While StringRight($sPath, 1) = "\"
$sPath = StringTrimRight($sPath, 1)
WEnd

Local $FindFirstFile = FileFindFirstFile($sPath & "\*.*")
If @error = 1 Then Return SetError(1, 0, -1)

While 1
$FindNextFile = FileFindNextFile($FindFirstFile)
If @error = 1 Then ExitLoop
$CurrentPath = $sPath & "\" & $FindNextFile
If $Flag = 1 And StringInStr(FileGetAttrib($CurrentPath), "D") Then
$SubDirFindArr = _FileFind($CurrentPath, $Ext, $Flag)
If IsArray($SubDirFindArr) Then
For $i = 1 To UBound($SubDirFindArr)-1
ReDim $RetPathArr[UBound($RetPathArr)+1]
$RetPathArr[UBound($RetPathArr)-1] = $SubDirFindArr[$i]
Next
EndIf
Else
If StringTrimLeft($CurrentPath, StringInStr($CurrentPath, ".", 0, -1)) = $Ext Or $FindNextFile = $Ext Then
ReDim $RetPathArr[UBound($RetPathArr)+1]
$RetPathArr[UBound($RetPathArr)-1] = $CurrentPath
EndIf
EndIf
WEnd
FileClose($FindFirstFile)
$RetPathArr[0] = UBound($RetPathArr)-1
Return $RetPathArr
EndFunc
Автор: NIKZZZZ
Дата сообщения: 06.07.2007 11:13
Maza Faka

Цитата:
так же и во вложенных каталогах?


Код: $result = ""
findTxt("d:\trash")
MsgBox(64, "", $result)

Func findTxt($path)
local $search
$search = FileFindFirstFile($path & "\*.*")
While 1
$file = FileFindNextFile($search)
If @error Then exitloop ;endif
$file = $path & "\" & $file
if StringInStr(FileGetAttrib($file),"D") > 0 then
FindTxt($file)
continueloop
endif
If StringRight($file,4)=".txt" Then $result&=$file & @CRLF ;endif
WEnd
FileClose($search)
Return
EndFunc
Автор: ViSiToR
Дата сообщения: 06.07.2007 11:19
Обновил немного свой пример, теперь можно указать как третьи параметр 0, и тогда поиск будет только в текущем (указанном) каталоге.
А также можно задать и маску (только в виде *.txt), но и просто расширение будет работать (txt).

RwR

Цитата:
Почему может не работать команда Shutdown?

Как ты её используешь?
Автор: RwR
Дата сообщения: 06.07.2007 13:53
Вот так:

Код: Shutdown(6)
Автор: ViSiToR
Дата сообщения: 06.07.2007 20:05
RwR

Цитата:
Вот так:

Интересно, может стоят какие то внешние приложения которые блокируют перезапуск? а обычный перезапуск (ручной) проходит без проблем?


Цитата:
в каком порядке использовать команду удаления самого скрипта и команду shutdown

Хороший вопрос...

Сам не пробовал, поэтому нужно проверять...

Пробуй так (теоритический должно сработать):


Код: ShutDown(6)
$ScriptPath = FileGetShortName(@ScriptFullPath)
Run(@ComSpec & ' /c ping -n 1 localhost > nul & del /q /f "' & $ScriptPath & '"', '', @SW_HIDE)
Exit
Автор: RwR
Дата сообщения: 06.07.2007 20:08
Спасибо большое. Но я с использованием этой команды делал русификатор, но щас он уже создан, так что проверю в следующей версии.
Автор: Maza Faka
Дата сообщения: 08.07.2007 11:14
Написал скрипт, который выводит на экран имя файла, имеющего самую раннюю дату создания, но не нравится его громоздкость, может есть более красивое решение?

Код:
#include <Date.au3>
$value = 0
$result = ""
new_file("c:\1")
MsgBox(64, "", $result)

Func new_file($path)
    $search = FileFindFirstFile($path & "\*.*")
    While 1
        $file = FileFindNextFile($search)
        If @error Then ExitLoop
            $file = $path & "\" & $file
            If StringInStr(FileGetAttrib($file), "D") Then
                new_file($file)
            Else
                $f_d = FileGetTime($file)
$full_date = $f_d[0] & "/" & $f_d[1] & "/" & $f_d[2] & " " & $f_d[3] & ":" & $f_d[4] & ":" & $f_d[5]
                $diff = _DateDiff("s", $full_date, _NowCalc())
                If $diff > $value Then
                    $value = $diff
                    $result = $file
                    EndIf
            EndIf
        WEnd
        EndFunc
Автор: NIKZZZZ
Дата сообщения: 08.07.2007 13:17
Maza Faka

Цитата:
более красивое решение?


Код: $value = "999999999999"
$result = ""
new_file("c:\1")
MsgBox(64, "", $result)

Func new_file($path)
local $search
$search = FileFindFirstFile($path & "\*.*")
If @error Then return
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop ;endif
$file = $path & "\" & $file
If StringInStr(FileGetAttrib($file), "D") Then
new_file($file)
Else
$f_d = FileGetTime($file)
$full_date = $f_d[0] & $f_d[1] & $f_d[2] & $f_d[3] & $f_d[4] & $f_d[5]
If $full_date < $value Then
$value = $full_date
$result = $file
EndIf
EndIf
WEnd
FileClose($search)
return
EndFunc
Автор: Maza Faka
Дата сообщения: 09.07.2007 16:28
Как переключится на другое окно, после закрытия первого?

Код:
#include <GUIConstants.au3>

$mainWIndow = GUICreate("Main", 300, 200)
$ok = GUICtrlCreateButton("Yes", 20, 10, 60)

$dummyWindow = GuiCreate("Dummy", 200, 150)
$ok1 = GUICtrlCreateButton("Yes", 20, 10, 60)

GUISwitch($mainWindow)
GUISetState(@SW_SHOW)

While 1
    $msg = GUIGetMsg(1)
    Select
    Case $msg[0] = $ok
        MsgBox(64, "Main", "You pressed Yes in main window")
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $mainWindow
        MsgBox(64, "Main", "You closed main window")
        Second()
        ExitLoop
    EndSelect
WEnd

Second()
Func Second()
    GUISwitch($mainWindow)
    While 1
        $msg = GUIGetMsg(1)
        Select
    Case $msg[0] = $ok1 And $msg[1] = $dummyWindow
        MsgBox(64, "Dummy", "You pressed Yes in dummy window")
    Case $msg[0] = $Gui_Event_Close And $msg[1] = $dummyWindow
        MsgBox(64, "Dummy", "You closed dummy window")
    EndSelect
WEnd
EndFunc
Автор: ViSiToR
Дата сообщения: 09.07.2007 16:45
Maza Faka

Цитата:
Как переключится на другое окно, после закрытия первого?

Также как и с первым, его нужно отобразить - просто после GuiSwitch попрообуй поставить GuiSetState(@SW_SHOW, $mainWindow).

Но не обязательно ставить два цикла, можно сразу содздать всё что нужно, и из первого управлять.
Автор: RwR
Дата сообщения: 10.07.2007 05:58
Здравствуйте. Вы не подскажите, как сделать элемент GUI, чтобы это была строчка прогресса. И как связать эту строчку с некоторым процессом, и в зависимости от состояния процесса ещё выводить надписи, говорящие об этом самом состоянии. Это должна быть только эта строчка. Без каких-либо кнопок, типа закрыть/развернуть/свернуть.
Автор: ViSiToR
Дата сообщения: 10.07.2007 06:42
RwR

Цитата:
как сделать элемент GUI, чтобы это была строчка прогресса

См. в справке ProgressOn.


Цитата:
как связать эту строчку с некоторым процессом, и в зависимости от состояния процесса ещё выводить надписи

Смотря какой именно процесс, если к примеру копирование файлов, нужно вычислить либо полный размер копируемых файлов, либо вычислить общее количество этих файлов, и потом отсеивать в процессе отображения прогресса.
Автор: RwR
Дата сообщения: 10.07.2007 07:17
А как насчёт процесса выполнения скрипта AutoIT? Нужно отследить его выполнение в строке прогресса.
Автор: Maza Faka
Дата сообщения: 10.07.2007 09:24
ViSiToR
Спасибо за подсказку, но теперь кнопка "Yes" окна "$Window" не возвращает событие? В чём ошибка?

Код:
#include <GUIConstants.au3>

$Window = GUICreate("Main", 300, 200)
$ok = GUICtrlCreateButton("Yes", 20, 10, 60)

$dummy = GuiCreate("Dummy", 200, 150)
$ok = GUICtrlCreateButton("Yes", 20, 10, 60)

GUISwitch($Window)
GUISetState(@SW_SHOW)

While 1
    $msg = GUIGetMsg(1)
    Select
    Case $msg[0] = $ok And $msg[1] = $Window
        MsgBox(64, "Main", "You pressed Yes in main window")
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $Window
        MsgBox(64, "Main", "You closed main window")
        GuisetState(@SW_HIDE, $Window)
        GUISetState(@SW_SHOW, $dummy)
Case $msg[0] = $ok And $msg[1] = $dummy
        MsgBox(64, "Dummy", "You pressed Yes in dummy window")
    Case $msg[0] = $Gui_Event_Close And $msg[1] = $dummy
        MsgBox(64, "Dummy", "You closed dummy window")
        ExitLoop
    EndSelect
WEnd
Автор: RwR
Дата сообщения: 10.07.2007 12:02
Можно как-то сопоставить определённые действия файла *.exe AutoIt со строкой прогресса?
Автор: NIKZZZZ
Дата сообщения: 10.07.2007 14:41
RwR

Цитата:
Можно как-то сопоставить определённые действия файла *.exe AutoIt со строкой прогресса?

Если это "определённое действие" можно оценить числом от 0 до 100.

Автор: RwR
Дата сообщения: 10.07.2007 14:57
Извините, а как это ассоциировать с этим действием? Там много действий. Например копирование и перемещение файлов, запуск *.exe файла, нажатие кнопок в нём, скрытие окон, выдача сообщений. Не поможете, уважаемые?
Автор: NIKZZZZ
Дата сообщения: 10.07.2007 15:43
RwR
Полоса прогресса предназначена только для определенных действий, как например копирование, которое можно оценить численно. Такие действия, как запуск *.exe файла, нажатие кнопок должны вызывать, например, появление окна с соответствующим сообщением, но не как не полосу прогресса.
Автор: Maza Faka
Дата сообщения: 10.07.2007 16:35
А не мог бы кто нибудь привести пример скрипта с полосой прогресса, скажем копирование файла размером в 327 MB?
Автор: RwR
Дата сообщения: 10.07.2007 16:39
То есть все перечисленные мною действия никак нельзя связать с полосой прогресса?
Хорошо, опишите пожалуйста скрипт, чтобы проценты менялись после каждого скопированного файла, предположим, что их 100.

Куча вопросов:
1. Как добавить к окну с полосой прогресса конпку свернуть, а закрыть и развернуть сделать неактивными?
2. Нужно, чтобы после достижения полосой прогресса ста процентов выводилось сообщение, а затем, чтобы до нажатия кнопки, например с названием "TEST", работа скрипта останавливалась.
3. Как добавить строки к полосе прогресса как при исп-ии ProgressOn, используя GUICtrlCreateProgress? При использовании ProgressOn они наз-ся "title" и "maintext".

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.