특정 날짜 이전의 모든 파일을 삭제하려면 어떻게 해야 하나요?


Q 안녕하세요, Scripting Guy! 컴퓨터에서 특정 날짜 이전의 모든 파일을 검색하여 자동으로 삭제하는 스크립트를 만들려고 합니다. 어떻게 하면 되나요?

-- GM
A 안녕하세요, GM님. 컴퓨터에서 이전 파일을 모두 검색하여 삭제하는 스크립트는 작성하실 수 있나요? 물론 그와 같은 스크립트는 작성하실 수 있을 것입니다. 그렇다면 컴퓨터에서 이전 파일을 모두 검색하여 삭제하는 스크립트는 왜 작성해야만 할까요? 잠시 후에 이 문제를 살펴보겠습니다.

먼저 다음 코드를 살펴봅시다. 다음은 컴퓨터에서 2003년 11월 2일 이전에 만든 모든 파일을 검색하여 각 파일의 이름을 표시하는 스크립트입니다.

strDate = "20031102000000.000000+000"

strComputer = "."
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
    ("Select * From CIM_DataFile Where CreationDate < '" & strDate & "'")
For Each objFile in colFiles
    Wscript.Echo objFile.Name
Next

문제는 과연 스크립트에서 대상이 되는 2003년 11월 2일을 어떻게 인식하느냐 하는 것입니다. 현재 스크립트에는 2003년 11월 2일이 어느 위치에도 표시되어 있지 않습니다.

그러나 날짜처럼 보이지 않지만 변수 strDate에 할당된 값인 20031102000000.000000+000은 2003년 11월 2일을 나타냅니다. 날짜가 이렇게 표시되는 것은 WMI가 UTC(Universal Time Coordinate) 형식을 사용하기 때문입니다. UTC 형식을 사용하는 경우, 처음 4자리(2003)는 연도를, 다음 2자리(11)는 월을, 그 다음 2자리(02)는 일을 나타냅니다. 다시 말해, 2003110211/02/2003과 같습니다.

마찬가지로 그 다음 6자리는 24시간 형식의 시, 분, 초를 나타냅니다. 여기서는 특정 시간을 고려하지 않으므로(예: 2003년 11월 2일, 오후 2시 37분 전에 만든 파일을 검색하지 않음) 0으로 두었습니다. 그 다음 6자리는 밀리초를 나타내므로 항상 0으로 두어야 합니다. 마지막으로 +000은 그리니치 표준시의 오프셋을 나타냅니다. 이 오프셋을 사용하면 서로 다른 시간대에 있는 컴퓨터의 날짜와 시간을 조정할 수 있으나 여기서는 이 요소를 고려하지 않습니다. 대신 이 오프셋을 +000A¸로 두어 컴퓨터가 현지 시간으로 작동되도록 합니다.

그러면 이러한 UTC 형식으로 날짜와 시간을 전달해야만 할까요? 그렇습니다. Windows 2000 및 이전 버전의 Windows에서는 이러한 형식으로 날짜를 입력해야 합니다. 그러나 Windows XP 및 Windows 2003에는 사용자가 이전의 일반적인 날짜(예: 11/2/2003)를 입력해도 자동으로 UTC 형식의 날짜로 변환하는 SWbemDateTime이라는 새로운 WMI 개체가 있습니다.

Scripting Guy 알림 SWbemDateTime에 대한 자세한 내용을 원하십니까? 그렇다면 1월에 발행될 Scripting Week 2를 기다려 주십시오.

날짜를 strDate에 할당하는 줄 이후의 나머지 스크립트는 이전의 일반 WMI 스크립트입니다. 이 스크립트는 11/2/2003 이전의 CreationDate를 가진 모든 파일을 검색하여 파일을 찾으면 그 이름을 표시합니다.

이전 파일을 삭제하는 스크립트가 필요하므로 이 작업을 위해 Wscript.Echo objFile.Name AU을 다음 코드 줄로 바꿉니다.

objFile.Delete

이 코드 줄을 스크립트에 왜 삽입하지 않았을까요? 그 이유는 이 스크립트를 실제로 실행하기 전에 한번 더 고려해 보기 위해서입니다. 컴퓨터에 하나의 디스크 드라이브(C)가 있다고 가정해 봅시다. 정말로 스크립트를 실행하여 2003년 11월 2일 이전에 만든 모든 파일을 삭제하시겠습니까? 그러면 대부분의 운영 체제와 응용 프로그램 파일을 삭제하게 됩니다. 일반적으로 그와 같은 경우를 원하지는 않을 것입니다.

따라서 파일 검색은 훨씬 더 정교하게 수행해야 합니다. 예를 들어, 컴퓨터에 두 개의 드라이브가 있을 수 있습니다. 드라이브 C에는 운영 체제와 모든 응용 프로그램이, 드라이브 D에는 모든 문서가 저장되어 있습니다. 이 경우 드라이브 D에 대해서만 2003년 11월 2일 이전에 만들어진 파일을 검색하는 WQL 쿼리를 작성할 수 있습니다.

strDate = "20031102000000.000000+000"

strComputer = "."
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
    ("Select * From CIM_DataFile Where CreationDate < '" & strDate & "'" & _
        " AND Drive = 'D:'")
For Each objFile in colFiles
    Wscript.Echo objFile.Name
Next

또는, 사용하지 않는 이전의 Word 문서를 검색하려고 할 수 있습니다. 이 경우에는 2003년 11월 2일 이전에 만들어진 파일 중에서 확장명이 doc인 파일만 검색합니다.

strDate = "20031102000000.000000+000"

strComputer = "."
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
    ("Select * From CIM_DataFile Where CreationDate < '" & strDate & "'" & _
        " AND Extension = 'doc'")
For Each objFile in colFiles
    Wscript.Echo objFile.Name
Next

이 외에도 정교한 검색 방법이 많이 있습니다. 자세한 내용은 Microsoft Windows 2000 Scripting Guide(영문)에서 Files and Folders  장을 참조하십시오.

많은 사용자들이 파일이 마지막으로 수정된 시간을 기준으로 파일을 검색할 수 있는지 물어 봅니다. 이러한 경우 위 스크립트에서 CreationDate를 지우고 LastModified를 삽입하면 됩니다. 해당 스크립트는 다음과 같습니다.

strDate = "20031102000000.000000+000"

strComputer = "."
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
    ("Select * From CIM_DataFile Where LastModified < '" & strDate & "'")
For Each objFile in colFiles
    Wscript.Echo objFile.Name
Next

+ Recent posts