이 글은 도움말을 번역한 글입니다.
WshShell 개체
기본 Windows 쉘에 대한 액세스를 제공합니다.
비고
프로그램을 로컬로 실행하거나 레지스트로의 내용을 관리하거나 바로 가기를 만들거나 시스템 폴더에 액세스할 때는 항상 WhsShell 개체를 만듭니다.WshShell 개체는 Environment 컬렉션을 제공합니다.
이 컬렉션을 사용하여 WINDIR,PATH 또는 PROMPT와 같은 환경 변수를 처리할 수 있습니다.
다음 코드는 현재 실행 중인 엑셀 문서에 대한 바로 가기를 바탕 화면에 생성하는 코드입니다
Option Explicit
Dim WshShell As Object ' 모듈 수준 변수로 WshShell 선언
Sub CreateShortcut()
Dim strDesktop As String
Dim strShortcutPath As String
' 바탕 화면 경로 얻기
strDesktop = GetDesktopPath
' 바로 가기 파일 경로 설정
strShortcutPath = strDesktop & "\Shortcut Script.lnk"
' 바로 가기 생성
CreateShortcutToWorkbook ThisWorkbook, strShortcutPath
End Sub
Function GetDesktopPath() As String
If WshShell Is Nothing Then
Set WshShell = CreateObject("WScript.Shell")
Else
End If
GetDesktopPath = WshShell.SpecialFolders("Desktop")
End Function
Sub CreateShortcutToWorkbook(ByVal targetWorkbook As Workbook, ByVal shortcutPath As String)
Dim oShellLink As Object
' 바로 가기 개체 생성
Set oShellLink = WshShell.CreateShortcut(shortcutPath)
' 바로 가기 속성 설정
With oShellLink
.targetPath = targetWorkbook.FullName
.WindowStyle = 1
.Hotkey = "CTRL+SHIFT+F"
.IconLocation = "notepad.exe, 0"
.Description = "Shortcut Script"
.WorkingDirectory = GetDesktopPath()
.Save
End With
' 개체 해제
Set oShellLink = Nothing
End Sub
속성
CurrentDirectory Property
현재 활성 디렉터리를 검색하거나 변경합니다.
Syntax
object.CurrentDirectory
object : WshShell 개체입니다.
주의
CurrentDirectory는 활성 프로세스에서 현재 작업 디렉터리의 정식 경로가 들어 있는 문자열을 반환합니다.
아래 코드는 현재 활성 디렉터리를 표시합니다.
Sub GetWorkingDirectory()
Dim WshShell As Object
Dim currentDir As String
' WScript.Shell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' 현재 작업 디렉터리 가져오기
currentDir = WshShell.CurrentDirectory
' 결과 출력
MsgBox "Current Working Directory: " & currentDir, vbInformation, "Working Directory"
' WshShell 개체 해제
Set WshShell = Nothing
End Sub
Environment Property
WshEnvironment 개체(환경 변수 컬렉션)를 반환합니다.
Syntax
object.Environment ([strType])
object : WshShell 개체입니다.
strType : 선택적인 요소. 환경 변수의 위치를 지정합니다.
주의
Environment 속성에는 WshEnvironment 개체(환경 변수 컬렉션)가 들어 있습니다. strType를 제공하면 System, User, Volatile 또는 Process 등 가능한 값으로 환경 변수가 상주하는 위치를 지정합니다. strType를 제공하지 않으면 Environment 속성은 운영 체제에 따라 다른 환경 변수 형식을 반환합니다.
참고 Windows 95/98/Me의 경우 strType에 Process만 지원됩니다.
다음 코드는 시스템 환경 변수를 가져옵니다.
Sub TestEnvironment()
Dim envValue As String
' 시스템 환경 변수 "USERNAME"의 값을 가져옴
envValue = GetSystemEnvironmentVariable("USERNAME")
' 결과 출력
MsgBox "사용자 이름 (USERNAME): " & envValue, vbInformation, "시스템 환경 변수"
End Sub
Function GetSystemEnvironmentVariable(ByVal variableName As String) As String
Dim wshShell As Object
Dim env As Object
' WScript.Shell 개체 생성
Set wshShell = CreateObject("WScript.Shell")
' Environment 속성을 사용하여 시스템 환경 변수 가져오기
Set env = wshShell.Environment("System")
' 변수 이름을 사용하여 환경 변수 값 가져오기
GetSystemEnvironmentVariable = env(variableName)
' 개체 해제
Set env = Nothing
Set wshShell = Nothing
End Function
다음 코드는 시스템, 사용자 및 프로세스 환경 변수의 이름을 출력합니다.
Sub ShowEnvironmentVariableNames()
Dim sysVarNames As Object
Dim userVarNames As Object
Dim processVarNames As Object
Set sysVarNames = GetEnvironmentVariableNamesByCategory("System")
Set userVarNames = GetEnvironmentVariableNamesByCategory("User")
Set processVarNames = GetEnvironmentVariableNamesByCategory("Process")
Debug.Print "System Environment Variable Names:"
PrintStringDictionary sysVarNames
Debug.Print ""
Debug.Print "User Environment Variable Names:"
PrintStringDictionary userVarNames
Debug.Print ""
Debug.Print "Process Environment Variable Names:"
PrintStringDictionary processVarNames
End Sub
Function GetEnvironmentVariableNamesByCategory(category As String) As Object
Dim wsh As Object
Dim envVars As Object
Dim envVar As Variant
Dim envVarSplit() As String
Dim result As Object
Dim keyIndex As Integer
Set wsh = CreateObject("WScript.Shell")
Set envVars = wsh.Environment(category)
Set result = CreateObject("Scripting.Dictionary")
keyIndex = 1
For Each envVar In envVars
envVarSplit = Split(envVar, "=")
result.Add keyIndex, envVarSplit(0)
keyIndex = keyIndex + 1
Next envVar
Set envVars = Nothing
Set wsh = Nothing
Set GetEnvironmentVariableNamesByCategory = result
End Function
Sub PrintStringDictionary(dict As Object)
Dim key As Variant
For Each key In dict.Keys
Debug.Print dict(key)
Next key
End Sub
다음 코드는 시스템, 사용자 및 프로세스 환경 변수의 이름과 값을 출력합니다.
Sub ShowEnvironmentVariableNamesAndValues()
Dim sysVarNamesAndValues As Object
Dim userVarNamesAndValues As Object
Dim processVarNamesAndValues As Object
Set sysVarNamesAndValues = GetEnvironmentVariableNamesAndValuesByCategory("System")
Set userVarNamesAndValues = GetEnvironmentVariableNamesAndValuesByCategory("User")
Set processVarNamesAndValues = GetEnvironmentVariableNamesAndValuesByCategory("Process")
Debug.Print "System Environment Variable Names and Values:"
PrintStringDictionary sysVarNamesAndValues
Debug.Print ""
Debug.Print "User Environment Variable Names and Values:"
PrintStringDictionary userVarNamesAndValues
Debug.Print ""
Debug.Print "Process Environment Variable Names and Values:"
PrintStringDictionary processVarNamesAndValues
End Sub
Function GetEnvironmentVariableNamesAndValuesByCategory(category As String) As Object
Dim wsh As Object
Dim envVars As Object
Dim envVar As Variant
Dim envVarSplit() As String
Dim result As Object
Set wsh = CreateObject("WScript.Shell")
Set envVars = wsh.Environment(category)
Set result = CreateObject("Scripting.Dictionary")
For Each envVar In envVars
envVarSplit = Split(envVar, "=")
If envVarSplit(0) <> "" Then
result.Add envVarSplit(0), envVarSplit(1)
Else
End If
Next envVar
Set envVars = Nothing
Set wsh = Nothing
Set GetEnvironmentVariableNamesAndValuesByCategory = result
End Function
Sub PrintStringDictionary(dict As Object)
Dim key As Variant
For Each key In dict.Keys
Debug.Print key & ": " & dict(key)
Next key
End Sub
SpecialFolders Property
SpecialFolders 개체(특수 폴더 컬렉션)를 반환합니다.
Syntax
object.SpecialFolders(objWshSpecialFolders)
object : WshShell 개체입니다.
objWshSpecialFolders : 특수 폴더의 이름입니다.
주의
WshSpecialFolders 개체는 컬렉션으로 바탕 화면 폴더, 시작 메뉴 폴더 및 개인 문서 폴더와 같은 Windows 특수 폴더의 전체 집합을 포함합니다. 특수 폴더 이름은 원하는 특수 폴더를 검색하기 위해 컬렉션으로 색인화할 때 사용됩니다.
SpecialFolders 속성은 요청된 폴더(strFolderName)를 사용할 수 없으면 빈 문자열을 반환합니다. 예를 들어, Windows 95에는 AllUsersDesktop 폴더가 없으므로strFolderName이 AllUsersDesktop이면 빈 문자열을 반환합니다.
아래와 같은 특수 폴더를 사용할 수 있습니다.
아래 예제는 SpecialFolders 속성의 사용을 보여줍니다.
Sub ShowSpecialFolders()
Dim wshShell As Object
Set wshShell = CreateObject("WScript.Shell")
Debug.Print "Desktop folder: " & wshShell.SpecialFolders("Desktop")
Debug.Print "My Documents folder: " & wshShell.SpecialFolders("MyDocuments")
Debug.Print "Application Data folder: " & wshShell.SpecialFolders("AppData")
Set wshShell = Nothing
End Sub
"Desktop"대신 변수이름으로 하면 올바른 값이 나오질 않습니다.
검색을 해보니 상수로 대신합니다.
상수를 사용하는 예는 대략 다음과 같습니다.
Enum SpecialFolder
AllUsersDesktop = 0
AllUsersStartMenu = 1
AllUsersPrograms = 2
AllUsersStartup = 3
Desktop = 4
AppData = 5
PrinterShortcuts = 6
Templates = 7
Fonts = 8
NetworkShortcuts = 9
StartMenu = 11
SendTo = 12
Recent = 13
Startup = 14
Favorites = 15
MyDocuments = 16
programs = 17
End Enum
Sub ShowAllSpecialFolders()
Dim wshShell As Object
Dim folderPath As String
Dim folderEnum As SpecialFolder
Set wshShell = CreateObject("WScript.Shell")
' Enum의 모든 상수 출력
For folderEnum = AllUsersDesktop To programs
Debug.Print wshShell.SpecialFolders(folderEnum) & " " & folderEnum
Next folderEnum
End Sub
메서드
AppActivate Method
응용 프로그램 창을 활성화합니다.
Syntax
object.AppActivate title
object : WshShell 개체입니다.
title : 활성화할 응용 프로그램을 지정합니다. 이 인수는 응용 프로그램의 제목(제목 표시줄에 나타나는 대로) 또는 응용 프로그램의 프로세스 ID를 포함하는 문자열일 수 있습니다.
비고
AppActivate 메서드는 프로시저 호출의 성공 여부를 나타내는 부울 값을 반환합니다. 이 메서드는 포커스를 명명된 응용 프로그램이나 창으로 바꾸지만 최대화 또는 최소화하지는 않습니다. 포커스를 바꾸는 동작을 하거나 창을 닫으면 활성화된 응용 프로그램 창에서 포커스가 이동합니다.
활성화할 응용 프로그램을 결정할 때 지정된 title과 실행 중인 각 응용 프로그램의 제목 문자열을 비교합니다. title이 정확하게 일치하는 응용 프로그램이 없을 경우 title 문자열이 지정된 title로 시작하는 응용 프로그램이 활성화됩니다. 만약 지정된 title로 시작하는 응용 프로그램이 없을 경우에는 이 title로 끝나는 응용 프로그램이 활성화됩니다. title로 명명된 응용 프로그램의 인스턴스가 여러 개인 경우에는 하나가 임의로 활성화됩니다.
다음 코드는 메모장이 실행되어 있는 경우 활성화시키는 예제입니다.
Sub ActivateNotepadWindow()
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
' 메모장 창 활성화 (제목에 "Notepad"를 포함하는 창을 활성화)
WshShell.AppActivate "Notepad"
Set WshShell = Nothing
End Sub
CreateShortcut Method
새 바로 가기를 만들거나 기존 바로 가기를 엽니다.
Syntax
object.CreateShortcut(strPathname)
object : WshShell 개체입니다.
strPathname : 만들려는 바로 가기의 경로 이름을 나타내는 문자열 값입니다.
비고
CreateShortcut 메서드는 WshShortcut 개체나 WshURLShortcut 개체를 반환합니다. CreateShortcut 메서드를 호출하는 것만으로 바로 가기를 만들 수는 없습니다. 바로 가기 개체와 이에 대한 변경 내용은 Save 메서드를 사용하여 디스크에 저장될 때까지 메모리에 저장됩니다. 바로 가기를 만들려면 다음을 수행해야 합니다.
1. WshShortcut 개체의 인스턴스를 생성합니다.
2. 등록 정보를 초기화합니다.
3. Save 메서드로 디스크에 저장합니다.
참고
일반적인 문제는 단축 아이콘 개체의 TargetPath 속성에 인수를 넣는 것인데, 이렇게 하면 작동하지 않습니다. 단축 아이콘의 모든 인수는 Arguments 속성에 넣어야 합니다.
다음 코드는 현재 작업 디렉토리에 대한 바로 가기를 사용자의 바탕 화면에 생성합니다.
Sub CreateShortcutExample()
Dim WshShell As Object
Dim Shortcut As Object
Dim DesktopPath As String
Dim ShortcutPath As String
' WScript.Shell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' 바탕 화면 경로 가져오기
DesktopPath = WshShell.SpecialFolders("Desktop")
' 바로 가기 경로 설정
ShortcutPath = DesktopPath & "\샘플 바로가기.lnk"
' 바로 가기 개체 생성 (샘플 바로가기 파일을 사용합니다)
Set Shortcut = WshShell.CreateShortcut(ShortcutPath)
' 바로 가기 대상 및 기타 속성 설정
Shortcut.TargetPath = CurDir ' 현재 작업 디렉토리를 대상으로 설정
Shortcut.Arguments = ""
Shortcut.Description = "샘플 바로가기"
Shortcut.WorkingDirectory = CurDir
Shortcut.IconLocation = "shell32.dll, 1" ' 아이콘 위치 예시
Shortcut.Hotkey = "CTRL+ALT+SHIFT+S" ' 단축키 지정 예시
' 바로 가기 저장
Shortcut.Save
' 개체 해제
Set Shortcut = Nothing
Set WshShell = Nothing
End Sub
다음 코드는 사용자 바탕 화면에 있는 기존 바로 가기 파일을 엶니다.
Sub OpenExistingShortcut()
Dim WshShell As Object
Dim Shortcut As Object
Dim DesktopPath As String
Dim ShortcutPath As String
' WScript.Shell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' 바탕 화면 경로 가져오기
DesktopPath = WshShell.SpecialFolders("Desktop")
' 기존 바로 가기 경로 설정
ShortcutPath = DesktopPath & "\기존 바로가기.lnk"
' 기존 바로 가기 개체 열기
Set Shortcut = WshShell.CreateShortcut(ShortcutPath)
' Msgbox에 바로 가기 정보 출력
MsgBox "바로 가기 대상: " & Shortcut.TargetPath & vbCrLf & _
"바로 가기 인수: " & Shortcut.Arguments & vbCrLf & _
"바로 가기 설명: " & Shortcut.Description & vbCrLf & _
"바로 가기 작업 디렉토리: " & Shortcut.WorkingDirectory & vbCrLf & _
"바로 가기 아이콘 위치: " & Shortcut.IconLocation & vbCrLf & _
"바로 가기 단축키: " & Shortcut.Hotkey
' 개체 해제
Set Shortcut = Nothing
Set WshShell = Nothing
End Sub
다음 코드는 TargetPath 속성에 인수를 넣는 잘못된 예제입니다.
Sub CreateIncorrectShortcut()
Dim WshShell As Object
Dim Shortcut As Object
Dim DesktopPath As String
Dim ShortcutPath As String
' WScript.Shell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' 바탕 화면 경로 가져오기
DesktopPath = WshShell.SpecialFolders("Desktop")
' 바로 가기 경로 설정
ShortcutPath = DesktopPath & "\잘못된 크롬 웹페이지 바로가기.lnk"
' 바로 가기 객체 생성
Set Shortcut = WshShell.CreateShortcut(ShortcutPath)
' 잘못된 대상 경로 설정: 인수가 포함되어 있음
Shortcut.TargetPath = "C:\Program Files\Google\Chrome\Application\chrome.exe https://www.google.com"
Shortcut.Description = "잘못된 크롬 웹페이지 바로가기"
Shortcut.WorkingDirectory = "C:\Program Files\Google\Chrome\Application"
Shortcut.IconLocation = "C:\Program Files\Google\Chrome\Application\chrome.exe, 0" ' 크롬 아이콘 사용
' 바로 가기 저장
Shortcut.Save
' 개체 해제
Set Shortcut = Nothing
Set WshShell = Nothing
End Sub
다음 코드는 Arguments속성을 이용해서 크롬 바로가기를 생성하는 올바른 예제입니다.
Sub CreateShortcutWithArguments()
Dim WshShell As Object
Dim Shortcut As Object
Dim DesktopPath As String
Dim ShortcutPath As String
' WScript.Shell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' 바탕 화면 경로 가져오기
DesktopPath = WshShell.SpecialFolders("Desktop")
' 바로 가기 경로 설정
ShortcutPath = DesktopPath & "\크롬 바로가기.lnk"
' 바로 가기 객체 생성
Set Shortcut = WshShell.CreateShortcut(ShortcutPath)
' 바로 가기 대상 및 기타 속성 설정
Shortcut.TargetPath = "C:\Program Files\Google\Chrome\Application\chrome.exe"
Shortcut.Arguments = "https://www.google.com" ' 인수를 Arguments 속성에 할당
Shortcut.Description = "크롬 바로가기"
Shortcut.WorkingDirectory = "C:\Program Files\Google\Chrome\Application"
Shortcut.IconLocation = Shortcut.TargetPath & ", 0" ' 크롬 아이콘 사용
' 바로 가기 저장
Shortcut.Save
' 개체 해제
Set Shortcut = Nothing
Set WshShell = Nothing
End Sub
Exec Method
지정된 외부 프로그램이나 명령을 실행하고, 실행된 프로세스에 대한 정보와 상호 작용을 관리하는데 필요한 WshExec 개체를 반환합니다.
Syntax
object.Exec(strCommand)
object : WshShell 개체입니다.
strCommand : 스크립트를 실행할 때 사용한 명령줄을 나타내는 문자열 값입니다. 명령 프롬프트는 명령 프롬프트에 입력할 때와 동일하게 나타나야 합니다.
주의
Exec 메서드는 StdIn, StdOut 및 StdErr 채널에 대한 액세스와 함께 Exec로 실행한 스크립트의 상태와 오류 정보를 제공하는 WshScriptExec 개체를 반환합니다. Exec 메서드는 명령줄 응용 프로그램의 실행만 허용합니다. Exec 메서드는 원격 스크립트 실행에 사용할 수 없습니다. Exec 메서드와 WshRemote의 Execute 메서드를 혼동하지 마십시오.
다음 코드는 메모장을 실행하고 메모장이 종료되면 메시지를 출력하는 예제입니다.
Sub RunNotepadUsingExecMethod()
Dim WshShell As Object
Dim ExecObject As Object
' WScript.Shell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' Notepad 실행
Set ExecObject = WshShell.Exec("notepad.exe")
' 프로그램이 종료될 때까지 대기
Do While ExecObject.Status = 0
DoEvents
Loop
' 종료 메시지 출력
MsgBox "Notepad 프로그램이 종료되었습니다."
' 개체 해제
Set ExecObject = Nothing
Set WshShell = Nothing
End Sub
다음 코드는 inconfig명령을 실행하고 결과를 메시지 박스로 출력합니다.
Sub RunIpconfigWithExecMethod()
Dim WshShell As Object
Dim ExecObject As Object
Dim strResult As String
' WScript.Shell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' ipconfig 명령 실행
Set ExecObject = WshShell.Exec("ipconfig")
' 커맨드 출력 결과를 문자열 변수에 저장
strResult = ExecObject.StdOut.ReadAll
' ipconfig 실행 결과 출력
MsgBox strResult, , "IP Configuration"
' 개체 해제
Set ExecObject = Nothing
Set WshShell = Nothing
End Sub
ipconfig 외에도 다양한 명령을 실행할 수 있습니다.아래는 몇 가지 예입니다.
시스템 정보 확인하기 (systeminfo)
Set ExecObject = WshShell.Exec("systeminfo")
네트워크 연결 확인하기 (ping)
Set ExecObject = WshShell.Exec("ping www.google.com")
디렉토리 목록 확인하기 (dir)
Set ExecObject = WshShell.Exec("cmd /C dir")
환경 변수 확인하기 (set)
Set ExecObject = WshShell.Exec("cmd /C set")
현재 사용 중인 포트 확인하기 (netstat)
Set ExecObject = WshShell.Exec("netstat")
라우팅 테이블 정보 확인하기 (route print)
Set ExecObject = WshShell.Exec("route print")
작업 관리자 정보 확인하기 (tasklist)
Set ExecObject = WshShell.Exec("tasklist")
로컬 사용자 계정 정보 확인하기 (net user)
Set ExecObject = WshShell.Exec("net user")
ExpandEnvironmentStrings Method
환경 변수의 확장된 값을 반환합니다.
Syntax
object.ExpandEnvironmentStrings(strString)
object : WshShell 개체입니다.
strString : 확장할 환경 변수의 이름을 나타내는 문자열 값입니다.
주의
ExpandEnvironmentStrings 메서드는 PROCESS 환경 공간에서만 정의된 환경 변수를 확장합니다. 환경 변수는 "%" 문자로 묶여 있어야 하고 대/소문자를 구분하지 않습니다.
다음 코드는 사용자 프로필 경로와 Temp 폴더의 경로를 출력합니다.
Function GetEnvironmentVariable(variableName As String) As String
Dim WshShell As Object
' WScript.Shell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' 전달된 환경 변수 이름에 대해 값을 찾아서 반환
GetEnvironmentVariable = WshShell.ExpandEnvironmentStrings(variableName)
' 개체 해제
Set WshShell = Nothing
End Function
Sub Main()
Dim UserProfilePath As String
Dim TempFolderPath As String
UserProfilePath = GetEnvironmentVariable("%USERPROFILE%")
MsgBox "사용자 프로필 경로: " & UserProfilePath
TempFolderPath = GetEnvironmentVariable("%TEMP%")
MsgBox "Temp 폴더 경로: " & TempFolderPath
End Sub
LogEvent Method
로그 파일에 이벤트 항목을 추가합니다.
Syntax
object.LogEvent(intType, strMessage [,strTarget])
object : WshShell 개체입니다.
intType : 이벤트 유형을 나타내는 정수 값입니다.
strMessage : 로그 항목 텍스트를 포함하는 문자열 값입니다.
strTarget : 선택적인 요소. 이벤트 로그를 저장하는 컴퓨터 시스템의 이름을 나타내는 문자열 값입니다. 기본값은 로컬 컴퓨터 시스템이며 Windows NT/2000에만 적용됩니다.
주의
LogEvent 메서드는 부울 값을 반환합니다. 이벤트가 성공적으로 기록되면 true이고 그렇지 않으면 false입니다. Windows NT/2000에서는 Windows NT 이벤트 로그에 이벤트를 기록합니다. 그리고 Windows 9x/Me에서는 Windows 디렉터리에 있는 WSH.log에 이벤트를 기록합니다. 아래와 같이 6 가지 이벤트 유형이 있습니다.
다음 코드는 이벤트를 기록하는 간단한 예제입니다.
Sub WriteToEventLog(logType As Long, logMessage As String)
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
wsh.LogEvent logType, logMessage
Set wsh = Nothing
End Sub
Sub LogEventExample()
' 이벤트 로그에 정보를 기록합니다.
Call WriteToEventLog(4, "This is a test log message.")
' 이벤트 로그에 경고를 기록합니다.
Call WriteToEventLog(2, "This is a warning log message.")
' 이벤트 로그에 오류를 기록합니다.
Call WriteToEventLog(1, "This is an error log message.")
End Sub
위 코드를 실행 후 이벤트 뷰어에서 확인한 화면입니다.
* 실제 운영 환경에서 VBA를 사용하여 이벤트 로그를 쓰는 분은 없겠지만...
이 코드는 개인 학습 목적으로 제작된 것으로 실제 운영 환경에서 VBA를 사용하여 Windows 이벤트 로그에 직접 쓰는 것은 권장되지 않는 접근 방식입니다.
Popup Method
텍스트를 포함하는 팝업 메시지 상자를 표시합니다.
Syntax
intButton = object.Popup(strText,[nSecondsToWait],[strTitle],[nType])
object : WshShell 개체입니다.
strText : 팝업 메시지 상자에 표시할 텍스트를 포함하는 문자열 값입니다.
nSecondsToWait : 선택적인 요소. 팝업 메시지 상자를 표시할 최대 시간(초)을 나타내는 수치 값입니다.
strTitle : 선택적인 요소. 팝업 메시지 상자의 제목으로 표시할 텍스트를 포함하는 문자열 값입니다.
nType : 선택적인 요소. 팝업 메시지 상자에 표시할 단추와 아이콘 종류를 나타내는 수치 값으로 메시지 상자의 용도를 결정합니다.
intButton : 사용자 메시지 상자를 해제하기 위해 누른 단추 번호를 나타내는 정수 값입니다. 이 값은 Popup 메서드에 의해 반환됩니다.
다음 코드는 3초 후에 팝업 상자를 닫습니다.
Sub WshPopupExample()
' WshShell 개체 생성
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
' 팝업 메서드 사용
Dim Message As String
Dim Title As String
Dim Timeout As Integer
Message = "안녕하세요! 이것은 팝업 예제입니다."
Title = "WSH 팝업 테스트"
Timeout = 3 ' 시간 단위를 초로 지정하며, 0은 무한정 대기하는 것을 뜻합니다.
' 팝업 실행
WshShell.Popup Message, Timeout, Title, vbInformation
' 개체 해제
Set WshShell = Nothing
End Sub
다음 코드는 Popup 메서드의 결과값을 변수에 담아서 사용하는 예제입니다.
Sub WshPopupVariableExample()
' WshShell 개체 생성
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
' 팝업 메서드를 사용해 값을 받아올 변수 정의
Dim PopupResult As Integer
Dim Message As String
Dim Title As String
Dim Timeout As Integer
Dim Buttons As Integer
Message = "계속하시겠습니까?"
Title = "WSH 팝업 예제"
Timeout = 0 ' 0은 무한정 대기한다는 의미
Buttons = vbYesNo + vbQuestion + vbDefaultButton1
' 팝업 실행하고 사용자의 선택을 PopupResult 변수에 저장
PopupResult = WshShell.Popup(Message, Timeout, Title, Buttons)
' 사용자의 선택에 따라 동작 수행
If PopupResult = vbYes Then
MsgBox "예를 선택하셨습니다."
ElseIf PopupResult = vbNo Then
MsgBox "아니오를 선택하셨습니다."
End If
' 개체 해제
Set WshShell = Nothing
End Sub
RegDelete Method
레지스트리에서 키 또는 값을 삭제합니다.
Syntax
object.RegDelete(strName)
object : WshShell 개체입니다.
strName : 삭제할 레지스트리 키 또는 키 값의 이름을 나타내는 문자열 값입니다.
비고
마지막 백슬래시로 strName을 종료하여 키 이름을 지정하십시오. 값-이름을 지정하려면 해제하십시오. 정규화된 키 이름과 값 이름에는 루트 키가 접두사로 붙습니다. RegDelete 메서드와 함께 약식 버전의 루트 키 이름을 사용할 수 있습니다. 사용할 수 있는 5개의 가능한 루트 키는 다음 표에 나열되어 있습니다.
다음 코드는 RegDelete 메서드의 사용법을 보여줍니다.
Sub RegDeleteExample()
' WshShell 개체 생성
Dim WSH As Object
Set WSH = CreateObject("WScript.Shell")
' 삭제할 레지스트리 키를 지정합니다. 예를 들면:
Const regKey As String = "HKEY_CURRENT_USER\Software\Example\"
' RegDelete 메서드를 사용하여 레지스트리 키를 삭제합니다.
On Error Resume Next ' RegDelete가 실패하는 경우를 처리하기 위한 에러 처리
WSH.RegDelete regKey
If Err.Number <> 0 Then
MsgBox "레지스트리 키 삭제에 실패했습니다. 오류 번호: " & Err.Number & ", 설명: " & Err.Description
Else
MsgBox "레지스트리 키가 성공적으로 삭제되었습니다: " & regKey
End If
On Error GoTo 0 ' 에러 처리를 기본값으로 되돌립니다.
' 개체 해제
Set WSH = Nothing
End Sub
RegRead Method
레지스트리에서 키 값 또는 값 이름을 반환합니다.
Syntax
object.RegRead(strName)
object : WshShell 개체입니다.
RegRead : 읽을 키 또는 값 이름을 나타내는 문자열 값입니다.
비고
RegRead 메서드는 아래와 같은 5가지 형식의 값을 반환합니다.
strName을 최종 백슬래시로 끝나게 하여 키 이름을 지정할 수 있습니다. 값 이름을 지정할 때 최종 백슬래시를 포함하지 마십시오. 값 항목은 이름, 데이터 형식 및 값으로 이루어져 있습니다. 키 이름을 지정하면 값 이름과 반대로 RegRead가 기본값을 반환합니다. 키의 기본값을 읽으려면 키 자체의 이름을 지정하십시오. 정식 키 이름과 값 이름은 루트 키로 시작합니다. RegRead 메서드로 루트 키 이름의 약어 버전을 사용할 수 있습니다. 아래 표는 사용할 수 있는 5가지 루트 키를 보여줍니다.
다음은 RegRead 메서드를 사용하여 레지스트리 정보를 가져오는 몇 가지 예입니다.
예제 코드 - 1
Sub GetWallpaperPathFromRegistry()
Dim WshShell As Object
Dim RegistryValue As Variant
' WshShell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' 레지스트리 키 경로 지정
Const RegistryKeyPath As String = "HKEY_CURRENT_USER\Control Panel\Desktop\"
' RegRead 메서드를 사용하여 레지스트리 값 읽기
RegistryValue = WshShell.RegRead(RegistryKeyPath & "Wallpaper")
' 레지스트리 값 출력
MsgBox "현재 배경화면 경로: " & RegistryValue, vbInformation, "레지스트리 값 읽기 예제"
' 개체 해제
Set WshShell = Nothing
End Sub
예제 코드 - 2
Sub GetFileAssocUsingWSH()
Dim WshShell As Object
Dim strFileAssoc As String
Dim strExtension As String
' 파일 확장자를 ".txt"로 설정합니다.
strExtension = ".txt"
' WshShell 개체를 생성합니다.
Set WshShell = CreateObject("WScript.Shell")
' 레지스트리에서 파일 확장자와 연결된 프로그램 정보를 가져옵니다.
strFileAssoc = WshShell.RegRead("HKEY_CLASSES_ROOT\" & strExtension & "\")
' 연결된 프로그램 정보를 메시지 박스로 표시합니다.
MsgBox "파일 확장자 " & strExtension & " 연결 프로그램: " & strFileAssoc, vbInformation, "파일 연결 정보"
' WshShell 개체 해제
Set WshShell = Nothing
End Sub
예제 코드 - 3
Sub GetHostNameFromRegistry()
Dim WshShell As Object
Dim HostName As String
' WshShell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' 레지스트리에서 호스트 이름(컴퓨터 이름) 가져오기
HostName = WshShell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Hostname")
' 결과 출력
MsgBox "호스트 이름(컴퓨터 이름): " & HostName, vbInformation, "레지스트리 접근 예제"
' WshShell 개체 해제
Set WshShell = Nothing
End Sub
예제 코드 - 4
Sub GetDoubleClickSpeedUsingRegistry()
Dim WshShell As Object
Dim DoubleClickSpeed As String
' WshShell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' 레지스트리에서 마우스 더블 클릭 속도 가져오기
DoubleClickSpeed = WshShell.RegRead("HKEY_CURRENT_USER\Control Panel\Mouse\DoubleClickSpeed")
' 결과 출력
MsgBox "마우스 더블 클릭 속도: " & DoubleClickSpeed, vbInformation, "레지스트리를 사용한 예제"
' WshShell 개체 해제
Set WshShell = Nothing
End Sub
RegWrite Method
새 키를 만들며 기존 키에 다른 키 이름을 추가하고 값을 지정하거나 기존 값 이름의 값을 변경합니다.
Syntax
object.RegWrite(strName, anyValue [,strType])
object : WshShell 개체입니다.
strName : 만들거나 추가하거나 변경할 키 이름, 값 이름 또는 값을 나타내는 문자열 값입니다.
anyValue : 만들려는 새 키 이름, 기존 키에 추가할 값 이름 또는 기존 값 이름에 지정할 새 값입니다.
strType : 선택적인 요소. 값의 데이터 형식을 나타내는 문자열 값입니다.
주의
strName을 최종 백슬래시로 끝나게 하여 키 이름을 지정합니다. 값 이름을 지정할 때 최종 백슬래시를 포함하지 마십시오. RegWrite 메서드는 자동으로 anyValue 매개 변수를 문자열이나 정수로 변환합니다. strType의 값은 데이터 형식(문자열 또는 정수)을 결정합니다. strType의 옵션은 아래 표에 나열되어 있습니다.
참고
REG_MULTI_SZ 형식은 RegWrite 메서드에서 지원되지 않습니다.
Tip
RegWrite는 REG_BINARY 값에 최대 하나의 DWORD를 씁니다. 이 메서드에서는 더 큰 값은 지원되지 않습니다.
완전한 경로가 포함된 키 이름과 값 이름은 루트 키로 시작합니다. RegWrite 메서드에서 루트 키의 약어 버전을 사용할 수 있습니다. 다섯 가지 루트 키는 다음 표에 나열되어 있습니다.
strType으로 지정할 수 있는 네 가지 데이터 유형은 다음 표에 나열되어 있습니다.
다음 코드는 RegWrite 메서드를 사용하여 레지스트리에 값을 쓰는 방법을 보여줍니다.
Sub WriteRegistryValue(regKeyPath As String, regValueName As String, regValueType As String, regValueData As String)
Dim WshShell As Object
' WshShell 개체 생성
Set WshShell = CreateObject("WScript.Shell")
' 레지스트리 값 쓰기
On Error Resume Next
WshShell.RegWrite regKeyPath & "\" & regValueName, regValueData, regValueType
On Error GoTo 0
' WshShell 개체 해제
Set WshShell = Nothing
End Sub
Sub ExampleUsage()
Dim regKeyPath As String
Dim regValueName As String
Dim regValueType As String
Dim regValueData As String
' 레지스트리 키 경로, 값 이름, 값 유형, 값 데이터 설정
regKeyPath = "HKEY_CURRENT_USER\Software\MyApp"
regValueName = "MyValue"
regValueType = "REG_SZ"
regValueData = "Hello, World!"
' WriteRegistryValue 프로시저 호출
WriteRegistryValue regKeyPath, regValueName, regValueType, regValueData
End Sub
Run Method
프로그램을 새 프로세스에서 실행합니다.
Syntax
object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
object : WshShell 개체입니다.
strCommand : 실행할 명령줄을 나타내는 문자열 값입니다. 실행 파일에 전달할 모든 매개 변수를 포함해야 합니다.
intWindowStyle : 선택적인 요소. 프로그램 창의 모양을 나타내는 정수 값입니다. 일부 프로그램만 이 정보를 사용합니다.
bWaitOnReturn : 선택적인 요소. 스크립트가 다음 문으로 진행하기 전에 프로그램이 실행을 마칠 때까지 기다려야 하는지 여부를 나타내는 Boolean 값입니다. True로 설정하면 스크립트는 프로그램이 끝날 때까지 실행을 중단하고 Run은 프로그램에서 반환되는 모든 오류 코드를 반환합니다. 기본값인 False로 설정하면 Run 메서드는 프로그램을 시작하자마자 자동으로 0을 반환합니다. 0은 오류 코드로 해석되지 않습니다.
주의
Run 메서드는 정수를 반환합니다. Run 메서드는 새 Windows 프로세스에서 실행하는 프로그램을 시작합니다. 프로그램이 실행을 끝낼 때까지 기다린 후 계속해서 실행하도록 스크립트를 설정할 수 있습니다. 이렇게 하면 스크립트와 프로그램을 동시에 실행할 수 있습니다. strCommand 인수 내에 있는 환경 변수는 자동으로 확장됩니다. 파일 형식이 특정 프로그램에 제대로 등록되어 있으면 이러한 파일 형식으로 실행을 호출하면 프로그램이 실행됩니다. 예를 들어, 컴퓨터 시스템에 Word가 설치되어 있는 경우 *.doc 파일에 대해 Run을 호출하면 Word를 시작하고 그 문서를 로드합니다.
아래 표는 intWindowStyle에 사용할 수 있는 설정을 보여줍니다.
다음 코드는 Run 메서드를 사용하는 몇가지 예입니다.
예제 코드 - 1
Sub RunChrome()
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
Dim chromePath As String
chromePath = """C:\Program Files\Google\Chrome\Application\chrome.exe"""
WshShell.Run chromePath
Set WshShell = Nothing
End Sub
예제 코드 - 2
Sub RunCommandPrompt()
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
Dim cmdPath As String
cmdPath = "cmd.exe"
WshShell.Run cmdPath
Set WshShell = Nothing
End Sub
예제 코드 - 3
Sub RunCalculator()
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
Dim calcPath As String
calcPath = "calc.exe"
WshShell.Run calcPath
Set WshShell = Nothing
End Sub
예제 코드 - 4
Sub RunNotepad()
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
Dim notepadPath As String
notepadPath = "notepad.exe"
WshShell.Run notepadPath
Set WshShell = Nothing
End Sub
예제 코드 - 5
Sub OpenWebsite()
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
Dim websiteURL As String
websiteURL = "https://www.google.com"
WshShell.Run websiteURL
Set WshShell = Nothing
End Sub
SendKeys Method
키보드에서 입력한 것처럼 여러 키 입력을 활성 창에 보냅니다.
Syntax
object.SendKeys(string)
object : WshShell 개체입니다.
string : 보낼 키 입력(들)을 나타내는 문자열 값입니다.
비고
SendKeys 메서드를 사용하여 자동화 인터페이스가 없는 애플리케이션에 키 입력을 보냅니다. 대부분의 키보드 문자는 단일 키 입력으로 표시됩니다. 일부 키보드 문자는 키 입력 조합(예: CTRL+SHIFT+HOME)으로 구성됩니다. 단일 키보드 문자를 보내려면 문자 자체를 문자열 인수로 보내십시오. 예를 들어 문자 x를 보내려면 문자열 인수 "x"를 보냅니다.
Note
공백을 보내려면 " " 문자열을 보내십시오.
SendKeys를 사용하여 한 번에 둘 이상의 키 입력을 보낼 수 있습니다. 이렇게 하려면 시퀀스의 각 키 입력을 앞에 있는 키 입력에 추가하여 키 입력 시퀀스를 나타내는 복합 문자열 인수를 만듭니다. 예를 들어 키 입력 a, b 및 c를 보내려면 문자열 인수 "abc"를 보냅니다. SendKeys 메서드는 일부 문자를 액면가를 사용하는 대신 문자 수정자로 사용합니다 . 이 특수 문자 세트는 괄호, 대괄호, 중괄호 및 다음으로 구성됩니다.
● 더하기 기호 "+",
● 캐럿 "^",
● 백분율 기호 "%",
● 물결표 "~"
이러한 문자를 중괄호 "{}"로 묶어 보내십시오. 예를 들어 더하기 기호를 보내려면 문자열 인수 "{+}"를 보냅니다. 대괄호 "[ ]"는 SendKeys 와 함께 사용할 때 특별한 의미가 없지만 특별한 의미를 부여하는 응용 프로그램(예: 동적 데이터 교환(DDE))을 수용하려면 중괄호로 묶어야 합니다.
● 대괄호 문자를 보내려면 왼쪽 대괄호에 문자열 인수 "{[}"를, 오른쪽 대괄호에 "{]}"를 보냅니다.
● 중괄호 문자를 보내려면 왼쪽 중괄호에 문자열 인수 "{{}"를, 오른쪽 중괄호에 "{}}"를 보냅니다.
일부 키 입력은 문자를 생성하지 않습니다(예: ENTER 및 TAB). 일부 키 입력은 작업(예: BACKSPACE 및 BREAK)을 나타냅니다. 이러한 종류의 키 입력을 보내려면 다음 표에 표시된 인수를 보내십시오.
SHIFT, CTRL 또는 ALT와 함께 일반 키 입력으로 구성된 키보드 문자를 보내려면 키 입력 조합을 나타내는 복합 문자열 인수를 만듭니다. 일반 키 입력 앞에 다음 특수 문자 중 하나 이상을 사용하여 이를 수행합니다.
Note
이 방법을 사용할 때 이러한 특수 문자는 중괄호 세트로 묶이지 않습니다.
다른 여러 키를 누른 상태에서 SHIFT, CTRL 및 ALT 조합을 누르도록 지정하려면 수정된 키 입력을 괄호로 묶은 복합 문자열 인수를 만듭니다. 예를 들어, 다음 동안 SHIFT 키를 누르도록 지정하는 키 입력 조합을 보내려면:
● e와 c를 누르면 문자열 인수 "+(ec)"를 보냅니다.
● e를 누른 다음 단독 c(SHIFT 없음)를 누르면 문자열 인수 "+ec"를 보냅니다.
SendKeys 메서드를 사용하여 연속으로 여러 번 누른 단일 키 입력으로 구성된 키 입력 패턴을 보낼 수 있습니다. 이렇게 하려면 반복하려는 키 입력과 반복하려는 횟수를 지정하는 복합 문자열 인수를 만듭니다. { keystroke number } 형식의 복합 문자열 인수를 사용하여 이 작업을 수행합니다 . 예를 들어 문자 "x"를 10번 보내려면 문자열 인수 "{x 10}"을 보냅니다. 키 입력과 숫자 사이에 공백을 포함해야 합니다.
Note
보낼 수 있는 유일한 키 입력 패턴은 여러 번 누른 단일 키 입력으로 구성된 종류입니다. 예를 들어 "x"를 10번 보낼 수 있지만 "Ctrl+x"에 대해서는 동일한 작업을 수행할 수 없습니다.
Note
PRINT SCREEN 키 {PRTSC}를 응용 프로그램에 보낼 수 없습니다.
다음 코드는 SendKeys 메서드를 사용하는 몇 가지 예입니다.
예제 코드 - 1
Sub WSH_SendKeysExample()
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
' Notepad를 실행하고 "Hello, SendKeys!"를 입력합니다.
WshShell.Run "notepad.exe", vbNormalFocus
Application.Wait Now + TimeValue("00:00:02") ' 잠시 대기
WshShell.SendKeys "Hello, SendKeys!"
End Sub
예제 코드 - 2
Sub WSH_SendKeysExample()
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
' Notepad를 실행하고 "Hello, SendKeys!"를 입력합니다.
WshShell.Run "notepad.exe", vbNormalFocus
Application.Wait Now + TimeValue("00:00:02") ' 잠시 대기
' 엔터 키와 탭 키를 보냅니다.
WshShell.SendKeys "Hello, SendKeys!{ENTER}"
WshShell.SendKeys "Tabbed Text{TAB}More Text"
End Sub
아래 문장은 ChatGPT에게 질문하고 답변받은 내용입니다.Bard에서도 같은 답변을 받았습니다.
SendKeys 메서드는 다양한 문제를 야기할 수 있으며, 주의해서 사용해야 합니다. 아래에 SendKeys 메서드가 문제가 될 수 있는 주요 경우를 자세히 설명해 드리겠습니다:
1. 타이밍 문제와 예상치 못한 동작:
● SendKeys 메서드는 응용 프로그램의 포커스 변경에 따라 예상치 못한 순서로 동작할 수 있습니다.
● 특히, 응용 프로그램이나 시스템 작업이 완료되기를 기다려야 할 때 문제가 발생할 수 있습니다.
2. 무한 루프:
● SendKeys 메서드를 사용하여 특정 키나 조합을 보내면, 해당 키를 다시 수신하는 코드 내에서 무한 루프가 발생할 수 있습니다.
● 예를 들어, 응용 프로그램이 특정 키 입력에 반응하여 다시 SendKeys를 호출하는 경우 무한 루프가 발생할 수 있습니다.
3. 타이밍 및 성능 문제:
● SendKeys 메서드를 반복 호출하는 경우 작업이 느려질 수 있고, 대량의 키보드 입력을 시뮬레이트할 때 성능 문제가 발생할 수 있습니다.
4. 응용 프로그램 간 호환성 문제:
● SendKeys 메서드는 응용 프로그램 간의 호환성 문제를 야기할 수 있습니다.
● 일부 응용 프로그램은 SendKeys를 제대로 처리하지 않거나 무시할 수 있습니다.
5. 보안 문제:
● SendKeys 메서드를 사용하면 키보드 입력을 시뮬레이트하므로 보안 문제가 발생할 수 있습니다.
● 암호나 민감한 정보를 다른 응용 프로그램에 전송할 때 보안 위험이 발생할 수 있습니다.
6. 스크린 리더 및 접근성 문제:
● SendKeys 메서드는 스크린 리더와 같은 보조 기술과 호환되지 않을 수 있으며, 접근성 문제를 야기할 수 있습니다.
7. 로캘 및 국제화 문제:
● SendKeys는 언어나 키보드 레이아웃에 따라 동작이 다를 수 있어 국제화된 응용 프로그램에서 문제가 발생할 수 있습니다.
8의존성 문제:
● SendKeys는 다른 응용 프로그램의 기능에 의존하거나 특정 응용 프로그램이 설치되어 있어야만 작동하는 경우가 있습니다.
9. 유지보수의 어려움:
SendKeys를 사용한 스크립트는 유지보수가 어려울 수 있습니다. 코드의 의도와 작동 방식을 파악하기 어렵습니다.
따라서 SendKeys 메서드를 사용하기 전에 다른 대안을 고려하고, 필요한 경우에만 사용하되 신중하게 사용하는 것이 좋습니다. 대체 가능한 방법들을 찾아보고, 예상치 못한 문제를 예방하고자 노력해야 합니다.
'Windows Script Host' 카테고리의 다른 글
WshShortcut Object (0) | 2023.08.29 |
---|---|
WshNetwork 개체 (0) | 2023.08.17 |
WshEnvironment 개체 (0) | 2023.08.17 |