사용자 도구

사이트 도구


kb:windowsscriptsnippets


Windows Script / Snippets

공유 폴더에 사용자 추가하기

windowsscriptsnippets_adduser.vbs

익스플로러 상에서 직접 실행하면 각종 인수들을 입력하라는 대화창이 뜬다. 이게 싫으면 커맨드 라인에서 다음과 같은 형식으로 실행한다.

cscript adduser.vbs /option1:value /option2:value ...

옵션의 목록은 다음과 같다.

옵션 가능한 값
host 컴퓨터 이름 또는 IP 주소
share 공유 이름. 경로가 아니라 공유 이름이니 주의.
domain 도메인
account 계정 또는 그룹 이름
acc_type user / group
ace_type allow / deny / audit
access read / change / full / none
prop true / false

메일 보내기

테스트해보니 된다. 아웃룩 설치 여부는 무관하다. 패스워드를 입력하지 않는데, 어떻게 전송되는 거지…? 액티브 디렉토리 같은 걸 통해 자동으로 인증이 되는 모양이다.

SendMail "smtp.somewhere.co.kr", _
    "보내는 사람 <someone@somewhere.co.kr>", _
    "이것은 제목이지요", _
    "recipient@somewhere.co.kr", _
    "이것은 내용입니다", _
    ""
 
Function SendMail(SmtpServer, SenderEmail, Subject, Recipient, Message, Attachment)
    Dim iMsg 
    Dim iConf 
    Dim Flds 
 
    'We will use CDO Send Using Port in this example
    Const cdoSendUsingPickup = 1
    Const cdoSendUsingPort = 2
 
    'Use COM to create Message and Configuration Objects
    set iMsg = CreateObject("CDO.Message")
    set iConf = CreateObject("CDO.Configuration")
 
    'Now Set the field to the configuration objects fields
    Set Flds = iConf.Fields
 
    'Set the field namespaces to the relevant variables/constants
    With Flds
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = SmtpServer
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10  
        .Update
    End With
 
    If Attachment <> "" Then
        iMsg.AddAttachment Attachment
    End If
 
    ' Apply the settings to the message.
    With iMsg
        Set .Configuration = iConf
        .To = Recipient 
        .From = SenderEmail
        .Subject = subject
        .HTMLBody = Message
        .Send 'Finally Send the message
    End With
 
    ' Clean up variables.
    Set iMsg = Nothing
    Set iConf = Nothing
    Set Flds = Nothing
End Function

일정 시간 지난 파일 삭제하기

특정 폴더 내에서 일정 시간이 지난 파일을 삭제하는 예제다.

Option Explicit
On Error Resume Next
 
Dim oFSO
Dim sDirectoryPath
Dim oFolder
Dim oFileCollection
Dim oFile
Dim iDaysOld
 
'Customize values here to fit your needs
iDaysOld = 21
Set oFSO = CreateObject("Scripting.FileSystemObject")
sDirectoryPath = "FolderName here. Can be UNC path like \\MyServer\MyFolder"
set oFolder = oFSO.GetFolder(sDirectoryPath)
set oFileCollection = oFolder.Files
 
'Walk through each file in this folder collection. 
'If it is older than 3 weeks (21) days, then delete it.
For each oFile In oFileCollection
    If oFile.DateLastModified < (Date() - iDaysOld) Then
        oFile.Delete(True)
    End If
Next
 
'Clean up
Set oFSO = Nothing
Set oFolder = Nothing
Set oFileCollection = Nothing
Set oFile = Nothing

특정 파일 FTP로 업로드하기

기본 ftp 프로그램의 -s 기능을 이용한다. 아래의 예제에서는 파일의 이름이 YYYYMMDDData.csv 형식으로 되어있다고 간주한다. 해당 파일은 시스템 어딘가에서 날마다 생성되는 파일이라고 생각하면 되겠다.

Option Explicit
Dim objFSO, objMyFile, objShell, strFTPScriptFileName, strFile2Get
Dim strLocalFolderName, strFTPServerName, strLoginID
Dim strPassword, strFTPServerFolder
 
'Customize code here to fit your needs
strLocalFolderName = "My Folder Name where we put the file to be FTPed"
strFTPServerName = "FTP Server Name"
strLoginID = "FTP Server Login ID"
strPassword = "FTP Login ID Password"
strFTPServerFolder = "Folder Name on FTP server where the file resides"
 
'The following code converts date to the right format, YYYYMMDD
strFile2Get = DatePart("yyyy",Date)
 
If DatePart("m",Date) < 10 Then
	strFile2Get = strFile2Get & "0"
End If
 
strFile2Get = strFile2Get & DatePart("m",Date)
 
If DatePart("d",Date) < 10 Then
	strFile2Get = strFile2Get & "0"
End If
 
strFile2Get = strFile2Get & DatePart("d",Date)
 
'The following code generates the file name on the FTP server you want to get
strFile2Get = "Data" & strFile2Get & ".csv"
 
'The follow lines of code generate the FTP script file on the fly,
'because the get file name changes every day

strFTPScriptFileName = strLocalFolderName & "\FTPScript.txt"
 
Set objFSO = CreateObject("Scripting.FileSystemObject")
 
If (objFSO.FileExists(strFTPScriptFileName)) Then
    objFSO.DeleteFile (strFTPScriptFileName)
End If
 
Set objMyFile = objFSO.CreateTextFile(strFTPScriptFileName, True)
objMyFile.WriteLine ("open " & strFTPServerName)
objMyFile.WriteLine (strLoginID)
objMyFile.WriteLine (strPassword)
objMyFile.WriteLine ("cd " & strFTPServerFolder)
objMyFile.WriteLine ("ascii")
objMyFile.WriteLine ("lcd " & strLocalFolderName)
objMyFile.WriteLine ("get " & strFile2Get)
objMyFile.WriteLine ("bye")
objMyFile.Close
Set objFSO = Nothing
Set objMyFile = Nothing
 
'The following code executes the FTP script. It creates a Shell
'object and run FTP program on top of it.
Set objShell = WScript.CreateObject( "WScript.Shell" )
objShell.Run ("ftp -s:" & chr(34) & strFTPScriptFileName & chr(34))
Set objShell = Nothing

소스 백업하기

작업 디렉토리(CWD)에 주의…

On Error Resume Next 
 
Dim Fso, ExtDic, TempDirDic, Shell
 
' 필요한 오브젝트들 생성
Set Fso = CreateObject("Scripting.FileSystemObject") 
Set ExtDic = CreateObject("Scripting.Dictionary") 
Set TempDirDic = CreateObject("Scripting.Dictionary") 
Set Shell = CreateObject("WScript.Shell")
 
' 변수 지정
DestDirectory = "Anima" ' 이 부분 상대 경로 사용중!
Archiver = """C:\Program Files\WinRar\rar.exe"" a -m5 -r -p -SFX "
BackupFileName = "C:\" & Date() & " Anima.exe"
 
' 삭제할 디렉토리들을 등록한다. (임시적으로 생기는 넘들...)
TempDirDic.Add "Anima\Documents\doc\Common", ""
TempDirDic.Add "Anima\Documents\doc\Game"
 
' 삭제할 확장자를 등록한다. 소문자만 사용할 것!
ExtDic.Add "pch", ""
ExtDic.Add "obj", ""
ExtDic.Add "ncb", ""
ExtDic.Add "ilk", ""
ExtDic.Add "pdb", ""
ExtDic.Add "idb", ""
ExtDic.Add "lib", ""
ExtDic.Add "suo", ""
ExtDic.Add "log", ""
ExtDic.Add "tag", ""
ExtDic.Add "pcc", ""
ExtDic.Add "dep", ""
ExtDic.Add "tds", ""
ExtDic.Add "csm", ""
ExtDic.Add "#00", ""
ExtDic.Add "#01", ""
ExtDic.Add "#02", ""
ExtDic.Add "#03", ""
ExtDic.Add "#04", ""
ExtDic.Add "#05", ""
ExtDic.Add "#06", ""
ExtDic.Add "#07", ""
ExtDic.Add "#08", ""
ExtDic.Add "#09", ""
ExtDic.Add "user", ""
ExtDic.Add "manifest", ""
'ExtDic.Add "res", ""
'ExtDic.Add "exe", ""

' 먼저 필요없는 디렉토리를 삭제한 다음, 필요없는 파일들을 삭제한다.
directories = TempDirDic.Keys
For i=0 To TempDirDic.Count-1
    Fso.DeleteFolder directories(i)
Next
 
CleanDir DestDirectory, ExtDic
 
' 필요한 디렉토리/파일들을 압축한다.
command = Archiver & """" & BackupFileName & """ """ & DestDirectory & """"
Shell.Run command, 1, false
 
 
' 주어진 디렉토리와 그 하위디렉토리를 돌면서 특정 확장자를 가진 파일들을 삭제한다.
Sub CleanDir(path, extDic) 
    Set folder = Fso.GetFolder(path) 
    Set files = folder.Files 
    Set subfolders = folder.SubFolders 
 
    For Each file In files 
        filename = file.Path
        extension = GetExtension(file.Name)
        If extDic.Exists(extension) Then
            Fso.DeleteFile filename
        End If
    Next 
 
    For Each subfolder In subfolders 
        CleanDir subfolder.Path, extDic
    Next 
End Sub
 
' 파일의 확장자를 반환한다.
Function GetExtension(filename)
    pos = InStrRev(filename, ".") 
    If pos <> 0 Then
        GetExtension = LCase(Right(filename, Len(filename) - pos))
    Else
        GetExtension = ""
    End If
End Function

스크립트 출력을 클립 보드로 복사하기

from Can I Copy Script Output to the Clipboard?

인터넷 익스플로러 오브젝트를 이용하면 된다.

strCopy = "This text has been copied to the clipboard."
 
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
objIE.document.parentwindow.clipboardData.SetData "text", strCopy
objIE.Quit

Windows 2000 리소스킷에 clip.exe라는 프로그램이 파이프로 입력을 받아들여, 클립보드에다 복사해주는 기능을 했었는데, 왜 XP 리소스킷에서는 없어진 것일까? 어쨌든 clip.exe를 가져오면, 에코 문자열을 파이프를 통해서도 복사할 수 있다.

GUI 형태로 사용자 입력 받아들이기

from How Can I Make Selections from a Form When Using a Script?

Windows Script Host만으로는 GUI를 생성할 수 없다. 하지만 HTA(HTML Application)이라는 기능을 이용하면 가능하다. 아래에 나오는 내용을 test.hta라는 이름으로 저장해서 실행하면 된다. 확장자가 반드시 “HTA”이어야한다.

<SCRIPT LANGUAGE="VBScript">
Sub RunScript
 
    If ComputerOption(0).Checked Then
        MsgBox "Item 0 Clicked"
    End If
    If ComputerOption(1).Checked Then
        MsgBox "Item 1 Clicked"
    End If
    If ComputerOption(2).Checked Then
        MsgBox "Item 2 Clicked"
    End If
    If ComputerOption(3).Checked Then
        MsgBox "Item 3 Clicked"
    End If
 
    Self.Close()
End Sub
 
Sub CancelScript
   Self.Close()
End Sub
</SCRIPT>
<BODY>
<input type="radio" name="ComputerOption" value="atl-ws-01">atl-ws-01<BR>
<input type="radio" name="ComputerOption" value="atl-ws-02">atl-ws-02<BR>
<input type="radio" name="ComputerOption" value="atl-ws-03">atl-ws-03<BR>
<input type="radio" name="ComputerOption" value="atl-ws-04">atl-ws-04<P>
<input id=runbutton class="button" type="button" value="Run Script" name="ok_button" 
onClick="RunScript">
&nbsp;&nbsp;&nbsp;
<input id=runbutton class="button" type="button" value="Cancel" name="cancel_button" 
onClick="CancelScript">
</BODY>

사운드(WAV) 플레이하기

strSoundFile = "C:\Windows\Media\Notify.wav"
Set objShell = CreateObject("Wscript.Shell")
strCommand = "sndrec32 /play /close " & chr(34) & strSoundFile & chr(34)
objShell.Run strCommand, 0, False

TCP 성능 데이터 얻어내기

from Getting TCP Performance Data

On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_PerfRawData_Tcpip_TCP",,48)
For Each objItem in colItems
    Wscript.Echo "Caption: " & objItem.Caption
    Wscript.Echo "ConnectionFailures: " & objItem.ConnectionFailures
    Wscript.Echo "ConnectionsActive: " & objItem.ConnectionsActive
    Wscript.Echo "ConnectionsEstablished: " & objItem.ConnectionsEstablished
    Wscript.Echo "ConnectionsPassive: " & objItem.ConnectionsPassive
    Wscript.Echo "ConnectionsReset: " & objItem.ConnectionsReset
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo "Frequency_Object: " & objItem.Frequency_Object
    Wscript.Echo "Frequency_PerfTime: " & objItem.Frequency_PerfTime
    Wscript.Echo "Frequency_Sys100NS: " & objItem.Frequency_Sys100NS
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "SegmentsPersec: " & objItem.SegmentsPersec
    Wscript.Echo "SegmentsReceivedPersec: " & objItem.SegmentsReceivedPersec
    Wscript.Echo "SegmentsRetransmittedPersec: " & objItem.SegmentsRetransmittedPersec
    Wscript.Echo "SegmentsSentPersec: " & objItem.SegmentsSentPersec
    Wscript.Echo "Timestamp_Object: " & objItem.Timestamp_Object
    Wscript.Echo "Timestamp_PerfTime: " & objItem.Timestamp_PerfTime
    Wscript.Echo "Timestamp_Sys100NS: " & objItem.Timestamp_Sys100NS
Next

원격 컴퓨터에서 프로그램 실행하기

WMI를 이용한다.

strComputer = "NameOrIp"
 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2:Win32_Process")
 
Error = objWMIService.Create("notepad.exe", null, null, intProcessID)
If Error = 0 Then
    Wscript.Echo "Notepad was started with a process ID of " & intProcessID & "."
Else
    Wscript.Echo "Notepad could not be started due to error " & Error & "."
End If

도메인 안에 있는 여러 대의 컴퓨터에서 특정 명령 수행하기

from Executing a Command on each Computer in a Domain

Syntax:

ExexcuteAll <DomainToTraverse> <ComputerSpecification> <Command> [/Y]

Example:

ExexcuteAll MYDOMAIN WKSATL* "del \\$n\admin$\activitylog.txt"

ExecuteAll.vbs

Option Explicit
 
Dim oDomain, oService, oItem, oShell
Dim strDomain, strSpec, strCommand, intButton
Dim oArgs, strFinalCommand, oRegEx, boolConfirm
 
' Prepare to execute commands & do popups
Set oShell = CreateObject("WScript.Shell")
 
GetArguments
 
' Access the domain so we can traverse objects
WScript.Echo "Accessing NT Domain " & strDomain
Set oDomain = GetObject("WinNT://" & strDomain)
 
' Initiate our regular expression support
Set oRegEx = New RegExp
oRegEx.Pattern = strSpec
oRegEx.IgnoreCase = True
 
' Traverse each computer (WinNT) object in the domain
WScript.Echo "Searching for " & strSpec
oDomain.Filter = Array("Computer") ' only look at computers
For Each oItem In oDomain
    If oRegEx.Test(oItem.Name) Then
        WScript.Echo " Matched " & oItem.Name
        strFinalCommand = Replace(strCommand, "$n", oItem.Name)
 
        intButton = vbNo
        If boolConfirm Then
        intButton = oShell.Popup("Execute " & strFinalCommand & "?",,_
            "System " & oItem.Name, vbYesno + vbQuestion)
        End If
 
        If (boolConfirm = False) Or (intButton = vbYes) Then
            WScript.Echo " Executing: " & strFinalCommand
            execute strFinalCommand
        End If
    End If
Next
 
' All done; clean up
Set oItem = Nothing
Set oRegEx = Nothing
Set oDomain = Nothing
Set oShell = Nothing
Set oArgs = Nothing
 
'
' Get the arguments for our run. Gleam them all from the command line, if provided.
' If any are missing, prompt for the input. A blank input is used to signal an abort.
'
' /Y is an optional last argument
Sub GetArguments
    Dim i, strConfirm, intButton
    Set oArgs = WScript.Arguments
 
    boolConfirm = True ' assume always confirm
    strDomain = "" ' domain to be traversed
    strSpec = "" ' name specification to be matched
    strCommand = "" ' command to be executed on each match
    strConfirm = "" ' track prompting for confirmation setting

    ' Look for our optional 4th argument
    If oArgs.Length = 4 Then
        If UCase(oArgs.Item(3)) = "/Y" Then
            boolConfirm = False
            strConfirm = "/Y" ' don't prompt below
        End If
    End If
 
    ' Look for any specified arguments, in order
    If oArgs.Length >= 1 Then strDomain = oArgs(0)
    If oArgs.Length >= 2 Then strSpec = oArgs(1)
    If oArgs.Length >= 3 Then strCommand = oArgs(2)
 
    ' Prompt for any arguments not specified on the command line
    If strDomain = "" Then
        strDomain = InputBox _
            ("Enter the name of the NT Domain to be traversed", _
            "NT Domain")
    End If
 
    If strDomain = "" Then WScript.Quit
    strDomain = UCase(strDomain)
 
    If strSpec = "" Then
        strSpec = InputBox _
            ("Enter your name specification for the computer(s) " & _
            "that will be matched within the " & strDomain & " Domain." & _
            vbCrlf & "Regular Expressions are acceptable.", _
            "Name Specification")
    End If
    If strSpec = "" Then WScript.Quit
 
    If strCommand = "" Then
        strCommand = InputBox _
            ("Enter the command to be executed on each computer matching " & _
            strSpec & " within the " & strDomain & " Domain." & _
            vbCrlf & "$n will be substituted for the computer name.", _
            "Command to Execute")
    End If
    If strCommand = "" Then WScript.Quit
 
    If strConfirm = "" Then
        intButton = oShell.Popup("Confirm each command prior to execution?",,_
            "Confirm?", vbYesNo + vbQuestion)
        If intButton = vbNo Then
            boolConfirm = False
        End If
    End If
End Sub
 
' Execute a command. The command is always run under a new instance of the command
' processor. This allows the use of built-in commands and I/O redirection.
'
' We won't wait for command completion.
Sub Execute(strCommand)
    Dim RetVal
 
    strCommand = "%COMSPEC% /c " & strCommand
 
    RetVal = oShell.Run(strCommand, 1, False)
End Sub

특정 디렉토리 및 하위 디렉토리에 존재하는 파일 출력하기

FileSystemObject를 사용하면 된다.

On Error Resume Next
 
Dim FSO
Dim FileDic
Dim DataPath
 
DataPath = "\\cutieserver\DataBackup\DATA"
 
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FileDic = CreateObject("Scripting.Dictionary")
 
GenerateFileDictionary DataPath, FileDic
keys = FileDic.Keys
values = FileDic.Items
For i=0 To FileDic.Count - 1
    WScript.Echo keys(i) + "," + values(i)
Next
 
Sub GenerateFileDictionary(path, dic)
    Set folder = FSO.GetFolder(path)
    Set files = folder.Files
    Set subfolders = folder.SubFolders
 
    For Each file In files
        If dic.Exists(file.Name) = false Then
            dic.Add file.Name, file.Path
        End If
    Next
 
    For Each subfolder In subfolders
        GenerateFileDictionary subfolder.Path, dic
    Next
End Sub

디스크 조각 모음 실행하기

C, D 두 개의 드라이브가 있는 경우를 위한 스크립트다.

On Error Resume Next
 
Set WshShell = WScript.CreateObject ( "WScript.Shell" )
DefragAppWindowName = "디스크 조각 모음"
DefragMsgWindowName = "조각 모음 완료"
 
' 디스크 조각 모음을 실행한다.
WshShell.Run "dfrg.msc"
WScript.Sleep 1000
 
' 애플리케이션이 로드될 때까지 기다린다.
While WshShell.AppActivate(DefragAppWindowName) = FALSE
	wscript.sleep 1000
Wend
 
' 디스크 조각 모음 창을 활성화시킨다.
WshShell.AppActivate DefragAppWindowName
WScript.Sleep 200
 
' "동작" 메뉴를 활성화시키기 위해 ALT+A 키를 보낸다.
WshShell.SendKeys "%A"
WScript.Sleep 200
 
' "조각 모음" 메뉴를 실행하기 위해 D 키를 보낸다.
WshShell.SendKeys "D"
 
' 조각 모음이 끝날 때가지 5초마다 폴링하면서 기다린다
While WshShell.AppActivate(DefragMsgWindowName) = FALSE
	wscript.sleep 5000
Wend
 
' 메시지 박스를 활성화시킨다.
WshShell.AppActivate DefragMsgWindowName
WScript.Sleep 200
 
' 닫기 버튼을 활성화시키기 위해 탭 키를 보낸다.
WshShell.Sendkeys "{TAB}"
Wscript.Sleep 500
 
' 메시지 박스를 닫는다
WshShell.Sendkeys "{ENTER}"
Wscript.Sleep 500
 
' 디스크 조각 모음 창을 다시 활성화시킨다.
WshShell.AppActivate DefragAppWindowName
WScript.Sleep 200
 
' 볼륨 리스트로 포커스를 옮기기 위해 탭 키를 보낸다.
WshShell.Sendkeys "{TAB}"
Wscript.Sleep 500
 
' D 드라이브를 활성화시키기 위해 "DOWN" 키를 보낸다.
WshShell.Sendkeys "{DOWN}"
WScript.Sleep 500
 
' "동작" 메뉴를 활성화시키기 위해 ALT+A 키를 보낸다.
WshShell.SendKeys "%A"
WScript.Sleep 200
 
' "조각 모음" 메뉴를 실행하기 위해 D 키를 보낸다.
WshShell.SendKeys "D"
 
' 조각 모음이 끝날 때가지 5초마다 폴링하면서 기다린다
While WshShell.AppActivate(DefragMsgWindowName) = FALSE
	wscript.sleep 5000
Wend
 
' 메시지 박스를 활성화시킨다.
WshShell.AppActivate DefragMsgWindowName
WScript.Sleep 200
 
' 닫기 버튼을 활성화시키기 위해 탭 키를 보낸다.
WshShell.Sendkeys "{TAB}"
Wscript.Sleep 500
 
' 메시지 박스를 닫는다
WshShell.Sendkeys "{ENTER}"
Wscript.Sleep 500
 
' 디스크 조각 모음 창을 다시 활성화시킨다.
WshShell.AppActivate DefragAppWindowName
WScript.Sleep 200
 
' 창을 닫는다.
WshShell.Sendkeys "%{F4}"
 
' 이벤트 로그에다 로그를 남긴다.
WshShell.LogEvent 0, "디스크 조각 모음이 완료되었습니다"

소스를 보면 대충 알 수 있겠지만, 매크로 프로그램과 같은 방식으로 처리를 한다. 그러므로 동작 중에 마우스로 포커스를 여기저기 옮긴다던가 하면 제대로 동작하지 않는다. 어디까지나 사람이 컴퓨터 앞에 앉아있지 않을 경우를 위한 것이다.

네트워크 드라이브 매핑하기

Dim net
Set net = CreateObject("WScript.Network")    
net.MapNetworkDrive "I:", "\\computer2\public","True"

마지막 불린 값은 해당하는 네트워크 드라이브를 계속 유지할 것인가의 여부이다.

다른 프로그램 실행하기

WshShell 오브젝트의 Run 메서드를 이용하면 된다.

WshShell.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

strCommand : 실행할 명령 문자열

intWindowStyle

intWindowStyle Description
0 Hides the window and activates another window.
1 Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window for the first time.
2 Activates the window and displays it as a minimized window.
3 Activates the window and displays it as a maximized window.
4 Displays a window in its most recent size and position. The active window remains active.
5 Activates the window and displays it in its current size and position.
6 Minimizes the specified window and activates the next top-level window in the Z order.
7 Displays the window as a minimized window. The active window remains active.
8 Displays the window in its current state. The active window remains active.
9 Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window.
10 Sets the show-state based on the state of the program that started the application.

WaitOnReturn : 실행한 명령이 끝날 때까지 기다리는가의 여부.

샘플

Set WshShell = WScript.CreateObject("WScript.Shell")
rvalue = WshShell.Run("notepad " & WScript.ScriptFullName, 1, true)

실행한 프로그램의 상태를 계속 모니터링하면서 뭔가 작업하기를 원한다면, Exec 메서드를 사용하는 것이 좋다. 안타깝게도 커맨드 프롬프트 프로그램만 사용 가능하다. 하지만 스탠다드 스트림을 액세스할 수 있기 때문에, 일괄 작업에는 이쪽이 더 낫다. 이에 관한 사항은 여기를 참고.

WshShell.Exec(strCommand)

샘플

Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
 
Set oExec = WshShell.Exec("calc")
 
Do While oExec.Status = 0
     WScript.Sleep 100
Loop
 
WScript.Echo oExec.Status

파일들의 버전 알아내기

On Error Resume Next
 
Dim fso, ext, folder, files, file, ts, filename, version, f, sh, desktop
Set fso = CreateObject("Scripting.FileSystemObject")
Set sh = CreateObject("WScript.Shell")
 
' %SYSTEM32% 폴더 안의 파일 목록을 얻어온다.
Set folder = fso.GetSpecialFolder(1) 
Set files = folder.files
 
' 데스크탑 폴더의 패스를 얻어와 출력용 텍스트 파일을 생성한다.
desktop = sh.SpecialFolders("Desktop")
Set ts = fso.CreateTextFile(desktop & "\versions.txt", True)
 
' 진행율 표시를 위해 익스플로러를 띄운다
Set objExplorer = WScript.CreateObject _
    ("InternetExplorer.Application", "IE_")
objExplorer.Navigate "about:blank"   
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width = 400
objExplorer.Height = 250 
objExplorer.Left = 0
objExplorer.Top = 0 
objExplorer.Visible = 1            
Set objDocument = objExplorer.Document     
objDocument.Open   
objDocument.Writeln "총 " & files.Count & " 파일<BR>"
objDocument.Writeln "검사 중입니다.<BR>"
 
' 파일들의 목록을 횡단하면서, 
' 확장자가 DLL 또는 OCX인 경우, 이름과 함께 버전을 텍스트 파일에다 기록한다.
for each f in files
    file = fso.GetAbsolutePathName(f)
    ext = fso.GetExtensionName(file)
    if UCase(ext) = "DLL" or UCase(ext) = "OCX" then
        version = fso.GetFileVersion(file)
        filename = fso.GetFileName(file)
        ts.Writeline filename & " " & version
    end if
 
    ' 진행율 표시
    objDocument.Writeln "*"
next
 
ts.close
objExplorer.Quit
WScript.Echo "검사 완료"
 
Set ts = nothing
Set folder = nothing
Set files = nothing

사용자 로그온/로그오프 기록 이벤트 로그에 남기기

대강 다음과 같은 스크립트를 만든 다음 어딘가에 저장한다.

Set ws = WScript.CreateObject("WScript.Shell")
username = ws.ExpandEnvironmentStrings("%USERNAME%")
ws.LogEvent 0, "User [" & username & "] Logged on " & Date & " " & Time

그 다음 “MMC → 그룹정책 → 사용자 구성 → Windows 설정 → 스크립트”에 가서 스크립트를 설정하면 된다.

마지막으로 로그온한 사용자 알아내기

Set LoginProfiles = GetObject("winmgmts:").InstancesOf ("Win32_NetworkLoginProfile")
For Each Profile In LoginProfiles 
WScript.Echo Profile.Name
WScript.Echo Profile.LastLogon
Next

여러 컴퓨터에 있는 이벤트 로그 모으기

여러 컴퓨터의 페이지파일 크기 바꾸기

kb/windowsscriptsnippets.txt · 마지막으로 수정됨: 2014/11/10 16:23 (바깥 편집)