Войти

Показать полную графическую версию : [Архив - Часть 1.3] AutoIt скрипты


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18 19 20 21 22 23 24 25 26

13ghost
28-02-2007, 20:50
Объясните пожалуйста,а то я не догоняю,не могу понять что в справке написано:
что делает ConsoleWrite? и для чего её можно применить?
зарание благодарен

amel27
01-03-2007, 05:22
13ghost
Штатное применение - отладка скриптов средствами SciTE, кстати неплохая альтернатива MsgBox() ;). Выводит заданный тект (например, значения переменных) в экран вывода - тот, что включается по F8. Из нештатных - запись данных в STDOUT при запуске скрипта через CMD.

Creat0RLocal там лишних два раза встречаетсягы-гы, а я исправил раньше твоего замечания ;)Поздравляю со статусом Ветерана!упс, а кем я был? :o

Vadikan
01-03-2007, 07:00
упс, а кем я былТы можешь быть кем хочешь, изменяя статус в профиле, - это привелегия участников, входящих в группу Contributors.

Creat0R
01-03-2007, 10:35
amel27
а я исправил раньше твоего замечания
Ивени, не заметил...

а кем я был?
Старожил'ом кажется :shuffle:

belonesox
02-03-2007, 21:09
Вопрос про чтение stdout'а AutoItом - наблюдаю эффект, что для некоторых программ, stdout то читается, то не читается (в зависимости от опций).
Например, рассмотрим следующий код:


Func ShowStdout($cmd)
$stdout=""
$foo = Run($cmd, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
While 1
$line = StdoutRead($foo)
If @error Then ExitLoop
$stdout=$stdout & $line
Wend
MsgBox(0,$cmd,$stdout)
EndFunc

$cmd=@ComSpec & " /c " & " java "
ShowStdout($cmd) ; Показывает STDOUT нормально
$cmd=@ComSpec & " /c " & " java -version "
ShowStdout($cmd) ; Показывает пустой STDOUT
$cmd=@ComSpec & " /c " & " python -h "
ShowStdout($cmd) ; Показывает STDOUT нормально
$cmd=@ComSpec & " /c " & " python -V "
ShowStdout($cmd) ; Показывает пустой STDOUT
Exit(0)


Если ли у кого-то идеи, с чем это может быть связано или обусловлено?

C уважением, Стас.

Evgeniy15
03-03-2007, 01:10
Иногда название окна не меняется. Получается, что посылая следующий {ENTER} нажимаешь на {Cancel}. Команда sleep не очень эффективна, т.к. она нормально отрабатывается на одном компе, на другом с заметной задержкой а на третьем задержки не хватает. Как быть в таком случае?

Creat0R
03-03-2007, 09:28
belonesox
с чем это может быть связано или обусловлено?
Если возращается пустое значение, значит произошла ошибка при первой попытке чтения, вот эту ошибку (а точнее пустое значение) можно и улавливать:


Func ShowStdout($cmd)
$stdout=""
$foo = Run($cmd, @SystemDir, @SW_HIDE, $STDERR_CHILD+$STDOUT_CHILD)
While 1
$line = StdoutRead($foo)
If @error Then ExitLoop
$stdout &= $line
Wend
If $stdout = "" Then $stdout = StderrRead($foo)
MsgBox(0, $cmd, $stdout)
EndFunc



Evgeniy15
Как быть в таком случае?
В каком случае? я, как и многие другие, увы, гадать не умею :(

amel27
03-03-2007, 10:18
belonesox
попробуй следующий вариант (проверил только для java, python под рукой нет):#include <Constants.au3>

$cmd=@ComSpec & " /c " & " java 2>&1"
ShowStdout($cmd) ; Показывает STDOUT нормально
$cmd=@ComSpec & " /c " & ' java -version 2>&1'
ShowStdout($cmd) ; Показывает пустой STDOUT
$cmd=@ComSpec & " /c " & " python -h 2>&1"
ShowStdout($cmd) ; Показывает STDOUT нормально
$cmd=@ComSpec & " /c " & " python -V 2>&1"
ShowStdout($cmd) ; Показывает пустой STDOUT

Func ShowStdout($cmd)
Local $stdout
$foo = Run ($cmd, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDERR_CHILD + $STDOUT_CHILD)
While 1
$line = StdoutRead($foo)
If @error Then ExitLoop
$stdout=$stdout & $line
Wend
MsgBox(0,$cmd,$stdout)
EndFunc
ALL
просьба не забывать добавлять в скрипты необходимые строчки #include !

Creat0R
03-03-2007, 12:32
Как можно получить загрузку ЦП определённого процесса? не важно, по имени образа, пути к файлу процесса, или по Pid. Это возможно узнать? (AutoIt'ом естественно ;) ).

amel27
03-03-2007, 13:39
Creat0R
что-то типа такого:MsgBox (0, '', _GetCPUUsageProcess ('winrar'))

Func _GetCPUUsageProcess ($proc, $ticks = 1000)
Local $aCount[3], $strProc = 'Name="' & $proc & '"'
Local $colItems, $objItem, $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")
If IsNumber ($proc) And $proc>0 Then $strProc = "IDProcess=" & $proc
; Считываем необходимые характеристики процесса - попытка №1
$colItems = $objWMIService.ExecQuery ("SELECT IDProcess,PercentProcessorTime,Timestamp_Sys100NS FROM Win32_PerfRawData_PerfProc_Process WHERE " & $strProc, "WQL", 0x30)
For $objItem In $colItems
$aCount[0]=$objItem.IDProcess
$aCount[1]=$objItem.PercentProcessorTime
$aCount[2]=$objItem.Timestamp_Sys100NS
ExitLoop
Next
If $aCount[0] Then
; Накапливаем статистику...
Sleep ($ticks)
; Считываем необходимые характеристики процесса - попытка №2
$colItems = $objWMIService.ExecQuery ("SELECT PercentProcessorTime,Timestamp_Sys100NS FROM Win32_PerfRawData_PerfProc_Process WHERE IDProcess=" & $aCount[0], "WQL", 0x30)
For $objItem In $colItems
Return Round (100*($objItem.PercentProcessorTime - $aCount[1])/($objItem.Timestamp_Sys100NS - $aCount[2]))
Next
EndIf
Return ""
EndFunc

Creat0R
03-03-2007, 14:40
amel27
что-то типа такого:
Не работает :( до цикла дело не доходит...

Вернее доходит (это я с полным именем проверял, включая расширение), но возвращается всегда ноль :(

amel27
05-03-2007, 02:36
Creat0R
попробуй запустить архивацию каталога и проверить процесс "winrar",
FYI: эта функция показывает мгновенное значение загрузки CPU

Izh
05-03-2007, 11:57
люди подскажите пожалуйста
недавно аозникла проблема доведения инсталяции софта до уровня автомата...
почти сразу столкнулся с проблемой - не могу заставить скрипт определить сидюк. если прописываешь жестко с какого диска стартовать софтину, то все прекрасно, но когда надо чтоб он сам запуске скрипта определял под каким диском идет сидюк, возникают проблемы, команда неверна и тому подобное....
заранее благодарен

Creat0R
05-03-2007, 16:44
amel27
попробуй запустить архивацию каталога и проверить процесс "winrar",
FYI: эта функция показывает мгновенное значение загрузки CPU
Да, для архивации показывает (хотя и не совсем мгновенно), но я пробовал на таком примере, и странно что не работает:


#include <GuiConstants.au3>
GUICreate("CPU Usage Test", 200, 200)

$ProcessName = "AutoIt3"
$StatusBar = GUICtrlCreateLabel("CPU Usage: ", 0, 185, 200, 15, BitOr($SS_SIMPLE,$SS_SUNKEN))

GUISetState()

AdlibEnable("SetStatus", 20)

While GUIGetMsg() <> -3
WEnd

Func SetStatus()
GUICtrlSetData($StatusBar, "CPU Usage: " & _GetCPUUsage($ProcessName))
EndFunc


Ведь по идее сам процесс скрипта (AutoIt3.exe) занимает около 10-20-ти процентов загрузкий ЦП (в данном примере), но возвращается всегда ноль. Я пробовал и на других процессах, но результат тот же :(

И ещё, а для чего по умолчанию стоит процесс idle, как я понял это типа “Бездействие системы”? но если оставлять по умолчанию, то возвращается тоже ноль, хотя в Диспетчере задач если ничего не грузит процессор то это значение становиться 99.

P.S
Что такое FYI?

Izh
заставить скрипт определить сидюк
Из спраки немного изменил пример (поиск по команде DriveGetDrive):

$var = DriveGetDrive( "CDROM" )
If NOT @error Then
MsgBox(4096,"", "Found " & $var[0] & " drives")
For $i = 1 to $var[0]
MsgBox(4096,"Drive " & $i, $var[$i])
Next
EndIf

amel27
06-03-2007, 05:51
Как определить период бездействия пользователя (пример):#include <Date.au3>
Opt("TrayIconHide", 1)

$IdleMinimum = 1000 ; Количество допустимых секунд неактивности
$LogFileName = StringTrimRight (@ScriptFullPath, 4) & ".log" ; Имя файла журнала

While 1
; Ожидание неактивности достаточной длительности
$iIdle = _IdleWaitCommit ($IdleMinimum)
; Запись этого события в лог
Local $sHours = '', $sMins = '', $sSecs = ''
$iHours = Int ($iIdle/3600)
If $iHours Then $sHours = $iHours & ' часов '
$iMins = Int (Mod ($iIdle, 3600)/60)
If $iMins Then $sMins = $iMins & ' минут '
$iSecs = Round (Mod (Mod ($iIdle, 3600), 60))
If $iSecs Then $sSecs = $iSecs & ' секунд'
FileWriteLine ($LogFileName, _Now () & ' ' & @UserName & ' неактивен ' & $sHours & $sMins & $sSecs & @CRLF)
Wend

; Функция: ожидание неактивности пользователя.
; Возвращает: время неактивности в секундах.
; $idlesec - минимальная длительность ожидаемой неактивности в сек.
Func _IdleWaitCommit ($idlesec)
$idlesec = $idlesec * 1000
Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
Do
$iSave = DllStructGetData ($LastInputInfo, 2)
Sleep(500)
DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec
Return Round ((DllStructGetData ($LastInputInfo, 2)-$iSave)/1000)
EndFunc

amel27
06-03-2007, 07:33
Creat0R
Ну... значит процесс не может определить загрузку самого себя, т.к. эти операции выполняются синхронно - пока WMI вычисляет загрузку сам процесс (AutoIt3) ожидает ответа, т.е. действительно простаивает... потому я и сказал о мгновенном значении.

по поводу Idle - там скорей всего общая загрузка CPU

P.S. FYI - For Yur Information :)

xstranger
06-03-2007, 07:58
люди подскажите пожалуйста
недавно аозникла проблема доведения инсталяции софта до уровня автомата...
почти сразу столкнулся с проблемой - не могу заставить скрипт определить сидюк. если прописываешь жестко с какого диска стартовать софтину, то все прекрасно, но когда надо чтоб он сам запуске скрипта определял под каким диском идет сидюк, возникают проблемы, команда неверна и тому подобное....
заранее благодарен

я сделал немного по другому

$source = RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup", "SourcePath")

runwait($source & 'Software\prog.exe')

это хорошо работает на этапе GuiRunOnce, при автоустановке софта. но может и дальше использоваться если конфигурация носителей не меняется

Creat0R
06-03-2007, 12:58
amel27
значит процесс не может определить загрузку самого себя
Но ведь...

Я пробовал и на других процессах, но результат тот же :(

пока WMI вычисляет загрузку сам процесс (AutoIt3) ожидает ответа, т.е. действительно простаивает
Да, но, в Диспетчере задач явно видно что процесс вовсе не простаивает, а именно грузит ЦП.

по поводу Idle - там скорей всего общая загрузка CPU
Тогда почему тоже всегда ноль? :)

P.S. FYI - For Yur Information
Спасибо, буду знать (и наверное юзать ;) )

amel27
07-03-2007, 09:37
Creat0R
исправил скрипт (http://forum.oszone.net/post-557545-757.html) - добавил усреднение по заданному интервалу (в "тиках"), кроме того процесс может теперь передаваться как по имени, так и по PID.

Creat0R
08-03-2007, 05:51
amel27
исправил скрипт
Большое спасибо, вроде работает....

Хотя мне пока не удаётся подобрать оптимальный интервал использования этой функции (между каждым её вызовом и установкой тикания ;) ).

процесс может теперь передаваться как по имени, так и по PID
По PID вроде не работает, а по имени опять же, нужно без расширения.... но это думаю не страшно (хотя иногда существуют процессы не только с расширением *.exe... тогда придётся делать перебор по всем процессам на существование с подобным именем)...

Мне вообще то всё это нужно для одного моего небольшого проэктика, я пытаюсь написать утилитку менеджер процессов - Получилось ВСЁ что хотел, кроме (теперь корректного, т.е в реальном времени) слежения за загрузкой ЦП (каждого процесса в отдельности и общего использования), и использования памяти каждым процессом.

Мне удалось адаптировать многие функции из офф. форума, естественно кучу твоих функции, и пару собственных.
Утилита позволяет просматривать подробную информацию о процессе, имеет почти все те же функции что и у встроенного taskmgr.exe в Windows (включая собственный диалог запуска приложении - FileRun), и даже чуть чуть больше :) .

Добавлено:
[hr]

amel27
Как определить период бездействия пользователя
Бездействия в каком смысле? что юзер (не) должен делать для бездействия? я запустил этот пример, ничего не делал пару секунд, потом что то начал делать :), но лог не пишется.




© OSzone.net 2001-2012