Показать полную графическую версию : [Архив - Часть 1.3] AutoIt скрипты
Объясните пожалуйста,а то я не догоняю,не могу понять что в справке написано:
что делает ConsoleWrite? и для чего её можно применить?
зарание благодарен
13ghost
Штатное применение - отладка скриптов средствами SciTE, кстати неплохая альтернатива MsgBox() ;). Выводит заданный тект (например, значения переменных) в экран вывода - тот, что включается по F8. Из нештатных - запись данных в STDOUT при запуске скрипта через CMD.
Creat0RLocal там лишних два раза встречаетсягы-гы, а я исправил раньше твоего замечания ;)Поздравляю со статусом Ветерана!упс, а кем я был? :o
упс, а кем я былТы можешь быть кем хочешь, изменяя статус в профиле, - это привелегия участников, входящих в группу Contributors.
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 не очень эффективна, т.к. она нормально отрабатывается на одном компе, на другом с заметной задержкой а на третьем задержки не хватает. Как быть в таком случае?
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
Как быть в таком случае?
В каком случае? я, как и многие другие, увы, гадать не умею :(
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 !
Как можно получить загрузку ЦП определённого процесса? не важно, по имени образа, пути к файлу процесса, или по Pid. Это возможно узнать? (AutoIt'ом естественно ;) ).
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
amel27
что-то типа такого:
Не работает :( до цикла дело не доходит...
Вернее доходит (это я с полным именем проверял, включая расширение), но возвращается всегда ноль :(
Creat0R
попробуй запустить архивацию каталога и проверить процесс "winrar",
FYI: эта функция показывает мгновенное значение загрузки CPU
люди подскажите пожалуйста
недавно аозникла проблема доведения инсталяции софта до уровня автомата...
почти сразу столкнулся с проблемой - не могу заставить скрипт определить сидюк. если прописываешь жестко с какого диска стартовать софтину, то все прекрасно, но когда надо чтоб он сам запуске скрипта определял под каким диском идет сидюк, возникают проблемы, команда неверна и тому подобное....
заранее благодарен
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
Как определить период бездействия пользователя (пример):#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
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, при автоустановке софта. но может и дальше использоваться если конфигурация носителей не меняется
amel27
значит процесс не может определить загрузку самого себя
Но ведь...
Я пробовал и на других процессах, но результат тот же :(
пока WMI вычисляет загрузку сам процесс (AutoIt3) ожидает ответа, т.е. действительно простаивает
Да, но, в Диспетчере задач явно видно что процесс вовсе не простаивает, а именно грузит ЦП.
по поводу Idle - там скорей всего общая загрузка CPU
Тогда почему тоже всегда ноль? :)
P.S. FYI - For Yur Information
Спасибо, буду знать (и наверное юзать ;) )
Creat0R
исправил скрипт (http://forum.oszone.net/post-557545-757.html) - добавил усреднение по заданному интервалу (в "тиках"), кроме того процесс может теперь передаваться как по имени, так и по PID.
amel27
исправил скрипт
Большое спасибо, вроде работает....
Хотя мне пока не удаётся подобрать оптимальный интервал использования этой функции (между каждым её вызовом и установкой тикания ;) ).
процесс может теперь передаваться как по имени, так и по PID
По PID вроде не работает, а по имени опять же, нужно без расширения.... но это думаю не страшно (хотя иногда существуют процессы не только с расширением *.exe... тогда придётся делать перебор по всем процессам на существование с подобным именем)...
Мне вообще то всё это нужно для одного моего небольшого проэктика, я пытаюсь написать утилитку менеджер процессов - Получилось ВСЁ что хотел, кроме (теперь корректного, т.е в реальном времени) слежения за загрузкой ЦП (каждого процесса в отдельности и общего использования), и использования памяти каждым процессом.
Мне удалось адаптировать многие функции из офф. форума, естественно кучу твоих функции, и пару собственных.
Утилита позволяет просматривать подробную информацию о процессе, имеет почти все те же функции что и у встроенного taskmgr.exe в Windows (включая собственный диалог запуска приложении - FileRun), и даже чуть чуть больше :) .
Добавлено:
[hr]
amel27
Как определить период бездействия пользователя
Бездействия в каком смысле? что юзер (не) должен делать для бездействия? я запустил этот пример, ничего не делал пару секунд, потом что то начал делать :), но лог не пишется.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.