▣중-고급자 활용/그게 궁금해?

[WSH] Windows Script Host 활용-Winrar (1)

횡재수 2008. 7. 23. 16:27




[WSH] Windows Script Host 활용
===========[ WSH 활용 예제 : Software RePakaging ]==========

유틸에 자신만의 추가 설정파일이나 보조 유틸 등을 추가 설치해서 사용하는 경우
윈도 설치할 때마다 매번 이런 설정을 다시 해주는게 번거로울 수 있습니다.
이럴 때 유용하게 사용할 수 있는 자동압축 풀림을 통한 소프트웨어 자동설치입니다.
Inno Setup 등의 Install 제작 유틸을 사용하는 방법도 있지만, 계속 추가 파일등이
업데이트되는 개인 사용자에게는 오히려 불편할 수도 있으므로 나중 추가로 변경,편집이
용이한 WinRAR 를 이용한 자동압축풀림 및 설치 패키지 제작법을 소개합니다.

* 준비물
1) WinRAR, InstallRite
2) 소프트웨어 파일
3) 레지스트리 파일( .reg)과 설치 스크립트( .vbs)


[1] InstallRite 를 이용한 파일 및 레지스트리 추출

1) InstallRite 설치

인터넷 검색을 통해 InstallRite를 다운받아 설치합니다. (freeware)
설치후 환경설정(Configure)에서 모니터링 디스크를 C: 만 지정하고, 모니터링 레지스트리
또한 HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE
세 개만 지정합니다. 그리고 Setup 모니터링 옵션의 체크를 해제합니다.

2) 유틸 설치 및 모니터링

"Create Manual Snapshot.." 을 눌러 유틸 설치 전의 SnapShot 을 만듭니다.
리패키징할 유틸을 설치하고, 자신에게 맞게 환경설정 및 추가 파일등을 설치합니다.
"Perform an Analysis of the Change..." 를 눌러 설치 후의 SnapShot 을 만듭니다.
"Preview Installation"을 눌러 어떤 변화가 있었는지 살펴봅니다.

3) 프로그램 파일 및 레지스트리 파일 추출

Preview 창에는 해당 Snapshot 메뉴 아래 File, INI, Registry 세 개의 하위트리가 있습니다.
먼저 File 창에서 프로그램 설치경로(Program Files-프로그램) 외에 C-Windows 나
C-Windows-system32 등의 다른 폴더에 설치된 파일이 있는지 살펴봅니다.
설치된 프로그램 파일과 기타 파일들을 적당한 곳에 복사합니다.

Registry 메뉴를 선택한 상태에서 레지스트리 내보내기 도구버튼을 눌러 레지파일을 생성합니다.
레지파일을 텍스트편집기로 열어 필요없는 항목들을 삭제합니다.


[2] 설치 스크립트 (install.vbs) 작성

----(예제)-----
Option Explicit

Dim Shell, FSO, LinkDir, ExeLink, UnLink

Set Shell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

If FSO.FolderExists("C:Program FilesEditPlus 2") Then
MsgBox "프로그램 폴더가 이미 존재합니다." & Chr(13) & Chr(13) & "프로그램을 제거하고
다시 설치하세요.", 0, "Folder Exist"
WScript.Quit
End If

FSO.CopyFolder "EditPlus 2", "C:Program FilesEditPlus 2"

LinkDir = Shell.SpecialFolders("Programs") & "EditPlus 2"
FSO.CreateFolder LinkDir

Set ExeLink = Shell.CreateShortcut(LinkDir & "EditPlus 2.12.lnk")
ExeLink.HotKey = "CTRL+SHIFT+E
ExeLink.TargetPath = "C:Program FilesEditPlus 2EditPlus.exe"
ExeLink.WorkingDirectory = "C:Program FilesEditPlus 2"
ExeLink.Save

Set UnLink = Shell.CreateShortcut(LinkDir & "Uninstall EditPlus 2.lnk")
UnLink.TargetPath = "C:Program FilesEditPlus 2remove.exe"
UnLink.Save

Shell.Run "regedit /s install.reg"

WScript.Quit

----(설명)-----
다른 것들은 생략하고.. 위 예제에서 보듯이 WSH 는 크게 두가지로 나뉩니다,
변수 선언과 선언된 변수를 써 먹는 것...
Dim 을 통해 이런 단어는 변수다라고 선언을 하고 아래에서 변수를 활용합니다.
선언된 변수를 쓸 때는 Set 을 붙이는 것과 안 붙이는게 있습니다,
Set 을 붙이는건 그 뒤에 Create.. 뭐라고 붙는게 보일텐데요..
뭔가를 생성하면 Set 을 붙이고 생성없이 단순히 이런 값을 가진다라고 정의만 해줄 때는
Set 을 붙이지 않습니다.
저도 자세히 몰라서 더 이상 설명하기가 곤란하구요..
그냥 Shell과 FSO 선언을 포함한 아래 형식을 고정된 틀로 이해하시면 편합니다.

Option Explicit

Dim 변수1, 변수2,...

Set wshShell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set wshNetwork = WScript.CreateObject("WScript.Network")

내용...

WScript.Quit


* 특수폴더 (SpecialFolders)
WSH에서는 몇몇 폴더들을 자체의 고유 단어로 정의를 할 수 있습니다.
가령 C:Documents and Settings계정명My Documents 폴더는
Shell.SpecialFolders("MyDocuments") 로 표현합니다.
내문서 폴더는 그 앞에 계정명에 따른 폴더명이 붙는데 이럴 경우 계정명이 달라지면 폴더명을
일일이 바꿔줘야하는 불편이 생깁니다. 특수폴더명으로 정의하면 이런 불편이 사라지죠..
(인터넷에서 SpecialFolders 로 검색해보면 자세한 도움말을 얻을 수 있습니다.)

* 예제
- 폴더 생성 : FSO.CreateFolder "폴더경로와 이름"
- 폴더 복사 : FSO.CopyFolder "원본 폴더경로와 이름" "대상 폴더경로와 이름"
- 폴더 존재여부 검사 : FSO.FolderExists "폴더경로와 이름"
- 바로가기 생성 : Shell.CreateShortcut "경로와 바로가기 이름... *.lnk"
- 프로그램 실행 : Shell.Run "프로그램의 위치와 실행파일 이름"

위 예제에서 약간 차이나는건 경로를 변수를 이용해 지정을 하고 실제 이용시에는
이 변수와 그 뒤의 경로를 괄호(변수 & "나머지 경로") 로 묶어서 지정한 것 정도입니다.

* 메시지 박스 : MsgBox "메시지", 버튼타입(옵션), "타이틀"(옵션)
=> 버튼 타입의 기본값은 0 으로 <확인>버튼이 뜹니다.


[3] 자동압축 풀림파일 생성

WinRAR 가 설치되어 있다는 가정하에..
프로그램 파일들과 install.vbs 그리고 install.reg 파일을 마우스로 모두 선택한 상태에서
마우스 오른쪽버튼을 눌러 "압축..."을 클릭합니다.
첫화면인 일반탭에서 "자동압축 풀림파일 생성"에 체크하고 설명문탭에서 아래의 스크립트를
직접 입력합니다.

;The comment below contains SFX script commands
Path=EditPlus 2
SavePath
Setup=install.vbs
TempMode
Silent=1
Overwrite=1

----(설명)-----

Path=프로그램이 설치될 폴더명 ( C-Program Files-프로그램명 )
SavePath
Setup=압축이 풀린 후 실행될 프로그램명
TempMode (임시폴더에 푼다)
Silent=1 ( 묻는거 없이 바로 압축풀림과 실행)
Overwrite=1 (같은 이름의 폴더나 파일 있으면 무조건 덮어쓰기)

여기서 주의할 건 프로그램 폴더에 바로 압축을 푸는게 아니라 임시폴더에 풀
어서
install.vbs 를 실행시켜 폴더를 Program Files 폴더로 복사한다는 것입니다.
복사와 실행이 끝나면 임시폴더는 자동으로 삭제됩니다.
물론 프로그램 폴더에 바로 풀어넣어도 됩니다.
(바로 풀어넣을 경우 install.vbs 의 폴더 복사하는 부분과 SFX script 의 TempMode 줄을
삭제해주면 됩니다.)


[4] 맺음말

간단한 소프트웨어 리패키징 방법이었습니다.
InstallRite 에서 레지파일 추출시 삭제할 부분들이나 WSH 에서 설치경로를 입력받아 사용자 정의
설치가 가능한 옵션 선택 기능등 좀 더 다양한 부분들에 대해서는 제 지식도 짧고해서 생략했습니다.
위 기능들을 보면 단순히 WinRAR 의 자체 자동풀림기능(바로가기 생성기능이 WinRAR에도 있음)과
별 차이가 없어 보이지만 기능을 사용자 입맛에 맞게 대폭 확장할 수 있다는 장점이 있습니다.
윈도 통합 설치 CD 만들어 포함시킬 때 주의할 점은 바로가기 생성에 특수폴더를 이용하는 것에서
볼 수 있듯이 계정이 생성된 후 실행시켜야 합니다. (설치 끝나고 재부팅 후..)

그리고 다들 아시겠지만, 파일이 추가된 경우 추가된 파일은 프로그램 자체 Uninstaller 가 실행되어도
삭제가 안됩니다. 삭제 스크립트를 만들어서 실험해봤는데...
제어판의 프로그램추가/삭제 에서는 레지스트리에 등록해도 vbs 파일이 실행이 안되데요^^
대신 시작메뉴에 바로가기를 만들어 실행시켯을 때는

vbs 파일이 포함된 폴더 자체도 삭제가 가능합니다.
아래에 간단한 삭제 스크립트를 예제로 올립니다.


----(uninstall.vbs)-----

Option Explicit

Dim Shell, FSO, LinkDir, DeskLink

Set Shell = WScript.CreateObject("WScript.Shell")
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

'에러가 있어도 계속 진행
On Error Resume Next

LinkDir = Shell.SpecialFolders("Programs") & "LeapFTP"
DeskLink = Shell.SpecialFolders("Desktop") & "LeapFTP.lnk"
If MsgBox ("LeapFTP 2.62 를 제거하시겠습니까?", 1) = 1 Then
Shell.RegDelete "HKCUSoftwareLeapWare"
FSO.DeleteFile DeskLink
FSO.DeleteFolder LinkDir
FSO.DeleteFolder("C:Program FilesLeapFTP")
End If

WScript.Quit

 

 

 

 

 

 

[WSH] Windows Script Host 활용-Winrar (2)