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

[WSH] Cabarc.exe 를 이용하여 CAB압축 파일 만들기

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



[WSH] Cabarc.exe 를 이용하여 CAB압축 파일 만들기

#. 개요

폴더위에서 마우스 오른쪽 버튼을 눌렀을 때 "CAB으로 압축" 이라는 메뉴가 뜨도록만들어 봅니다.
물론 이 경우 파일만 압축되는게 아니라 해당 폴더내의 하위 폴더들도 동시에 압축이
되도록하고, 압축이 풀릴 때도 경로를 기억해서 경로 그대로 풀리도록 합니다.

# 준비물

1. Cabarc.exe => 압푹 유틸(Microsoft)
2. shelladd.reg => 폴더에 대한 마우스 우클릭 메뉴 등록
3. makecab.vbs => 실행 제어 스크립트

[1] Cabarc.exe

Cabarc.exe 는 cab압축파일을 만들기위해 MS에서 제공하는 기본툴입니다.
윈도에서 기본으로 제공하는건 아니므로 시스템폴더(system32)에 이 파일이 없다면
Microsoft Cabinet Software Development Kit을 다운받아 설치하셔야 합니다.
cabsdk.exe

[2] shelladd.reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOTDirectoryshellCab_vbs]
@="CAB으로 압축"

[HKEY_CLASSES_ROOTDirectoryshellCab_vbscommand]
@="wscript.exe "c:\windows\system32\makecab.vbs" "%1
""


[3] makecab.vbs

Option Explicit

On Error Resume Next
Err.Clear
Dim Shell : Set Shell = WScript.CreateObject("WScript.Shell")
Dim FSO : Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

'-------------------------
' # cabarc.exe 있는지 검사
'-------------------------
Dim SysFolder : SysFolder = FSO.GetSpecialFolder(1) '
windowssystem32 폴더
If Not FSO.FileExists(SysFolder & "cabarc.exe") Then
WScript.Echo "cabarc.exe 파일을 찾을 수 없습니다." & vbCRLF & vbCRLF _
& "Microsoft Cabinet Software Development Kit (Cabsdk.exe)를 다운받아 설치하세요. "
WScript.Quit
End If

'------------------------------------
' # 대상 폴더가 올바르게 지정되었는지..
'------------------------------------
' 인자(Arguments)로 받은 폴더명 검사. (makecab.vbs 폴더1 폴더2 ...)
' 인자 갯수(대상폴더)는 항상 하나.. 따라서 1보다 크거나 작으면 에러.
' 대상 폴더로 objArgs(0), 즉 첫 인자로 지정되므로 인자갯수 검사는 굳이 할 필요없음.
Dim objArgs : Set objArgs = WScript.Arguments

If WScript.Arguments.Count <> 1 Then
WScript.Echo "대상폴더가 올바르게 지정되지 않았습니다. "
WScript.Quit
End If
Dim WorkPath : WorkPath = objArgs(0)

'---------------------------------
' # 대상 폴더 경로에서 상대경로 얻기
'---------------------------------
' 앞에 C: 를 제외한 경로를 얻는다. (아래 cabarc.exe 의 옵션과 관련)
' C:TEMPTESTCAB => TEMPTESTCAB
' PathArr(0) 는 C 가 되고, PathArr(1) 은 TEMPTESTCAB 이 된다.
' PathArr(1) 에 아무것도 없다는건 드라이브 폴더를 마우스 우클릭했다는 것.
Dim PathArr : PathArr = Split(WorkPath, ":", -1, 1)
Dim RelativePath : RelativePath = PathArr(1)
If RelativePath = vbNullString Then
WScript.Echo "드라이브 폴더는 대상폴더로 지정할 수 없습니다. "
WScript.Quit
End If

'-----------------------------
' # 저장위치, CAB파일 이름 지정
'-----------------------------
' 기본경로 : 대상폴더명을 그대로 이름으로사용해서 바로 위 폴더에 저장된다.
Dim ResultCab : ResultCab = InputBox("저장할 CAB파일의 이름을 지정하
세요. ", "save as..", WorkPath & ".cab")
If Len(Trim(ResultCab)) = 0 Then
WScript.Quit
End If

'--------------------
' # CAB 압축파일 생성
'--------------------
Shell.Run("cmd /c cabarc -r -p -P " & RelativePath & " n " & ResultCab & " " & WorkPath & "*.*"), 1, True

' [Cabarc.exe 옵션]
' -r => 하위 디렉토리 포함
' -p => 경로를 기억
' -P => -p 함께 사용 // -p 의 경로에서 뺄 부분을 지정.( 드라이브 절대경로 사용불가)

' 하위 폴더를 포함하여 CAB압축시 압축 해제시에도 경로가 그대로 유지되도록 하려면
' 경로 유지를 위해 소문자 p 옵션을 사용한다.
' 경로중 불필요한 앞머리 경로를 빼 버리려면 -P옵션을 같이 사용하여 빼버릴 부분을 지정해 줄 수 있다
' P 옵션사용시에는 드라이브 경로 (C:)는 쓸 수 없으며 마지막에 를 붙여줘야 한다.
' n 은 옵션이 아니라 새로운 cab파일 만든다는 명령어.

'---------------------------------------
' # 압축파일이 생성된 대상폴더를 열어준다.
'---------------------------------------
Dim ParentPath : ParentPath = FSO.GetParentFolderName(WorkPath)Shell.Run "explorer " & ParentPath

Set Shell = Nothing
Set FSO = Nothing

WScript.Quit


[4] 실습

텍스트 파일 2개 만들어 레지스트리 부분과 .vbs을 부분을 각각 복사하여 저장한 후
파일명을 shelladd.reg 과 makecab.vbs 로 바꿔준 후
reg 파일은 실행하여 병합하고, vbs 파일은 시스템폴더(system32) 에 넣어준다.
(시스템 폴더에 Cabarc.exe 가 있어야 한다.)

폴더위에서 마우스 오른쪽 버튼을 누르면 "CAB으로 압푹"이란 메뉴가 생기고
실행하면 대상 폴더의 하위 파일들과 폴더들이 압축된 .cab 파일로 만들어진다.

압축해제를 위한 메뉴도 만들 수 있습니다.
압축해제시에는 extrac32 /e /y "CabFile" 이라는 명령을 이용합니다.

=====================================================================
====================

##. 참고 : 폴더를 직접 지정하여 CAB 파일 만들기
아래 WSH 스트립트를 복사하여 텍스트 파일에 붙여넣은 후 MyCAB.vbs 이란 이름으로 바꾸고 실행.


Option Explicit

On Error Resume Next
Err.Clear

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


'-------------------------
' # cabarc.exe 있는지 검사
'-------------------------
Dim SysFolder : SysFolder = FSO.GetSpecialFolder(1)
If Not FSO.FileExists(SysFolder & "cabarc.exe") Then
WScript.Echo "cabarc.exe 파일을 찾을 수 없습니다." & vbCRLF &
vbCRLF _
& "Microsoft Cabinet Software Development Kit (Cabsdk.exe)를 다운받아
설치하세요. "
WScript.Quit
End If

'----------------------
' # 대상 폴더 선택창 열기
'----------------------
Dim WorkPath, objShell, objFolder, objFolderItem
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(0, "대상 폴더 선택", 0, "C:")
If objFolder is Nothing Then
Wscript.Quit
End If
Set objFolderItem = objFolder.Self
WorkPath = objFolderItem.Path

'---------------------------------
' # 대상 폴더 경로에서 상대경로 얻기
'---------------------------------
' 앞에 C: 제거 // C:TEMPTESTCAB => TEMPTESTCAB
Dim PathArr : PathArr = Split(WorkPath, ":", -1, 1)
Dim RelativePath : RelativePath = PathArr(1)
If RelativePath = vbNullString Then
WScript.Echo "드라이브 폴더는 대상폴더로 지정할 수 없습니다. "
WScript.Quit
End If

'-----------------------------
' # 저장위치, CAB파일 이름 지정
'-----------------------------
Dim ResultCab : ResultCab = InputBox("저장할 CAB파일의 이름을 지정하세요. ", "save as..", WorkPath & ".cab")
If Len(Trim(ResultCab)) = 0 Then
WScript.Quit
End If

'--------------------
' # CAB 압축파일 생성
'--------------------
Shell.Run("cmd /c cabarc -r -p -P " & RelativePath & " n " & ResultCab & " " & WorkPath & "*.*"), 1, True

'---------------------------------------
' # 압축파일이 생성된 대상폴더를 열어준다.
'---------------------------------------
Dim ParentPath : ParentPath = FSO.GetParentFolderName(WorkPath)Shell.Run "explorer " & ParentPath


Set Shell = Nothing
Set FSO = Nothing
Set objShell = Nothing
Set objFolder = Nothing
Set objFolderItem = Nothing

WScript.Quit