Войти

Показать полную графическую версию : [решено] Помогите грамотно записать батник применение темы в Seven


Страниц : [1] 2

Pozia
31-10-2010, 22:22
Есть вот такой скрипт применения темы в 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

но не работает. Может как не правильно оформил? Помогите пожалуйста.

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

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

NiOl
01-11-2010, 19:39
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" - его кол-во в оперативке должно стать равным нулю.

Iska
01-11-2010, 19:42
там возникает несколько лишних процессов. Но как их уловить? Не успеваю. Подскажите подробнее пожалуйста. »
Process Monitor от бывшей Sysinternals. Установить фильтр на запуск и останов процессов.

seriych
02-11-2010, 13:02
А разве тему нельзя применить просто так:
Start /wait "" "%SystemRoot%\Resources\themes\Aero.theme"

Iska
02-11-2010, 15:15
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"

Pozia
02-11-2010, 19:27
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

Bodya.N
02-11-2010, 20:45
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

Pozia
02-11-2010, 22:39
В AutoIt'е не подойдет? »
подойдет. Но предложенный вами скрипт не работает

Bodya.N
02-11-2010, 23:03
Извини , неправильно скопировал код. Подправил , сейчас должно работать.

Pozia
03-11-2010, 00:24
Bodya.N, работает. Еще бы доработать скрипт чтобы окно Персонализации закрывалось. Перезагрузкой explorer проще всего, но может как нить хитрее можно? Без перезагрузки?

Bodya.N
03-11-2010, 20:05
Да можно ...
#NoTrayIcon
$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)
Sleep(5000)
WinClose($title)
Else
MsgBox(16, 'Ошибка применения Темы', 'Тема "' & $theme & '" не обнаружена! ')
EndIf
...только это помоему в другом месте обсуждают...

Pozia
04-11-2010, 08:31
Bodya.N, а подскажите как скрыть окно персонализации? Чтобы оно запускалось скрытым или после запуска сразу же скрывалось?

Bodya.N
04-11-2010, 21:05
Pozia WinWait($title, "", 10)
WinSetState ($title, "", @SW_HIDE )

NoIZz
16-08-2012, 20:50
Скажите, а кто-нибудь решал проблему удаления тем из командной строки?

Pozia
25-08-2012, 23:47
Кто то мне подкинул автоит скрипт, который применяет любую тему при запуске его из командной строки типа:
ThemeApply.exe "New Look Dark WD"
и исходник я потерял. сейчас нужно скомпилировать для x86 системы и полный косяк. А кто и где мне его подкинул не помню. может у кого исходник этого скрипта есть? Сам exe прикрепляю

Fermalion
12-03-2019, 20:47
Подскажите, пожалуйста, нельзя ли как-то автоматически закрывать "Персонализацию" после применения темы?
Autoit ставить не очень хочется, неужели этого нет в стандартных возможностях cmd?
Я внимательно изучил эту тему (я мало что понимаю в управлении командной строкой), подскажите, пожалуйста, как дописать батник на автозакрытие персонализации?
Спасибо!

Iska
12-03-2019, 20:51
неужели этого нет в стандартных возможностях cmd? »
Отродясь такого в пакетных файлах не было.

Serguei Kouzmine
12-03-2019, 23:18
a чем не подошел мой пример ?

http://forum.oszone.net/thread-339638.html ?




© OSzone.net 2001-2012