Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Помогите грамотно записать батник применение темы в Seven (http://forum.oszone.net/showthread.php?t=189933)

Pozia 31-10-2010 22:22 1531925

Помогите грамотно записать батник применение темы в Seven
 
Есть вот такой скрипт применения темы в 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 1532460

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

Pozia 01-11-2010 19:21 1532495

Цитата:

Цитата NiOl
Может во время запуска исходного батника посмотреть какой процесс появляется на доли секунд. »

хорошая идея. там возникает несколько лишних процессов. Но как их уловить? Не успеваю. Подскажите подробнее пожалуйста.
Цитата:

Цитата NiOl
Его исчезновение и надо отслеживать по "TaskList" »

это как?
Цитата:

Цитата NiOl
от долей секунд - до нескольких секунд - такое тоже может случиться) »

ага, и зависит это от мощности компа. Вот это мне и не нравится

NiOl 01-11-2010 19:39 1532509

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 1532512

Цитата:

Цитата Pozia
там возникает несколько лишних процессов. Но как их уловить? Не успеваю. Подскажите подробнее пожалуйста. »

Process Monitor от бывшей Sysinternals. Установить фильтр на запуск и останов процессов.

seriych 02-11-2010 13:02 1533026

А разве тему нельзя применить просто так:
Код:

Start /wait "" "%SystemRoot%\Resources\themes\Aero.theme"

Iska 02-11-2010 15:15 1533145

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 1533309

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 1533366

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 1533440

Цитата:

Цитата Bodya.N
В AutoIt'е не подойдет? »

подойдет. Но предложенный вами скрипт не работает

Bodya.N 02-11-2010 23:03 1533461

Извини , неправильно скопировал код. Подправил , сейчас должно работать.

Pozia 03-11-2010 00:24 1533511

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

Bodya.N 03-11-2010 20:05 1534103

Да можно ...
Код:

#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 1534406

Bodya.N, а подскажите как скрыть окно персонализации? Чтобы оно запускалось скрытым или после запуска сразу же скрывалось?

Bodya.N 04-11-2010 21:05 1534905

Pozia
Код:

WinWait($title, "", 10)       
WinSetState ($title, "", @SW_HIDE )


NoIZz 16-08-2012 20:50 1971459

Скажите, а кто-нибудь решал проблему удаления тем из командной строки?

Pozia 25-08-2012 23:47 1977026

Кто то мне подкинул автоит скрипт, который применяет любую тему при запуске его из командной строки типа:
Код:

ThemeApply.exe "New Look Dark WD"
и исходник я потерял. сейчас нужно скомпилировать для x86 системы и полный косяк. А кто и где мне его подкинул не помню. может у кого исходник этого скрипта есть? Сам exe прикрепляю

Fermalion 12-03-2019 20:47 2862776

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

Iska 12-03-2019 20:51 2862779

Цитата:

Цитата Fermalion
неужели этого нет в стандартных возможностях cmd? »

Отродясь такого в пакетных файлах не было.

Serguei Kouzmine 12-03-2019 23:18 2862808

a чем не подошел мой пример ?

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

Iska 12-03-2019 23:26 2862814

Цитата:

Цитата Serguei Kouzmine
a чем не подошел мой пример ? »

«Не cmd», видимо ;).

Serguei Kouzmine 12-03-2019 23:34 2862817

лирическое отступление - cmd был придуман когда windows | deskstop | windows stations не было даже в проекте вот неумеет он ничо

во vbscript - кто умеет превести на js пожта
Код:

Dim objShell: Set objShell = WScript.CreateObject("WScript.Shell")
Dim objShellApplication: Set objShellApplication = WScript.CreateObject("shell.application")
Dim objWindows : set objWindows = objShellApplication.Windows()
Wscript.echo objWindows.Count
Dim objWindow
For cnt = 0 To objWindows.Count-1
  set objWindow = objWindows.item(cnt)
  LocationName = objWindow.LocationName
  ' NOTE double quotes
  if InStr(LocationName,"Personalization") > 0  then
    Wscript.echo "Closing " & objWindow.HWND
    objWindow.Quit()
  end if
Next
Set objShell = Nothing
Set objWindows = Nothing
Set objShellApplication = Nothing


Vanadiy777 03-05-2020 08:17 2919733

Цитата:

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

Тоже ищу такой исходник. У Smarty такой-же механизм реализован в теме Aero Red Button Theme Installer. Но в нем работает и в х86 и в х64.
Но распаковать .ехе, чтоб вытащить конкретно скрипт не получилось... Приходится пользоваться так. (Да простит меня Сергей...)


Время: 05:55.

Время: 05:55.
© OSzone.net 2001-