Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
TERMINAL
08-11-2008, 18:06
Maza Faka, Желательно того на которое драйвера не установлены.
По поводу удаления фостов после отработки скрипта есть остатки в :
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache]
"C:\\MyProga.exe"="MyProga"
Возможно ли удалить этот хвост если скрипт будет запускаться с разных деректорий.
TERMINAL
08-11-2008, 18:10
litus, RegDelete посмотри....
Я и использую функцию "RegDelete" вот посмотрите даные реестра скрипт "nvda_L"
[HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache]
"C:\\SintezPark\\nvda\\nvda_L.exe"="nvda_L"
код :
RegDelete("HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache", ""nvda_L.exe"="nvda_L"")
Хотя даные "nvda_L.exe"="nvda_L" я уже тестировал как токо можно результат равен "неудача" этот премер вовсе выдал ошибку.
Тем более что в начале идет "c: что значит если я буду запускать скрипт с флешки то значение не удалиться а написать "F" здесь тоже не будет мнекажеться правельно так как неизвесно какая буква определиться на другой машине.
Я и использую функцию "RegDelete" вот посмотрите даные реестра »
Неверно используете ;)
Нужно так:
RegDelete("HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache", "nvda_L.exe")
Т.е нужно указывать ключ который следует удалить, значение не нужно.
Тем более что в начале идет "c: что значит если я буду запускать скрипт с флешки то значение не удалиться »
Для этого можно импровизировать, и удалять ключ по его значению (первое попавшееся):
_RegDeleteEx("HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache", "nvda_L")
Func _RegDeleteEx($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1
While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop
If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)
$iCount += 1
WEnd
Return @error
EndFunc
Есть идея, но неполучается релизовать. Я подумал, а может написать утилиту на AutoIt положить её в system32 и пользоваться. Надо зделать так чтоб файлик читал команду на входе и передавал её cmd.exe,
в его задачу только бы входило скрывать консоль. Вот что я мудрил тут, но безуспешно -
Run(@ComSpec & " /c " & '%1', "", @SW_HIDE)
Почему не работает и как это довести до ума?
Все проги типа hide cmd нифига не умеют, максимум что могут лишь батник запустить! А мне надо чтобы налету комманды передавались команд процессору, причём какие угодно, например: "/k start /w command1 & command2 & command3 & exit"
cmdow и chp вообще не могут работать без explorer.exe - лажёвые утилиты блин.
Может у когонибудь сохранилась утилита http://www.siginetsoftware.com/forum/showthread.php?t=18 ато ссылка битая, поглядеть бы что за тулс?
Есть ещё проблемма по автоиту, если скажем скрипт был запакован в SFX архив, который распаковывается во временную папку, то скрипт не может удалить исходный файл архива! Нсмотря на то что по идее сабж уже
находится в темп папке и исходный архив по идее уже и не нужен как бы! Ведь сабж уже в темп фолдере!
Тем не менее запускающий архив защищён, можно подумать что контент обратно в него из темпа заархивируется
после выполнения -чушь! Но такова реальность! 0_.
semiono, Почему не работает »
Как проверяется что оно не работает? :) Я уверен что в списке процессов у тебя висит скрытый cmd.exe ;)
Чтобы скрыть консольное окно нужно использовать WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE).
запускающий архив защищён, можно подумать что контент обратно в него из темпа заархивируется
после выполнения »
На самом деле оно так и есть, некоторые архивы перепаковываются по необходимости (так по крайней мере, себя ведёт упаковщик от Winrar).
Удалить можно после выхода скрипта, через тот же @ComSpec, но это при условии что после выхода скрипта архив не запускает/использует другие программы/файлы:
Run(@ComSpec & ' /c ping -n 2 localhost > nul & del /q /f "' & $sArchiveFile & '"', '', @SW_HIDE)
Как проверяется что оно не работает? »
Команды не "ловит", оно может и висит, так как я его из консоли запускал, но
MyProg.exe "notepad.exe new.txt" не получается! Или что либо в этом роде...
Удалить можно после выхода скрипта, »
То-есть нужна лишь задержка времени пингом? Кстати, а кроме пинга нету альтернативных вариантов оттягивания времени, просто интересно?
Я извиняюсь, а как WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE) совместить с запуском Run()
Или это все консоли скрывает которые на пути попадаются :) Можно кусочек кода показать?
В часности как Run(@ComSpec & " /c " & '%1', "", @SW_HIDE) объединить с этим всем?
semiono,
Команды не "ловит", оно может и висит, так как я его из консоли запускал, но
MyProg.exe notepad.exe new.txt не получается! »
Затрудняюсь понять. Что конкретно требуется? задать уже открытому консольному окну параметры/команды? Думаю что только если послать их через ControlSend... хотя я вроде где то видел решение, которое позволяет подключаться к потоку Std другого процесса, тогда можно писать в него через StdInWrite.
нужна лишь задержка времени пингом? »
Да.
кроме пинга нету альтернативных вариантов оттягивания времени »
Встроенными средствами cmd'а вроде нет (по крайней мере не в XP).
как WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE) совместить с запуском Run() »
Никак :) - Эта команда скроет консольное окно (то что на фронте).
Или это все консоли скрывает которые на пути попадаются »
Чтобы скрыть все, нужно пройтись по списку окон через WinList("[CLASS:ConsoleWindowClass]").
как Run(@ComSpec & " /c " & '%1', "", @SW_HIDE) объединить с этим всем? »
Лучше опиши подробнее задачу, что именно нужно с точки зрения пользователя.
Ok! Я уже пытался объяснить, ща попробую ещё...
В поисках утилит скрывающих cmd.exe window я вдруг подумал, а ведь наверняка это можно реализовать самому на AutoIt!
Конкретно, нужно написать скрыватель окна cmd.exe.
Как мне представляется - наша прога, кампилированный (Aut2Exe) скрипт пусть называется hidec.exe
Мы вводим в коммандной строке, или в батнике, или в меню Пуск >Выполнить (не знаю есть ли различие),
вводим кароче такое:
# hidec.exe notepad.exe && calc.exe && mmsys.cpl && exit
в реале у нас получается, что hidec.exe просто передаёт все эти комманды cmd.exe процессору на выполнение, то-есть всё просто пропускает через себя и перенаправляет в cmd.exe.
Единственную цель тут выполнить hidec.exe должен - это не позволить открываться окну cmd.exe
Если что-то не понятно, я пишу, я объясню ещё...
Кстати, утилита http://legroom.net/software/openargs - такой же автоит только там с другими задачами, так что идея создания утилиты не мной придумана
:)
Вроде бы Run(@ComSpec & " /c " & '%1', "", @SW_HIDE) должен работать, но он чёто молча поглощает ввод :)
После запуска с флешки "MyProga"остаються даные от autorun.inf
Даные реестра:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action]
@="Запустить MyProga"
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel]
@="MyProga"
Здесь ключ реестра как я понимаю "@" если я прописываю его то значение не удаляеться. Тогда произвожу удаление по значению .
Код:
_RegDeleteEx1("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "Запустить MyProga")
Func _RegDeleteEx1($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1
While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop
If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)
$iCount += 1
WEnd
Return @error
EndFunc
_RegDeleteEx2("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel", "MyProga")
Func _RegDeleteEx2($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1
While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop
If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)
$iCount += 1
WEnd
Return @error
EndFunc
_RegDeleteEx1("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "Запустить MyProga")
Func _RegDeleteEx1($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1
While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop
If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)
$iCount += 1
WEnd
Return @error
EndFunc
Но мне кажеться получаеться не сильно элигантноне подскажете как можно упростить код .
hidec.exe просто передаёт все эти комманды cmd.exe процессору на выполнение, то-есть всё просто пропускает через себя и перенаправляет в cmd.exe »
Можно так:
Run(@ComSpec & " /c " & $CmdLineRaw, "", @SW_HIDE)
Но это всего лишь запустить новую инстанцию cmd.exe и передаст все параметры ком. строки (переданные в скрипт).
Для того чтобы скрыть то окно в котором утилита запускается, нужно использовать ту строку что я привёл ранее (с WinSetState). Также можно определить PID (идентификатор) родительского процесса, и скрыть окно по заголовку этого процесса.
litus,
Здесь ключ реестра как я понимаю "@" »
Нет, этот символ означает значение “По умолчанию” (самое верхнее в ветке).
Это нужно удалять так:
RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "")
RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel", "")
как можно упростить код »
Для начала вам нужно понять, что функцию не нужно включать более чем один раз, она обычно задаётся в конце, и вызывается там где нужно:
_RegDeleteEx("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "Запустить MyProga")
_RegDeleteEx("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel", "MyProga")
Func _RegDeleteEx($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1
While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop
If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)
$iCount += 1
WEnd
Return @error
EndFunc
Creat0R, мне действительно помогло вставка вначале скрипта:
WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE)
Которое схлопывает моментально консоль!
Консоль, в это время исполняет код записанный InnoSetup:
[Registry]
Root: HKLM32; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "Alcohol-Setup"; ValueData: "{sys}\cmd.exe /k start /w {sys}\Alcohol.exe & del /f /q {sys}\Alcohol.exe & reg delete HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v Alcohol-Setup /f & Exit"; Flags: noerror; Permissions: admins-full
Практически ничего не стал менять, лишь прикрыл внешнюю консоль из скрипта! Спасибо!
Что важно, что реестр удаляет архив из которого стартовал скрипт! ;-
Хотя вот последнее твоё Run(@ComSpec & " /c " & $CmdLineRaw, "", @SW_HIDE) - это интересно, надо проверить! Потому-что идея разработки hidec утилиты очень даже пригодиться!
TERMINAL
Желательно того на которое драйвера не установлены »
проще всего при помощи DevCon (http://support.microsoft.com/kb/311272/ru), пример использования в AutoIT:
#include <Constants.au3>
$out = ""
$txt = ""
; Запуск DEVCON
$foo = Run(@ComSpec & " /C DevCon ListClass Unknown", @SystemDir, @SW_HIDE, $STDOUT_CHILD)
; Чтение результата
While 1
$out &= StdoutRead($foo)
If @error Then ExitLoop
Wend
; Парсинг результата в массив
$arr = StringRegExp($out, "(?:[&\w]+\\)+[&\w]+", 3)
; Вывод массива на экран
If IsArray($arr) Then
For $i=0 To UBound($arr)-1
$txt &= $arr[$i] &@CRLF
Next
EndIf
MsgBox(0,"",$txt)
P.S. для скрипта devcon.exe должен лежать в System32
Необходимо прочитать текст из cmd.exe, точнее с любого консольного окна. Запускаю cmd.exe затем telnet хочу дождаться приглашения другого компа »
Смотри функцию StdoutRead() »
к сожалению, для Telnet StdoutRead() не поможет, как вариант - через файл:
$Server = "192.168.1.1"
$Port = ""
$LogFile = @TempDir & "\Telnet.Log"
$CmdText = @ComSpec & " /C " & 'Telnet -f "' & $LogFile & '" ' & $Server & " " & $Port
$CmdPID = Run($CmdText, "")
Sleep(1000)
$hWnd = WinGetHandle("Telnet " & $Server)
If @error Then Exit
ControlSend($hWnd, "", "","admin{enter}")
Sleep(1000)
ControlSend($hWnd, "", "","password{enter}")
Sleep(3000)
$data = FileRead($LogFile)
MsgBox(0, "", $data)
ControlSend($hWnd, "", "", "quit{enter}")
ControlSend($hWnd, "", "", "^c")
WinWaitClose($hWnd)
FileDelete($LogFile)
TERMINAL
10-11-2008, 10:59
amel27, что-то неопределяет...скопировал в System32, запустил твой скрипт...
и непонятно откуда взялась такая команда у тебя- /C DevCon Find =Unknown
Справка по программе Device Console (DevCon)
devcon.exe [-r] [-m:\\<компьютер>] <команда> [<арг>...]
-r Перезагрузить компьютер после выполнения команды, если это необходимо.
<компьютер> Имя компьютера назначения.
<команда> Подлежащая выполнению команда (см. ниже).
<арг>... Один или несколько аргументов (если необходимы).
Для получения справки по определенной команды введите: devcon.exe help <команда>
classfilter Разрешить изменение фильтров классов.
classes Отобразить все классы настройки устройств.
disable Отключить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
driverfiles Отобразить установленные файлы драйверов.
drivernodes Отобразить все узлы драйверов устройств.
enable Включить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
find Найти устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
findall Найти устройства, включая отсоединенные.
help Отображение справочной информации.
hwids Отобразить идентификаторы оборудования.
install Установить устройство в ручном режиме.
listclass Отобразить все устройства для класса настройки.
reboot Перезагрузить локальный компьютер.
remove Удалить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
rescan Выполнить поиск нового оборудования.
resources Отобразить ресурсы устройств.
restart Перезагрузить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
stack Отобразить ожидаемый стек драйверов устройств.
status Отобразить рабочее состояние устройств.
update Обновить устройство в ручном режиме.
UpdateNI Обновить устройство в ручном режиме без уведомления пользователя.
SetHwID Добавить, удалить или изменить порядок идентификаторов оборудования для устройств с корневым перечислением.
непонятно откуда взялась такая команда у тебя »
DevCon Help Find
DevCon Classes
попробуй другой класс устройств:
DevCon Find =Media
З.Ы. что касается /C, то это часть команды "CMD /C ", где CMD раскрывается макросом @ComSpec
TERMINAL
10-11-2008, 11:32
amel27, всё перепробовал, мне кажется что где-то в скрипте ошибка-у себя на компе можешь проверить?
TERMINAL, без скрипта проверь в командной строке указанные команды, выдают список DevID?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.