Страница 44 из 243

Добавлено: Пн дек 24, 2012 22:00
Loopback
KopBuH писал(а):вот если бы была поддержка чтения из WMI
Не, внутреннюю поддержку этого я делать не буду.

Хотя, если модифицировать идею MVV без использования ini, можно попробовать сделать захват стандартного вывода запускаемой программы. Тогда, если сделать скрипт или экзешник, выводящие информацию в stdout, ее можно будет получать сразу в скрипте.

Добавлено: Пн дек 24, 2012 23:15
MVV
Loopback, такой функции самое место в отдельном плагине.
А вообще, не думаю, что такая уж и проблема выдать результат в инишник во временной папке... на то она и временная.

Добавлено: Ср дек 26, 2012 20:40
KopBuH
ждем функцию RegRead.
чтобы можно было выставлять тип значения - REG_DWORD REG_SZ и т.п. :)

например, так:

Код: Выделить всё

RegRead AutorunKey "HKLM\Software\TC_Autorun" "sz" "AutorunKey" "Autorun"
отсюда: переменная, путь ключа в реестре, тип значения, имя значения, значение по умолчанию.

Добавлено: Ср дек 26, 2012 22:20
MVV
Зачем указывать тип? Строка всегда будет возвращаться в виде строки (ololo), число - тоже в виде строки (4660 или $1234), зачем тут тип указывать? Переменные всё равно в плагине бывают только строковые, а тип параметра прекрасно возвращает функция RegQueryValueEx.
Нужны только имя переменной, адрес ключа и имя значения, ну и значение по умолчанию. В качестве параметра вижу уточнение, в какой системе возвращать число - в десятеричной или шестнадцатеричной.

Код: Выделить всё

RegRead [/HEX] <имя_переменной> <адрес_ключа> <имя_значения> [<текст_по_умолчанию>]
Параметр /HEX - чтобы возвращать число в виде $1234, а не в виде 4660, на строки влиять вообще не должен. Если вместо имени ключа заданы пустые кавычки, читать значение (По умолчанию) - впрочем, это даже реализовывать не нужно, RegQueryValueEx и так прочитает значение по умолчанию, если указано пустое имя значения.

Добавлено: Чт дек 27, 2012 11:49
Loopback
По поводу RegRead согласен с MVV, указание типа при чтении - излишне. Да и по остальной логике возражений нет, как-то так и я себе ее представлял.
MVV писал(а):такой функции самое место в отдельном плагине.
[s]В этом случае в плагине придется по-сути повторять функционал ShellExec. Есть ли смысл? Можно просто опционально добавить чтение потока сразу после запуска в переменную. Должно уместиться в десяток строк кода.[/s]
Нет, лучше действительно в плагин. Практически все ключи ShellExec неприменимы, а сопутствующего кода оказалось больше (перекодировка).

Добавлено: Пт дек 28, 2012 18:22
Loopback
Одиннадцатая бета.

Скачать

Изменения:

Код: Выделить всё

+ команда ProcessExecGetOutput в плагине Process
+ команда RegRead
Вообще процесс развития - он бесконечен, поэтому, если ничего не выплывает критического, я бы хотел сделать релиз.

Flasher
По поводу дефолтных значений ini. Я не смог повторить проблему. Сейчас логика такая: заданное дефолтное значение используется в случае, если ключ отсутствует в ini. Если ключ есть - используется его значение, в том числе пустое.

Добавлено: Пт дек 28, 2012 18:37
Flasher
Loopback
Т.е. такой код у тебя работает?
Новую пока не качал..

Добавлено: Пт дек 28, 2012 20:43
Loopback
Flasher
А, нашел, спасибо за наводку. Это не в IniRead ошибка была, а с операторами and/or, которые обрабатывались регистрозависимо.

Версию обновил по той же ссылке.

Добавлено: Сб дек 29, 2012 13:41
Flasher
Loopback
Сейчас порядок. Можно релизить. Отдельное мерси за RegRead, начинаю уже прикручивать. :)
Про stdout пока не думал. Есть какие-то идеи? Что там из полезного окромя cmd у нас выводит?

Добавлено: Сб дек 29, 2012 14:41
KopBuH
Loopback
вроде сделал проверку локализации ОС:

Код: Выделить всё

# Проверка локализации (языка) ОС
RegRead COMMANDER_OSLANG "HKCU\Control Panel\International" "Locale" "unknown"
# Проверка версии ОС
If %COMMANDER_OSLANG% = 00000419 Then
  SetEnv COMMANDER_OSLANG "Rus"
ElseIf %COMMANDER_OSLANG% = 00000409 Then
  SetEnv COMMANDER_OSLANG "Eng"
Else
  SetEnv COMMANDER_OSLANG "%COMMANDER_OSLANG%"
EndIf
в принципе, всё работает, спасибо.
но иногда почему то вылазиют странные сообщения плагина при выходе из ТС.
причем не всегда :( .

и еще:
является ли такой код правильным: (переменная "%ShowHiddensOnStart%" и "%COMMANDER_ASADMIN%" уже создана)
Старый код: (10-ая бета)

Код: Выделить всё

If %ShowHiddensOnStart% = 0 Then
ElseIf %COMMANDER_ASADMIN% = 1 Then
  ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "win show class TTOTAL_CMD"
Else
EndIf
Новый код: (11-ая бета)

Код: Выделить всё

If %ShowHiddensOnStart% = 0 Then
ElseIf %COMMANDER_ASADMIN% = 1 Then
  ShellExec /EV "%COMMANDER_PATH%\Macroses\nircmd%COMMANDER_ARCH%.exe" "win show class TTOTAL_CMD"
EndIf
как видите, там я удалил строку else, поскольку ничего выполнять не нужно. вроде пока проблем не наблюдаю. или else всё же должна быть?. (сообщения об ошибках исчезли вроде именно после того, как я везде убрал эту else. но в 10-ой бетке такого не наблюдалось )


P.S.: Loopback, добавил бы в autorun.example.cfg пару примеров работы с RegRead

Добавлено: Вс дек 30, 2012 20:02
Loopback
Flasher писал(а):Про stdout пока не думал. Есть какие-то идеи? Что там из полезного окромя cmd у нас выводит?
В первую очередь - cscript. Для меня - Autoit, конечно.

Ну вот, например, очень специфический запрос KopBuH по получению SID. Теперь его можно вытащить скриптом через WMI. Скрипт (get_sid.vbs):

Код: Выделить всё

On Error Resume Next

Set strUserName = ""
Set WshShell  = WScript.CreateObject( "WScript.Shell" )
Set WshSysEnv = WshShell.Environment( "PROCESS" )
strUserName   = WshSysEnv( "USERNAME" )

Set objWMIService = GetObject( "winmgmts://./root/CIMV2" )

Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", "WQL", &h30)

For Each objItem In colItems
	If LCase( objItem.Name ) = LCase( strUserName ) Then
		WScript.Stdout.Write objItem.SID
	End If
Next
Строка запуска в Autorun:

Код: Выделить всё

ProcessExecGetOutput SID cscript.exe "//Nologo get_sid.vbs"
SetEnv /EV USER_SID %SID%
KopBuH писал(а):но иногда почему то вылазиют странные сообщения плагина при выходе из ТС. причем не всегда
Странно, не наблюдал ничего такого странного.
KopBuH писал(а):является ли такой код правильным:
Можно в любой комбинации, минимально If..Endif.
Тут возникает другой вопрос - а зачем нужно условие%ShowHiddensOnStart% = 0, если оно ничего не делает.
KopBuH писал(а):P.S.: Loopback, добавил бы в autorun.example.cfg пару примеров работы с RegRead
Есть идеи? Нужно что-то применимое для многих.

Добавлено: Вс дек 30, 2012 20:13
Flasher
Loopback писал(а):В первую очередь - cscript. Для меня - Autoit, конечно.
Я не думаю, что вообще есть смысл использовать скрипты для вывода потока, чтобы получить какое-то значение, записываемое в переменную среды, которое потом тем же скриптингом и будет обрабатываться. В этом нет практического смысла, на мой взгяд (если не брать какие-то совсем простые операции типа создания одноимённых папок и т.п.). Или, может, я чего не улавливаю?

Добавлено: Вс дек 30, 2012 20:21
Loopback
Flasher писал(а):Или, может, я чего не улавливаю?
Скрипт может менять унаследованную переменную окружения, но в родительском процессе эти изменения не отразятся.

Добавлено: Вс дек 30, 2012 20:30
Flasher
Loopback
Какой процесс в данном случае понимается под родительским, и какие изменения должны на нём отражаться?

Добавлено: Вс дек 30, 2012 21:09
Loopback
Flasher
Родительский процесс - Тотал с загруженным Autorun. Переменная окружения, созданная в Autorun, будет видна во внешнем (запускаемом из Autorun) скрипте, но не может быть им изменена. Созданная во внешнем скрипте переменная вообще не будет видна в скрипте Autorun (и в ТС).

Так что передача через stdout, на мой взгляд, самый простой и удобный способ передать информацию в Autorun.