Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Помогите грамотно записать батник применение темы в Seven

Ответить
Настройки темы
CMD/BAT - [решено] Помогите грамотно записать батник применение темы в Seven

Аватара для Pozia

Ветеран


Сообщения: 2756
Благодарности: 211

Профиль | Отправить PM | Цитировать


Есть вот такой скрипт применения темы в Seven:

Код: Выделить весь код
rundll32.exe %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Themes /Action:OpenTheme /file:"%SystemRoot%\Resources\themes\Aero.theme"
ping -n 10 127.0.0.1 > NUL
taskkill /im explorer.exe /F
start explorer.exe
Мне здесь не нравится строка
Код: Выделить весь код
ping -n 10 127.0.0.1 > NUL
но без нее нельзя, так как не успевает примениться тема. Пробовал сделать так:

Код: Выделить весь код
start /wait rundll32.exe %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Themes /Action:OpenTheme /file:"%SystemRoot%\Resources\themes\Aero.theme"
taskkill /im explorer.exe /F
start explorer.exe
но не работает. Может как не правильно оформил? Помогите пожалуйста.

-------
Жизни вглядись в глаза: Это то, что ты всегда искал? Это то, что ты всегда хотел? Да или нет?


Отправлено: 22:22, 31-10-2010

 

Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


Может во время запуска исходного батника посмотреть какой процесс появляется на доли секунд. Его исчезновение и надо отслеживать по "TaskList"
(т.е. "неграмотность" исходного скрипта заключается в том, что нет точной инфы, сколько времени требуется панели инструментов на применение темы - от долей секунд - до нескольких секунд - такое тоже может случиться)

-------
Как сказало Дерево Дровосеку: "я - пень".

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:38, 01-11-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Pozia

Ветеран


Сообщения: 2756
Благодарности: 211

Профиль | Отправить PM | Цитировать


Цитата NiOl:
Может во время запуска исходного батника посмотреть какой процесс появляется на доли секунд. »
хорошая идея. там возникает несколько лишних процессов. Но как их уловить? Не успеваю. Подскажите подробнее пожалуйста.
Цитата NiOl:
Его исчезновение и надо отслеживать по "TaskList" »
это как?
Цитата NiOl:
от долей секунд - до нескольких секунд - такое тоже может случиться) »
ага, и зависит это от мощности компа. Вот это мне и не нравится

-------
Жизни вглядись в глаза: Это то, что ты всегда искал? Это то, что ты всегда хотел? Да или нет?


Отправлено: 19:21, 01-11-2010 | #3


Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


1. Делаем "сканер", запускаем в отдельном CMD, желательно назначив ему высокий приоритет

@echo off
:Loop
echo === %time%>>%~dpn0.log
TaskList >>%~dpn0.log
goto :Loop


сканер будет бесконечно крутиться и надеюсь несколько раз в секунду сохранять список процессов в одноименный лог-файл.
По нормальному завершению исходного, работающего скрипта смены темы останавливаем "сканер" (Ctrl+Break).

2. Анализируем лог-файл, возможно кроме Control.exe будет еще что-то. Ищем их отличительные особенности (лучше, если это уникальное имя файла). Если наблюдаются совпадения с уже имеющимися в памяти, то увеличиваем кол-во инфы в сканере "TaskList /V" - дополнительная инфа может быть (в конечном скрипте) отсяна по фильтру, например на совпадение названия "окна": TaskList /FI "WindowTitle eq Название окна"...

3. В итоге строки ожидания вместо пинга будет выглядить так:
:Loop
for /f "tokens=1" %%F in ('tasklist^|find /c "Control.exe"') do if not "%%F"=="0" GotTo :Loop

* здесь для прмера ожидается окончание выполнения файла "Control.exe" - его кол-во в оперативке должно стать равным нулю.

-------
Как сказало Дерево Дровосеку: "я - пень".

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:39, 01-11-2010 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Pozia:
там возникает несколько лишних процессов. Но как их уловить? Не успеваю. Подскажите подробнее пожалуйста. »
Process Monitor от бывшей Sysinternals. Установить фильтр на запуск и останов процессов.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:42, 01-11-2010 | #5


Аватара для seriych

Старожил


Сообщения: 182
Благодарности: 42

Профиль | Отправить PM | Цитировать


А разве тему нельзя применить просто так:
Код: Выделить весь код
Start /wait "" "%SystemRoot%\Resources\themes\Aero.theme"

-------
* Книгой можно не только стаканчик с лапшой накрывать. ©


Отправлено: 13:02, 02-11-2010 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


2seriych: зя !. Но, если посмотреть в реестр, то пройдя по пути «HKCR\.theme\(Default)» --> «HKCR\themefile\shell\open\command\(Default)» — придём в аккурат к указанному в первом посте темы:
Код: Выделить весь код
%SystemRoot%\system32\rundll32.exe %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Themes /Action:OpenTheme /file:"%1"

Отправлено: 15:15, 02-11-2010 | #7


Аватара для Pozia

Ветеран


Сообщения: 2756
Благодарности: 211

Профиль | Отправить PM | Цитировать


NiOl, отследил процессы. Их три: conhost.exe, dllhost.exe, rundll32.exe

По вашему методу должно быть так:

Код: Выделить весь код
rundll32.exe %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Themes /Action:OpenTheme /file:"%SystemRoot%\Resources\themes\Spring WD.theme"
:Loop
for /f "tokens=1" %%F in ('tasklist^|find /c "conhost.exe"') do if not "%%F"=="0" GotTo :Loop
taskkill /im explorer.exe /F
start explorer.exe
exit
Но не работает. Почему?

Нашел другой метод (по сути тот же):
Скрипт:
Код: Выделить весь код
rundll32.exe %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Themes /Action:OpenTheme /file:"%SystemRoot%\Resources\themes\Spring WD.theme"
Sleep.vbs
taskkill /im explorer.exe /F
start explorer.exe
exit
Скрипт Sleep.vbs:
Код: Выделить весь код
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set colItems = objRefresher.AddEnum(objService, "Win32_Process").objectSet

Do Until False
    Wscript.Sleep 1000
    objRefresher.Refresh
    Flag = True
    For Each objItem in colItems
        If InStr(objItem.ExecutablePath, "dllhost.exe") Then
            Flag = False
        End If
    Next
    If Flag = True Then
        Exit Do
    End If
Loop

Wscript.Sleep 5000

-------
Жизни вглядись в глаза: Это то, что ты всегда искал? Это то, что ты всегда хотел? Да или нет?


Отправлено: 19:27, 02-11-2010 | #8


Аватара для Bodya.N

Пользователь


Сообщения: 106
Благодарности: 40

Профиль | Отправить PM | Цитировать


Pozia А принципиально в CMD? В AutoIt'е не подойдет?
Код: Выделить весь код
$theme = "Aero"
$title = "Свойства: Экран"

If FileExists(@WindowsDir & "\Resources\Themes\" & $theme & ".theme") Then
	ShellExecute(@WindowsDir & "\Resources\Themes\" & $theme & ".theme")
	WinWait($title, "", 10)
	If WinExists($title) Then ControlClick($title, "", 1)
Else
	MsgBox(16, 'Ошибка применения Темы', 'Тема "' & $theme & '" не обнаружена! ')
EndIf

Последний раз редактировалось Bodya.N, 02-11-2010 в 23:00.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:45, 02-11-2010 | #9


Аватара для Pozia

Ветеран


Сообщения: 2756
Благодарности: 211

Профиль | Отправить PM | Цитировать


Цитата Bodya.N:
В AutoIt'е не подойдет? »
подойдет. Но предложенный вами скрипт не работает

-------
Жизни вглядись в глаза: Это то, что ты всегда искал? Это то, что ты всегда хотел? Да или нет?


Отправлено: 22:39, 02-11-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Помогите грамотно записать батник применение темы в Seven

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Записать имя папки в которой лежит батник в переменную а потом эту же папку переим. bobr95 Скриптовые языки администрирования Windows 8 10-04-2012 18:42
Разное - [решено] Применение темы через BAT\CMD Pozia Оформление Windows 11/ 10 / 8 / 7 / Vista 16 21-04-2011 22:03
Прочее - [решено] нестандартное применение ADSL - модема --- помогите в решении courageous Сетевые технологии 3 12-02-2010 20:43
Прочее - Помогите грамотно построить-восстановить сеть Vavcho Сетевые технологии 18 17-02-2009 13:04
Помогите. Не работает батник!!! MJR Microsoft Windows 2000/XP 6 01-02-2003 00:02




 
Переход