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
Когда в 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