Войти

Показать полную графическую версию : Кошерный Progress Bar при исполнении файла SetupComplete.cmd (Windows 7)


DuMakDuk
10-05-2017, 16:31
http://i89.fastpic.ru/big/2017/0510/9c/f2ebb39042a016db665ce911d9df809c.jpg

Когда в SetupComplete.cmd идет установка тонны программ, не совсем ясно когда это безобразие закончится,
к сожалению как использовать прогресс бар при инсталляции не описывается, если это вообще возможно, поэтому решил сделать свой костыль.

Качаем Autoit, кидаем AutoIt3.exe в нашу папку с SetupComplete.cmd

Создаем файл progress.au3 следующего содержания:
#NoTrayIcon
Opt("MustDeclareVars", 1)

Main()

Func Main()
If $CmdLine[0] == 0 Or _
StringIsDigit($CmdLine[1]) == 0 Or _
$CmdLine[1] < 0 Or _
$CmdLine[1] > 100 _
Then
Exit
EndIf

Local $hControl = ControlGetHandle("[CLASS:NativeHWNDHost]", "", "[CLASS:msctls_progress32; INSTANCE:1]")
Local $lStyle = _WinAPI_GetWindowLong($hControl, -16)

If $lStyle <> 0x50000000 Then
_WinAPI_SetWindowLong($hControl, -16, 0x50000000)
_WinAPI_SetWindowLong($hControl, -20, 0x00000000)
EndIf

_SendMessage($hControl, 0x402, $CmdLine[1], 0)
EndFunc ;==>Main

Func _WinAPI_GetWindowLong($hWnd, $iIndex)
Local $sFuncName = "GetWindowLongW"
If @AutoItX64 Then $sFuncName = "GetWindowLongPtrW"
Local $aResult = DllCall("user32.dll", "long_ptr", $sFuncName, "hwnd", $hWnd, "int", $iIndex)
If @error Or Not $aResult[0] Then Return SetError(@error + 10, @extended, 0)

Return $aResult[0]
EndFunc ;==>_WinAPI_GetWindowLong

Func _WinAPI_SetWindowLong($hWnd, $iIndex, $iValue)
_WinAPI_SetLastError(0) ; as suggested in MSDN
Local $sFuncName = "SetWindowLongW"
If @AutoItX64 Then $sFuncName = "SetWindowLongPtrW"
Local $aResult = DllCall("user32.dll", "long_ptr", $sFuncName, "hwnd", $hWnd, "int", $iIndex, "long_ptr", $iValue)
If @error Then Return SetError(@error, @extended, 0)

Return $aResult[0]
EndFunc ;==>_WinAPI_SetWindowLong

Func _WinAPI_SetLastError($iErrorCode, Const $_iCurrentError = @error, Const $_iCurrentExtended = @extended)
DllCall("kernel32.dll", "none", "SetLastError", "dword", $iErrorCode)
Return SetError($_iCurrentError, $_iCurrentExtended, Null)
EndFunc

Func _SendMessage($hWnd, $iMsg, $wParam = 0, $lParam = 0, $iReturn = 0, $wParamType = "wparam", $lParamType = "lparam", $sReturnType = "lresult")
Local $aResult = DllCall("user32.dll", $sReturnType, "SendMessageW", "hwnd", $hWnd, "uint", $iMsg, $wParamType, $wParam, $lParamType, $lParam)
If @error Then Return SetError(@error, @extended, "")
If $iReturn >= 0 And $iReturn <= 4 Then Return $aResult[$iReturn]
Return $aResult
EndFunc ;==>_SendMessage


SetupComplete.cmd пример с прогресс баром:

@echo off

call:progress 40
windows6.1-kb3177467-x64.msu /quiet /norestart
call:progress 50
windows6.1-kb3042058-x64.msu /quiet /norestart
call:progress 60
vcredist2005_x64.exe /q
call:progress 70
vcredist2005_x86.exe /q
call:progress 80
vcredist2008_x64.exe /q
call:progress 90
vcredist2008_x86.exe /q
call:progress 100

exit

:progress
set val=%~1
AutoIt3.exe progress.au3 %val%>nul 2>&1
exit /b

Можно автоматизировать прогресс, чтобы не вписывать числа самому, я например сделал так:

:progress
set /A val = %val% + 4
AutoIt3.exe progress.au3 %val%>nul 2>&1
exit /b

+4 потому, что у меня 25 программ которые ставятся, 100 / 25 = 4

ABBAT
28-05-2017, 15:53
Как прикрутить progress.au3 к win 8 ? Имеет ли значение разрядность системы ? (win32->AutoIt3.exe / win64->AutoIt3_x64.exe)

DuMakDuk
31-05-2017, 01:08
Не тестировал на Win8, для 7ки, берем win32->AutoIt3.exe. Не важно, что в install.wim, 32 или 64, берем всегда 32 разрядный autoit. Если не работает на 8ке, по мануалу выше, значит нужно отреверсить узнать какой контрол используется в инсталляторе 8ки, попробую поковырять под 8ку.

DuMakDuk
03-06-2017, 00:21
Не обязательно софт складывать в папке OEM, там все файлы копируются на hdd, лишнее движение, проще создать папку с именем %по вкусу% в корне и от туда выполнять инсталляцию.

Для этого в файле SetupComplete.cmd пишем так:

@echo off
:start
for %%i in (Z Y X W V U T S R Q P O N M L K J I H G F E D C) do if exist %%i:\update\e7bd5e04efc1fd404b92e404042f871a set UPDATEPATH=%%i:\update

if not defined UPDATEPATH (
call:MsgBoxQuestion
)

cd /d %UPDATEPATH%
call Install.cmd>nul
goto:end

:MsgBoxQuestion
for /f %%i in ('cscript //NoLogo msgbox.vbs') do set MsgBoxAnswer=%%i
if %MsgBoxAnswer% == 1 (
goto:start
) else (
goto:do_nothing
)

:end
start /min rd /s /q %windir%\Setup\Scripts>nul
start /min %windir%\System32\shutdown.exe -r -f -t 0
exit

:do_nothing
start rd /s /q %windir%\Setup\Scripts>nul
exit

в папке %CD%\update\
создаем файл e7bd5e04efc1fd404b92e404042f871a

Файл может быть любым, я в автосборщике делаю с каждым билдом новый такой файл.

Содержание файла msgbox.vbs (Нужен если пользователь вынул флешку или диск)

iBtn = Msgbox("Для продолжения установки подключите съемный носитель с установочными файлами Windows.", vbRetryCancel+vbInformation+vbSystemModal, "Настройка Windows")

If iBtn = 4 Then
WScript.Echo 1
Else
WScript.Echo 0
End If

Ну и собственно Install.cmd, тут пишем то, чего нужно поставить.

Еще рекомендую вот это для закручивания гаек в винде при установке.
https://blogs.technet.microsoft.com/secguide/2016/01/21/lgpo-exe-local-group-policy-object-utility-v1-0/
На чистой системе, под виртуалкой задаешь групповые политики и потом экспортируешь в файл *.pol и можно применять к другой машине через установку, либо вручную. Задавать политики напрямую через реестр, кривой способ, политики работать будут, но если их потом просматривать через mmc не будет видно, какие политики применены, да и вероятность того, что это может слететь вполне себе имеет место быть.

У себя сделал так:

LGPO.exe /m GPO.pol
call:progress_val 100

По поводу улучшения качества зондирования ПО (может пригодится)

for %%? in (
"\Microsoft\Windows\Application Experience\AitAgent"
"\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser"
"\Microsoft\Windows\Application Experience\ProgramDataUpdater"
"\Microsoft\Windows\Autochk\Proxy"
"\Microsoft\Windows\Customer Experience Improvement Program\Consolidator"
"\Microsoft\Windows\Customer Experience Improvement Program\KernelCeipTask"
"\Microsoft\Windows\Customer Experience Improvement Program\UsbCeip"
"\Microsoft\Windows\DiskDiagnostic\Microsoft-Windows-DiskDiagnosticDataCollector"
"\Microsoft\Windows\PI\Sqm-Tasks"
"\Microsoft\Windows\Power Efficiency Diagnostics\AnalyzeSystem"
"\Microsoft\Windows\Windows Error Reporting\QueueReporting"
"\Microsoft\Windows\Maintenance\WinSAT"
"\Microsoft\Windows\Media Center\ActivateWindowsSearch"
"\Microsoft\Windows\Media Center\ConfigureInternetTimeService"
"\Microsoft\Windows\Media Center\DispatchRecoveryTasks"
"\Microsoft\Windows\Media Center\ehDRMInit"
"\Microsoft\Windows\Media Center\InstallPlayReady"
"\Microsoft\Windows\Media Center\mcupdate"
"\Microsoft\Windows\Media Center\MediaCenterRecoveryTask"
"\Microsoft\Windows\Media Center\ObjectStoreRecoveryTask"
"\Microsoft\Windows\Media Center\OCURActivate"
"\Microsoft\Windows\Media Center\OCURDiscovery"
"\Microsoft\Windows\Media Center\PBDADiscovery"
"\Microsoft\Windows\Media Center\PBDADiscoveryW1"
"\Microsoft\Windows\Media Center\PBDADiscoveryW2"
"\Microsoft\Windows\Media Center\PvrRecoveryTask"
"\Microsoft\Windows\Media Center\PvrScheduleTask"
"\Microsoft\Windows\Media Center\RegisterSearch"
"\Microsoft\Windows\Media Center\ReindexSearchRoot"
"\Microsoft\Windows\Media Center\SqlLiteRecoveryTask"
"\Microsoft\Windows\Media Center\UpdateRecordPath"
) do call:disable_task %%?

:disable_task
set task_name=%~1
schtasks /Change /TN "%task_name%" /DISABLE>nul 2>&1
exit /b



Еще стоит обратить внимание на HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\CA\Certificates\FEE449EE0E3965A5246F000E87F DE2A065FD89D4
Если ставится NET, без некоторых обновлений винды (https://support.microsoft.com/en-us/help/2661254) на длину ключа, есть шанс в 0.000000001%, что похачат :)

Vadikan
03-06-2017, 13:37
По поводу улучшения качества зондирования ПО (может пригодится) »
И этим отключаем WinSAT, который выполняет оценку производительности после установки, а также убиваем диагностику эффективности электропитания.

DuMakDuk
06-06-2017, 02:06
Верно, просто брал из своего конфига, по моим религиозным соображениям эти вещи были отключены.

Iska
06-06-2017, 03:33
по моим религиозным соображениям »
Вот уж, точно — «ваистену» по «религиозным», бо пользуется не научный подход, а вера :).




© OSzone.net 2001-2012