소프트웨어 설치 프로그램 자동화 관련 질문 드립니다.
2023.06.19 09:14
안녕하세요? 더운 날씨에 노고가 많으십니다.
현재 autoit 프로그램으로 프로그램 자동화를 어느정도 작업을 해두었습니다.
하지만 PC가 조금 느리거나 버벅이는 경우 지정해둔 시간이 지나면 프로그램 설치 진행이 되지 않아 이 부분에 약간의 고민이 있습니다.
좀 더 발전을 하고싶어 백그라운드 상태에서 설치 과정(다음, 동의 등등)을 전부 자동화 하여 완료되어 프로세서 종료되는 것 까지 하려합니다.
구글링을 해보고 여러가지 참고를 하며 NSIS라는 프로그램도 알게되어 시도를 했지만... 도무지 모르겠더라구요.
참고할만한 사이트나 예시 또는 더 좋은 프로그램이 있다면 알고싶습니다.
감사합니다.
댓글 [8]
-
빨강모자 2023.06.19 10:41 -
마집사 2023.06.20 18:57
감사합니다. 참고해서 시험해보겠습니다!
-
메리아 2023.06.19 11:22
딱히 프로그램을 바꾼다고 해결될 문제는 아닐겁니다.
아무래도 대화창이 있기 때문에 백그라운드 설치는 좀 무리일듯하구요,
저도 그런 부분에 같은 고민이 있긴 합니다.
일단 제가 쓰는 방식으로 작성한 것을 올려드리겠습니다.
샤나 인코더 자동설치용 au3파일들입니다.
(기존 파일이 틀렸기에 삭제합니다)
설치가 진행되는 과정에는 오래 걸릴 수 있어 저는 파일을 2개로 분리했습니다만
꼭 분리 안해도 될거 같긴하니까 적당히 보시고 합치는 방식으로 처리하셔도 될거 같습니다.
문제의 핵심은 "클릭버튼 눌렀는데 다음으로 안넘어가더라" 이거거든요.
근데 이걸 판별하는게 의외로 쉽지 않습니다.
"설치과정 중 나타나는 모든 창의 상태를 판별해야한다"는 문제점이 남습니다.
그래서 제가 해결한 방식은 걍 "처음부터 여러번 반복한다"입니다.
어차피 "정확한 창 상태일때가 아니면 아무것도 안하니까" 아예 빠르게 설치하게 만들면서 여러번 하는게 낫겠더라구요.
일단 첫번째 진행으로 성공하면 베스트인데, 안되면 두번 세번 진행하는거죠.
그래서 맨 앞에 최초진행과 진행완료 등을 구분할 구문을 넣습니다.
최초 진행이면 그대로 진행될거고, 진행완료면 바로 중단(Exit, 제 경우에는 설치시작파트와 완료파트를 au3파일을 분리했기 때문에 종료. 합칠거면 break, ExitLoop 종류로 중단 필요),
중간에 어디선가 멈췄으면 반복 진행중에 걸리는게 있으면 바로 이어서 처리 되는 방식입니다.
이를 위해서는 다 다른 상태의 창을 동시에 확인을 해서 하나라도 걸리면 넘어가도록 해야하는데
오토잇은 물론 비슷한류의 프로그램들도 해당 함수는 존재하지 않습니다.
그래서 코드로 동시에 체크하는 것처럼 구현을 해야합니다.
또한 모든걸 체크하는건 또 어렵고, 시작,진행,종료 이 세가지만 구분해서 반복시키는게 작성이 더 편합니다.
설명이 복잡해서 이해가 가기 어려우실 수는 있으나, 일단 코드를 보시면서 분석해서 이해하시는 수 밖에는 도리가 없을거 같네요.
아래는 코드의 일부입니다.
(코드가 틀렸기에 삭제합니다. 대댓글을 참고해주세요.)
; 전체를 3회 반복$iLoop1 = 0While $iLoop1 <= 3$iLoop1 += 1; 약 30초간 시작,완료,진행중인 창 상태를 체크함(WinWait가 각 1초씩 소요); 30초를 다 쓰는게 아니라 최대 대기 맥시멈 30초라는것. 최초 실행이 아무리 느려도 30초 안에는 될것임.; 최초 실행을 위한 대기가 30초이며, 나머지는 1~2초 만에 확인될 부분.While $iLoop2 <= 10 ; 3개 30초$iLoop2 += 1$wait_ret1 = WinWait("Installer Language", "Please select a language", 1)$wait_ret2 = WinWait("샤나인코더", "설치가 완료되었습니다", 1)$wait_ret3 = WinWait("샤나인코더", "설치하는 동안 잠시 기다려 주세요", 1)If $wait_ret1 <> 0 Or $wait_ret2 <> 0 Or $wait_ret3 <> 0 Then ExitLoopWEnd; ret3이면 다음 설치 파일로 넘어가기 위해 종료,; ret2이면 아예 모두 끝난 상황이니 종료.(다음파일로 넘어가서도 완료 버튼 누르고 즉시 종료될 예정)If $wait_ret2 <> 0 Or $wait_ret3 <> 0 Then; 설치중이거나 설치완료면 다음 작업으로ExitEndIf; ret1과 ret2, ret3 모두 0이면 30초간 아무것도 안떴다는 뜻이므로 아예 문제가 된 상황이라 중단; (이 시점에서는 ret2만 체크해도 ret3 또한 0이기 때문에 ret3검사는 안함. 원칙적으로는 같이 해야함)If $wait_ret1 = 0 And $wait_ret2 = 0 Then; 설치창이 없으면 즉시 종료$ret = MsgBox($MB_OK, "오토잇 실행 중", "샤나인코더 설치창이 없어서 오토잇 종료" & @CRLF & "(5초후에 확인창 닫음, 다음작업 수행예정)", 5)ExitEndIf; 통상의 설치작업....WEnd어째 설명할수록 더 복잡해지는거 같네요. ㅠㅠ
그래도 위의 방식으로하면 엔간하면 "통상의 설치작업"에 해당하는 부분에 기존 코드를 복붙만 해도 사용할 수 있습니다.
(다만 기존 코드부분에서 아예 대기시간을 짧게 만들어둬야 불필요한 장기진행을 막을 수 있습니다. 반복형이라 그렇게해도 결국엔 완료는 될겁니다만, 워낙 느리기 때문에 그냥 빠르게 단계마다 1~5초 사이로 지정해두고 전체 반복횟수를 늘리는게 낫습니다.)
아무튼 저는 이 방식으로 진행버튼 클릭 지연에 의해서 설치가 멈추는 문제를 극복했습니다.
혹시 모르니 가상머신에서 실험해보세요.
(파일이 좀 통일성이 없거나 불필요해 보이는 부분이 있을 수 있으나
저도 개발중에 어떤건 추가하고 어떤건 빼고 하면서 생긴 부분이라 깔끔하게 수정하긴 좀 어렵네요. ㅠㅠ
지연에 의한 중단 문제를 처리하는 핵심은 댓글에 써놓은 부분이니 그쪽만 잘 참고하시면 될듯합니다.)
-
메리아 2023.06.19 12:16
사과 드려야겠네요.
지금 쓰면서 분석해보니 정상동작할 수 없는 구문입니다.
저는 이걸로 설치실패한 적이 없어서 문제 없다고 생각했는데, 왜 실패가 안됐는지 모르겠네요.
분명 지연상황 발생시에도 문제가 없었는데....
새로 구성해서 올립니다.
; 실행 최초에는 30초 기다림. 물론 맥시멈이며, 보이는 순간 다음으로 넘어감.
$wait_ret1 = WinWait("Installer Language", "Please select a language", 30)
If $wait_ret1 = 0 Then
; 설치창이 없으면 즉시 종료
$ret = MsgBox($MB_OK, "오토잇 실행 중", "샤나인코더 설치창이 없어서 오토잇 종료" & @CRLF & "(5초후에 확인창 닫음, 다음작업 수행예정)", 5)
Exit
EndIf
; 전체를 5회 반복 - 필요에 따라 조정
$iLoop1 = 0
While $iLoop1 < 5
$iLoop1 += 1
; 기존과 동일하게 시작,설치진행(오래걸리는 구간),설치완료를 체크
$iLoop2 = 0
While $iLoop2 < 3 ; 각 3초씩 3번으로, 그냥 맥시멈 9초만 기다림. 필요에 따라 조정
$iLoop2 += 1
$wait_ret1 = WinWait("Installer Language", "Please select a language", 1)
$wait_ret2 = WinWait("샤나인코더", "설치가 완료되었습니다", 1)
$wait_ret3 = WinWait("샤나인코더", "설치하는 동안 잠시 기다려 주세요", 1)
If $wait_ret1 <> 0 Or $wait_ret2 <> 0 Or $wait_ret3 <> 0 Then ExitLoop
WEnd
; ret3이면 다음 설치 파일로 넘어가기 위해 종료,
; ret2이면 아예 모두 끝난 상황이니 종료.(다음파일로 넘어가서도 완료 버튼 누르고 즉시 종료될 예정)
If $wait_ret2 <> 0 Or $wait_ret3 <> 0 Then
; 설치중이거나 설치완료면 다음 작업으로
Exit
EndIf
; 통상의 설치작업
....
WEnd
잘못된 구문을 빼고 수정했습니다.
이거면 아마 되리라 생각되는데,
또 뭔가 착각한게 있을지 모르겠네요.
제대로된 검토없이 올려서 혼란을 드려 죄송합니다.
(이거도 검토를 잘 해야하는데, 일단 더 생각해봐도 맞는거 같아서 올립니다만,
문제가 있으면 지적해주세요.)
(AutoIt) 샤나인코더 설치 2 종료_wait.au3
-
메리아 2023.06.19 13:02
위에 새로 올린 코드로 실험해본 결과
강제로 뒤로 가는 버튼도 누르면서 설치를 방해도 해보고 했으나 결국 설치에 성공했습니다.
(새 코드는 되고, 기존코드는 역시 안되는군요. 역시 그동안 잘 됐던건 단지 운이 좋았네요.
기존 코드는 컨셉 자체는 맞지만, 구성을 잘못했네요....)
참고로 역시 새 코드도 상대적으로 지연이 커서, 타이밍이나 반복횟수를 아래와 같이 조정해봤습니다.
While $iLoop1 < 5
->
While $iLoop1 < 10
While $iLoop2 < 3 ; 각 3초씩 3번으로, 그냥 맥시멈 9초만 기다림. 필요에 따라 조정
->
While $iLoop2 < 1 ; 각 3초씩 1번으로, 그냥 맥시멈 3초만 기다림. 필요에 따라 조정
$wait_ret = WinWait("샤나인코더", "설치를 시작합니다", 5)
->
$wait_ret = WinWait("샤나인코더", "설치를 시작합니다", 2)
2차코드는 방해를 하고 나서 다시 이어서 되는게 좀 느립니다만
위와같이 조정한 코드는 훨씬 빠릅니다.
(참고로 5 -> 2 로 고친부분은 5 -> 1로 해보았으나 너무 짧아서 건너 뛰는게 생겨서
다시 처음으로 돌아가야하니 오히려 지연이 더 커져서 2초로 늘렸습니다)
시간 조정한 3차코드를 올립니다만,
속도를 위한 조정이므로 참고만 해보시는 정도로 쓰시면 되겠습니다.
(사실 뭐 3차 타이밍으로 쓰면 엔간하면 다 될거 같습니다.)
(AutoIt) 샤나인코더 설치 1 시작_speedup_1.au3
아, 그리고 앞에 설명을 빠뜨린게 있는데요
au3파일을 시작 / 종료 2개로 나눈 이유를 제대로 설명안했는데
제가 할때는 시작 파일을 여러개를 한꺼번에 실행시킵니다.
예를들어 프로그램 3개를 설치한다면 배치파일에서
프로그램1_시작.au3
프로그램2_시작.au3
프로그램3_시작.au3
wait 20초
프로그램1_종료.au3
프로그램2_종료.au3
프로그램3_종료.au3
(au3는 실제로는 컴파일된 exe입니다)이런식으로 설치합니다. 이걸 위해 시작과 종료를 나눈겁니다.
중간에 몇분씩 설치하는 구간 때문에 전반적으로 지연되거든요.
다만 동시설치가 더 문제가 있을 가능성은 있으므로, 설치프로그램간 궁합도 생각해야합니다.
그래도 나눠놓으면 따로 배치파일상에서 적당히 조정하기는 좋죠.
-
마집사 2023.06.20 18:57
감사합니다! 참고하여 진행해보겠습니다!
-
무월 2023.06.19 12:16
설치할 프로그램이 뭔지 적어두는 게 답이 빠를 것 같습니다?
-
마집사 2023.06.20 18:58
프로그램이 워낙 여러가지라... 그리고 내부적으로 사용되는 보안 프로그램이라 올리기가 어렵습니다. 죄송합니다.
의견입니다....... 참고만 하십시요...
설치자동화든 다른 부문이던지간에 각각의 프로세싱의 시간이 차이가 남니다.
즉 구형 컴퓨터와 신형 컴퓨터의 처리속도와 HDD SSD의 속도가 다르다보니 발생되는 일인듯합니다.
모자의 경우 *******wait 또는 sleep() 를 중간중간에 사용하여 적절한 시간을 조절하곤 합니다.
- ***wait 의 경우 프로세싱이 끝날때까지 메인창이 비활성되는데 기준은 작업관리자의 PID가 발생될때까지이므로
이보다 더 필요한 시간이 필요하다는 판단이라면 sleep()를 이용하여 유지지속시간을 늘려볼 수 있을듯합니다.
- 다른 방안도 물론 무수할 정도로 많겠지만 자신의 코딩 방향과 기획과 소기의 목적에 따라서 각기 다른 코딩을 하게 되므로
이것이 답이다 라는 말씀을 드리지는 못합니다.
그러나 참고가 될만하거나 시도해 볼만한 방법으로 답은 없지만 필적하여 봅니다.
좋은 결과가 있기를 함께 희망합니다... 꾸벅~~
#1
Dim $iMsgBoxAnswer
$iMsgBoxAnswer = MsgBox(262212,"확인","12324")
Select
Case $iMsgBoxAnswer = 6 ;Yes
; 사용자코드
Case $iMsgBoxAnswer = 7 ;No
; 사용자코드
EndSelect
#2
각 프로세서마다 @error 을 판단 또는 지정하여 연구개발자의 의도대로 진행이 되도록 오류값을 조절.
#3
프로그램마다 열리는 질문 또는 확인창의 건.
불가피 할 경우 키보드 키의 전송으로 제어도 가능합니다.
즉 모자의 경우 메시지 반자동 발송기의 예를 본다면
-> 쪽지보내기 창이 열린 후 창제목을 확인하기 위하여 열린창을 최상위로 임시 변경합니다.
-> 최상위창이므로 키의 입력은 직접적으로 창에서 동작을 합니다. ( 동작 기준점. )
-> 키의 누름으로 원하는 위치로의 이동값 또는 횟수를 기록하여 활용
-> 1차 목적이 도달 후 사용자 컨트롤 지정 (예: 제목항을 복사하여 쪽지보내기 창에 그대로 붙이기 ) 합니다.
이때 창의 포커스가 알맞게 변경되어야만 합니다.
결과적으로 쪽지보내기 창이 열리고 탭키를 두번누르면 제목에 커서가 대기상태가 됨니다.
이 상태에서 메인 프로그램에서 제목항을 클립보드로 복사한 후 창포커스를 이동시킨 후
쪽지보내기창의 제목란에 붙여넣기 ( ^ V : Ctrl + V ) 라는 키를 전송합니다.
이렇게하면 번거롭기는 하지만 정확하게 프로그램에서 선택한 제목이 쪽지보내기창의 제목란에
복붙이 정상적으로 이루어지게 됨니다. 즉 중요한 점은 창의 포커스를 꼭 필요한 싯점에서 이동해 두어야 편리합니다.
#4
프로그램 설치의 경우 해당 프로그램이 silent 옵션을 정상적으로 인식하여 동작을 한다면
이를 적극적으로 활용하되 이후의 옵션 -y 또는 -n ( : 모든 질문에 NO 아니오 를 선택하라는 명령옵션 ) 등
필요한 옵션을 인지하신 후 활용하시는 편이 가장 편리하고 안전한 방법인듯합니다.
#5
자동풀림 압축으로의 설치부문.........................
연구개발자가 자동풀림압축 또는 단일파일로의 제작 지원이 가능하다면 이를 메인 프로그램과 연동 활용도 고려사안이라고 사료됨.
#6
변수의 선언과 활용
전역인지 일부분인지의 결정과 이에 대한 선언을 우선하여 변동되는 값에 즉시 대응하도록
변수의 관리가 가장 중요하다고 사료됨니다.
내용을 확인하다보니 ( 내용 일부 )
; 전체를 5회 반복 - 필요에 따라 조정
$iLoop1 = 0
While $iLoop1 < 5
$iLoop1 += 1
라는 구문으로 프로세싱의 시간을 조절하시거나 카운트를 통한 조건을 생성하시는 듯 합니다.
제 경우에는
If @error = 0 Then
MsgBox(262208,"결과확인","정상실행이 되었습니다." & @error , 20)
ElseIF @error = 1 Then
MsgBox(262160,"경고알림","정상적이지 않습니다. 오류코드를 재확인하세요" & @error , 20)
Exit
Endif
라는 구문 또는 ConsoleWrite 를 통하여 매 분기점 또는 하나의 구문실행 후 반드시
오류코드를 확인하여 각기의 오류에 대해 다음의 진행을 점검합니다.
해당 샤나 인코더를 전혀 사용하지 않기에 알 수 없어 진행이 안되어 통상적인 경험의 일부를 기록남김니다.
답은 아님니다. 최고이거나 최선도 아님니다. 단지 지나가는 참고용 필적입니다.
평온하십시요,.............꾸벅~~