사용자 도구

사이트 도구


kb:windowsscriptsnippets

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:windowsscriptsnippets [2014/11/10 16:23] (현재)
줄 1: 줄 1:
 +{{INLINETOC}}
 +\\
 +
 +====== Windows Script / Snippets ======
 +...
 +
 +====== 공유 폴더에 사용자 추가하기 ======
 +{{windowsscriptsnippets_adduser.vbs}}
 +
 +익스플로러 상에서 직접 실행하면 각종 인수들을 입력하라는 대화창이 뜬다. 이게 싫으면 커맨드 라인에서 다음과 같은 형식으로 실행한다.
 +<​code>​
 +cscript adduser.vbs /​option1:​value /​option2:​value ...
 +</​code>​
 +
 +옵션의 목록은 다음과 같다.
 +
 +^ 옵션 ^ 가능한 값 ^
 +| host | 컴퓨터 이름 또는 IP 주소 |
 +| share | 공유 이름. 경로가 아니라 공유 이름이니 주의. |
 +| domain | 도메인 |
 +| account | 계정 또는 그룹 이름 |
 +| acc_type | user / group |
 +| ace_type | allow / deny / audit |
 +| access | read / change / full / none |
 +| prop | true / false |
 +
 +
 +====== 메일 보내기 ======
 +테스트해보니 된다. 아웃룩 설치 여부는 무관하다. 패스워드를 입력하지 않는데, 어떻게 전송되는 거지...? 액티브 디렉토리 같은 걸 통해 자동으로 인증이 되는 모양이다.
 +<code vb>
 +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
 +</​code>​
 +
 +
 +====== 일정 시간 지난 파일 삭제하기 ======
 +특정 폴더 내에서 일정 시간이 지난 파일을 삭제하는 예제다.
 +<code vb>
 +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
 +</​code>​
 +
 +====== 특정 파일 FTP로 업로드하기 ======
 +기본 ftp 프로그램의 -s 기능을 이용한다. 아래의 예제에서는 파일의 이름이 YYYYMMDDData.csv 형식으로 되어있다고 간주한다. 해당 파일은 시스템 어딘가에서 날마다 생성되는 파일이라고 생각하면 되겠다.
 +<code vb>
 +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
 +</​code>​
 +
 +====== 소스 백업하기 ======
 +작업 디렉토리(CWD)에 주의...
 +<code vb>
 +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
 +</​code>​
 +
 +
 +====== 스크립트 출력을 클립 보드로 복사하기 ======
 +from [[http://​www.microsoft.com/​technet/​scriptcenter/​resources/​qanda/​aug04/​hey0813.mspx | Can I Copy Script Output to the Clipboard?​]]
 +
 +인터넷 익스플로러 오브젝트를 이용하면 된다.
 +<code vb>
 +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
 +</​code>​
 +
 +Windows 2000 리소스킷에 clip.exe라는 프로그램이 파이프로 입력을 받아들여,​ 클립보드에다 복사해주는 기능을 했었는데,​ 왜 XP 리소스킷에서는 없어진 것일까? 어쨌든 clip.exe를 가져오면,​ 에코 문자열을 파이프를 통해서도 복사할 수 있다.
 +
 +====== GUI 형태로 사용자 입력 받아들이기 ======
 +from [[http://​www.microsoft.com/​technet/​scriptcenter/​resources/​qanda/​nov04/​hey1101.mspx | How Can I Make Selections from a Form When Using a Script?]]
 +
 +Windows Script Host만으로는 GUI를 생성할 수 없다. 하지만 HTA(HTML Application)이라는 기능을 이용하면 가능하다. 아래에 나오는 내용을 test.hta라는 이름으로 저장해서 실행하면 된다. 확장자가 반드시 "​HTA"​이어야한다.
 +
 +<code vb>
 +<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>​
 +</​code>​
 +
 +====== 사운드(WAV) 플레이하기 ======
 +<code vb>
 +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
 +</​code>​
 +
 +====== TCP 성능 데이터 얻어내기 ======
 +from [[http://​myitforum.techtarget.com/​articles/​11/​view.asp?​track=NL-390&​ad=492933&​id=7859 | Getting TCP Performance Data]]
 +
 +<code vb>
 +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
 +</​code>​
 +
 +====== 원격 컴퓨터에서 프로그램 실행하기 ======
 +[[WMI]]를 이용한다.
 +<code vb>
 +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
 +</​code>​
 +
 +====== 도메인 안에 있는 여러 대의 컴퓨터에서 특정 명령 수행하기 ======
 +from [[http://​myitforum.techtarget.com/​articles/​11/​view.asp?​id=2303 | Executing a Command on each Computer in a Domain]]
 +
 +Syntax:
 +<​code>​
 +ExexcuteAll <​DomainToTraverse>​ <​ComputerSpecification>​ <​Command>​ [/Y]
 +</​code>​
 +
 +Example:
 +<​code>​
 +ExexcuteAll MYDOMAIN WKSATL* "del \\$n\admin$\activitylog.txt"​
 +</​code>​
 +
 +ExecuteAll.vbs
 +<code vb>
 +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
 +</​code>​
 +
 +====== 특정 디렉토리 및 하위 디렉토리에 존재하는 파일 출력하기 ======
 +FileSystemObject를 사용하면 된다.
 +<code vb>
 +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
 +</​code>​
 +
 +====== 디스크 조각 모음 실행하기 ======
 +C, D 두 개의 드라이브가 있는 경우를 위한 스크립트다.
 +<code vb>
 +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, "​디스크 조각 모음이 완료되었습니다"​
 +</​code>​ 소스를 보면 대충 알 수 있겠지만,​ 매크로 프로그램과 같은 방식으로 처리를 한다. 그러므로 동작 중에 마우스로 포커스를 여기저기 옮긴다던가 하면 제대로 동작하지 않는다. 어디까지나 사람이 컴퓨터 앞에 앉아있지 않을 경우를 위한 것이다.
 +
 +
 +====== 네트워크 드라이브 매핑하기 ======
 +<code vb>
 +Dim net
 +Set net = CreateObject("​WScript.Network"​) ​   ​
 +net.MapNetworkDrive "​I:",​ "​\\computer2\public","​True"​
 +</​code>​ 마지막 불린 값은 해당하는 네트워크 드라이브를 계속 유지할 것인가의 여부이다.
 +
 +
 +====== 다른 프로그램 실행하기 ======
 +WshShell 오브젝트의 Run 메서드를 이용하면 된다.
 +<​code>​
 +WshShell.Run(strCommand,​ [intWindowStyle],​ [bWaitOnReturn])
 +</​code>​
 +
 +**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** : 실행한 명령이 끝날 때까지 기다리는가의 여부.
 +
 +샘플
 +<code vb>
 +Set WshShell = WScript.CreateObject("​WScript.Shell"​)
 +rvalue = WshShell.Run("​notepad " & WScript.ScriptFullName,​ 1, true)
 +</​code>​
 +
 +실행한 프로그램의 상태를 계속 모니터링하면서 뭔가 작업하기를 원한다면,​ Exec 메서드를 사용하는 것이 좋다. 안타깝게도 커맨드 프롬프트 프로그램만 사용 가능하다. 하지만 스탠다드 스트림을 액세스할 수 있기 때문에, 일괄 작업에는 이쪽이 더 낫다. 이에 관한 사항은 [[http://​msdn.microsoft.com/​library/​default.asp?​url=/​library/​en-us/​script56/​html/​wsconDrivingApplications.asp?​frame=true | 여기]]를 참고.
 +
 +<​code>​
 +WshShell.Exec(strCommand)
 +</​code>​
 +
 +샘플
 +<code vb>
 +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
 +</​code>​
 +
 +====== 파일들의 버전 알아내기 ======
 +<code vb>
 +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
 +</​code>​
 +
 +====== 사용자 로그온/​로그오프 기록 이벤트 로그에 남기기 ======
 +대강 다음과 같은 스크립트를 만든 다음 어딘가에 저장한다.
 +
 +<code vb>
 +Set ws = WScript.CreateObject("​WScript.Shell"​)
 +username = ws.ExpandEnvironmentStrings("​%USERNAME%"​)
 +ws.LogEvent 0, "User [" & username & "] Logged on " & Date & " " & Time
 +</​code>​
 +
 +그 다음 "MMC -> 그룹정책 -> 사용자 구성 -> Windows 설정 -> 스크립트"​에 가서 스크립트를 설정하면 된다.
 +
 +
 +====== 마지막으로 로그온한 사용자 알아내기 ======
 +<code vb>
 +Set LoginProfiles = GetObject("​winmgmts:"​).InstancesOf ("​Win32_NetworkLoginProfile"​)
 +For Each Profile In LoginProfiles ​
 +WScript.Echo Profile.Name
 +WScript.Echo Profile.LastLogon
 +Next
 +</​code>​
 +
 +====== 여러 컴퓨터에 있는 이벤트 로그 모으기 ======
 +{{windowsscriptsnippets_win32eventrealtime.wsf}}
 +
 +
 +====== 여러 컴퓨터의 페이지파일 크기 바꾸기 ======
 +{{windowsscriptsnippets_pagefile.vbs}}
 +
 +----
 +  * see also [[WindowsScript]]
  
kb/windowsscriptsnippets.txt · 마지막으로 수정됨: 2014/11/10 16:23 (바깥 편집)