Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTextFile = objFSO.OpenTextFile _ ("c:\scripts\servers.txt", ForReading)
Do Until objTextFile.AtEndOfStream strComputer = objTextFile.ReadLine Wscript.Echo strComputer Loop
objTextFile.Close
이런 식으로 텍스트 파일을 읽는 것은 별다른 문제 없이 잘 동작합니다. 하지만 왜 한꺼번에 텍스트 파일을 읽어 메모리에 저장된 목록을 사용하여 작업하고 싶어하는지 그 이유는 잘 알고 있습니다. 텍스트 파일이 원격 컴퓨터에 있다면, 텍스트 파일에서 단 한 줄을 읽기 위해 네트워크를 통해 연결해야 함은 물론 만일 원격 컴퓨터가 다운되는 경우 스크립트 역시 다운됩니다.
그럼 텍스트 파일을 한꺼번에 읽어 정보를 변수에 저장한 다음 메모리에 저장된 컴퓨터 목록을 사용해서 작업할 수 있을까요? 다음 코드에서 볼 수 있듯 물론 할 수 있습니다.
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTextFile = objFSO.OpenTextFile _ ("c:\scripts\servers.txt", ForReading)
strText = objTextFile.ReadAll objTextFile.Close
arrComputers = Split(strText, vbCrLf)
For Each strComputer in arrComputers Wscript.Echo strComputer Next
이 스크립트가 어떻게 작동하는지 설명하겠습니다. 이전에 사용하던 스크립트와 같이 상수(ForReading)를 하나 만들어 값을 1로 할당합니다. 이 값은 FileSystemObject를 사용하여 텍스트 파일을 읽을 때 필요합니다. 그런 다음 FileSystemObject의 인스턴스를 만들고 OpenTextFile 메서드를 사용하여 C:\Scripts\Servers.txt 파일을 엽니다. 여기까지는 이미 알고 계실 것입니다.
여기서부터 정말 중요한 부분이 나옵니다. 파일을 한 줄씩 읽는 대신 ReadAll 메서드를 사용하여 텍스트 파일 전체를 한 번에 읽어 파일의 내용을 strText 변수에 저장합니다. strText 변수는 이제 텍스트 파일의 정확한 복제본인 셈입니다. 여러분의 텍스트 파일이 다음과 같다고 가정해 봅시다.
atl-ws-01 atl-ws-02 atl-ws-03 atl-ws-04
자, 이제 strText 값을 출력하면 화면에 어떤 내용이 표시될지 맞춰보십시오. 예, 예상대로 다음과 같이 출력됩니다.
atl-ws-01 atl-ws-02 atl-ws-03 atl-ws-04
이제 전체 텍스트 파일을 읽어 변수에 저장하는 데까지 성공했습니다. 하지만 strText를 사용하여 컴퓨터에 연결하면 하나의 컴퓨터가 아닌 전체 텍스트 파일에 연결하게 되어 작업이 실패하므로 이 스크립트는 별로 도움이 안 됩니다. 따라서 한 번에 하나의 컴퓨터만 연결할 수 있도록 각각의 컴퓨터 이름을 구분하는 방법이 필요합니다.
다음 코드로 이 문제는 해결됩니다.
arrComputers = Split(strText, vbCrLf)
Split 명령은 데이터(이 경우 strText 변수)를 가져와 배열로 만듭니다. 이 명령이 어떻게 컴퓨터 이름이 끝나는 부분과 다음 이름이 시작하는 부분을 알 수 있을까요? 이 예에서 각 컴퓨터를 구분하는 "구분 기호"는 캐리지 리턴 줄 바꿈입니다. 즉, 텍스트 파일에서 컴퓨터 이름을 하나 입력한 다음 Enter 키를 누르고 다음 컴퓨터 이름을 입력합니다. Split 함수와 함께 사용된 VBScript 상수 vbCrLf는 Enter 키를 나타냅니다. strText가 다음과 같다고 가정해 봅시다.
atl-ws-01,atl-ws-02,atl-ws-03,atl-ws-04
이 경우 구분 기호로 쉼표를 사용했고 Split 명령은 다음과 같습니다.
arrComputers = Split(strText, ",")
즉, Split 함수에 변수 이름과 구분 기호를 지정하면 나머지는 알아서 처리됩니다.
컴퓨터 이름을 배열에 나열한 다음에는 For Each 루프를 사용하여 배열의 각 항목을 반복할 수 있습니다.
For Each strComputer in arrComputers Wscript.Echo strComputer Next
이번엔 보다 현실적인 예를 소개하겠습니다. 다음 샘플 스크립트는 WMI를 사용하여 텍스트 파일에 있는 각 컴퓨터에 연결한 다음 설치된 운영 체제의 이름을 검색합니다.
For Each strComputer in arrComputers Wscript.Echo strComputer Next
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
("c:\scripts\servers.txt", ForReading)
strText = objTextFile.ReadAll
objTextFile.Close
arrComputers = Split(strText, vbCrLf)
For Each strComputer in arrComputers
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_OperatingSystem")
For Each objItem in ColItems
Wscript.Echo strComputer & ": " & objItem.Caption
Next
Next
|