안녕하세요, Scripting Guy! - 텍스트 파일에서 한 줄씩 읽는 대신 전체 텍스트를 보고 싶습니다.


새로운 TechNet 칼럼에 오신 것을 환영합니다. 이 칼럼에서는 Microsoft Scripting Guy가 시스템 관리 스크립팅과 관련하여 자주 물어보는 질문에 대한 답변을 드립니다. 시스템 관리 스크립팅에 대해 궁금한 내용이 있으십니까? 그렇다면scripter@microsoft.com으로 전자 메일을 보내십시오. 모든 질문을 다룰 수는 없지만 최선을 다해 답변을 드리겠습니다.

오늘의 질문: 텍스트 파일을 한 줄씩 읽지 않고 전체 텍스트를 한꺼번에 읽고 싶습니다.


텍스트 파일에서 한 줄씩 읽는 대신 전체 텍스트를 보고 싶습니다.

Q 안녕하세요, Scripting Guy! 저는 지금 컴퓨터 이름이 들어 있는 텍스트 파일을 여는 스크립트를 사용하고 있습니다. 이 스크립트는 파일의 첫 번째 줄을 읽어 해당 컴퓨터에 연결한 다음 두 번째 줄을 읽어 다시 해당 컴퓨터에 연결합니다. 하지만 텍스트 파일을 계속해서 읽을 필요가 없도록 컴퓨터 이름을 변수 등에 저장할 수 있는 방법은 없을까요?

-- 상혁
A
상혁님의 스크립트가 다음과 비슷하다고 가정하겠습니다. 이 샘플 스크립트에서 텍스트 파일(servers.txt)을 열고 첫 번째 줄을 읽은 다음 컴퓨터 이름을 출력합니다. 여기서 파일에는 한 줄에 하나의 컴퓨터 이름이 나열되어 있다고 가정합니다. 아마 지금쯤 여러분은 스크립트를 사용하여 원격 컴퓨터에 연결하려고 할 것입니다. 그런 다음 텍스트 파일의 두 번째 줄을 읽고 해당 컴퓨터의 이름을 출력한 다음 다시 세 번째 줄을 읽는 방식으로 파일의 모든 줄을 읽을 때까지 반복합니다.
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

자세한 정보

자세한 내용은 안녕하세요, Scripting Guy! - Archive  를 참조하십시오.

페이지 맨 위로 페이지 맨 위로