registry — Windows 레지스트리 조작
registry — Windows 레지스트리 조작
Windows에서 시스템 설정과 프로그램 상태는 레지스트리라는 거대한 저장소에 보관돼요. registry 명령은 바로 그 Windows 레지스트리를 Tcl 스크립트에서 읽고 쓰고 지울 수 있게 해 주는 패키지예요. 다만 레지스트리를 망치면 시스템이 쓸 수 없게 될 수 있으니 주의해서 사용해야 해요.
출처: 문서
본문
문법
package require registry 1.3
registry ?-mode? option keyName ?arg arg ...?
registry 패키지는 Windows 레지스트리를 조작하기 위한 일반적인 연산 집합을 제공해요. 이 패키지는 registry Tcl 명령을 구현하는데, 이 명령은 Windows 플랫폼에서만 지원돼요. 경고: 망가진 레지스트리는 시스템을 사용 불가 상태로 만들 수 있으므로 주의해서 사용해야 해요.
keyName은 레지스트리 키의 이름이에요. 레지스트리 키는 다음 형태 중 하나여야 해요:
\\hostname\rootname\keypath
rootname\keypath
rootname
hostname은 레지스트리를 내보내는 유효한 Windows 호스트의 이름을 지정해요. rootname 구성 요소는 HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG, HKEY_PERFORMANCE_DATA, HKEY_DYN_DATA 중 하나여야 해요. keypath는 백슬래시(\) 문자로 구분된 하나 이상의 레지스트리 키 이름일 수 있어요.
선택적 -mode 인자는 어느 레지스트리를 대상으로 할지 나타내요. -32bit면 32비트 레지스트리, -64bit면 64비트 레지스트리를 사용해요. 이 인자를 생략하면 시스템의 기본 레지스트리가 대상이 돼요.
option은 레지스트리 키 이름으로 무엇을 할지 나타내요. option의 고유한 약어는 모두 허용돼요. 유효한 옵션은:
registry broadcast keyName ?-timeout milliseconds? — 시스템과 실행 중인 프로그램에 브로드캐스트 메시지를 보내 특정 갱신을 알려요. Environment 같은 핵심 레지스트리 키의 변경 사항을 전파하는 데 필요해요. timeout은 브로드캐스트 메시지에 애플리케이션이 응답할 때까지 기다릴 시간을 밀리초로 지정하며 기본값은 3000이에요. 다음 예제는 전역 Environment에 경로를 추가하고 로그오프/로그온 단계 없이 애플리케이션에 변경을 알리는 방법을 보여줘요 (관리자 권한 가정):
set regPath [join {
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
Control
{Session Manager}
Environment
} "\\"]
set curPath [registry get $regPath "Path"]
registry set $regPath "Path" "$curPath;$addPath"
registry broadcast "Environment"
registry delete keyName ?valueName? — 선택적 valueName 인자가 있으면 keyName 아래의 지정된 값을 레지스트리에서 삭제해요. 생략하면 지정된 키와 그 아래 레지스트리 계층의 모든 하위 키나 값을 삭제해요. 키를 삭제할 수 없으면 오류가 발생하고, 키가 존재하지 않았다면 명령은 아무 효과가 없어요.
registry get keyName valueName — 키 keyName 아래의 값 valueName과 연관된 데이터를 반환해요. 키나 값이 없으면 오류가 발생해요. 반환 데이터 형식에 대한 자세한 내용은 SUPPORTED TYPES를 참고하세요.
registry keys keyName ?pattern? — pattern이 지정되지 않으면 keyName의 모든 하위 키 이름 리스트를 반환해요. pattern이 지정되면 그 패턴과 일치하는 이름만 반환하며, string match와 같은 규칙으로 판정해요. 키가 없으면 오류가 발생해요.
registry set keyName ?valueName data ?type?? — valueName이 없으면 keyName 키가 없을 때 생성해요. valueName이 있으면 필요 시 keyName 키와 valueName 값을 생성해요. valueName의 내용을 type이 나타내는 타입으로 data로 설정해요. type이 없으면 sz 타입으로 간주해요.
registry type keyName valueName — 키 keyName에서 값 valueName의 타입을 반환해요.
registry values keyName ?pattern? — pattern이 없으면 keyName의 모든 값 이름 리스트를 반환해요. pattern이 있으면 그와 일치하는 이름만 반환해요 (string match 규칙 사용).
지원되는 타입(SUPPORTED TYPES)
레지스트리의 키 아래 각 값은 특정 타입의 데이터를 타입별 표현으로 포함해요. registry 명령은 이 내부 표현과 Tcl 스크립트가 조작할 수 있는 표현 사이를 변환해요. 대부분의 경우 데이터는 단순히 Tcl 문자열로 반환돼요. 타입은 데이터의 의도된 용도를 나타내지만 실제로 표현을 바꾸지는 않아요. 일부 타입의 경우 registry 명령이 조작하기 쉽도록 다른 형태로 데이터를 반환해요. 다음 타입들이 인식돼요:
binary— 임의의 이진 데이터. 포함된 null 포함, 정확히 Tcl로 표현돼요.none— 정의된 타입이 없는 임의의 이진 데이터. 정확히 Tcl로 표현돼요.sz— null 종료 문자열. Tcl에서 문자열로 표현돼요.expand_sz— 보통 Windows 스타일로 환경 변수를 참조하는 확장되지 않은 문자열(예:"%PATH%"). Tcl에서 문자열로 표현돼요.dword— 리틀 엔디언 32비트 숫자. Tcl에서 십진 문자열로 표현돼요.dword_big_endian— 빅 엔디언 32비트 숫자. Tcl에서 십진 문자열로 표현돼요.link— 심볼릭 링크. 정확히 Tcl로 표현돼요(null 포함).multi_sz— null 종료 문자열의 배열. Tcl에서 문자열 리스트로 표현돼요.resource_list— 장치 드라이버 리소스 리스트. 정확히 Tcl로 표현돼요(null 포함).
위의 기호 이름 타입들 외에, 알 수 없는 타입은 시스템 인터페이스가 반환하는 타입 코드에 대응하는 32비트 정수로 식별돼요. 이 경우 데이터는 null 포함, 정확히 Tcl로 표현돼요.
이식성 문제(PORTABILITY ISSUES)
registry 명령은 Windows에서만 사용할 수 있어요.
예제
Tcl 스크립트 파일을 더블클릭하면 Tcl 인터프리터가 어떻게 호출되는지 출력하기:
package require registry
set ext .tcl
# 타입 이름 읽기
set type [registry get HKEY_CLASSES_ROOT\\$ext {}]
# 명령을 어디서 찾을지 파악
set path HKEY_CLASSES_ROOT\\$type\\Shell\\Open\\command
# 명령 읽기!
set command [registry get $path {}]
puts "$ext opens with $command"
더 알아보기
이 명령은 Windows 전용이므로 기본적으로 Windows 레지스트리에 대한 Tcl 인터페이스 자체가 전부예요. 다만 키워드 관점에서 registry가 핵심 주제예요.