2013-03-21 1 views
1

나는 현재 프로그램을 실행하는 동안 프로그램의 파일을 자동으로 삭제하려고합니다. Windows에서 파일을 수동으로 삭제하면 프로그램에서 변경 사항을 인식하지만, 스크립트로 파일을 삭제하면 이 아닌이 아닙니다.스크립트에 의한 수동 삭제와 삭제의 차이점은 무엇입니까? (박쥐 또는 VB)

모든 파일이 삭제됩니다. 나는 배트와 vbs 스크립트를 시도하고 스크립트를 수동으로 그리고/또는 프로그램 내에서 호출하여 실행했다 - 항상 같은 결과로 : 수동 삭제는 인식되고 스크립팅 된 삭제는 아니다. 필자는 LUA 4.0에서 자동으로 파일을 삭제하는 스크립트/실행 파일을 호출 할 수 있다는 점을 언급해야합니다.

Windows에서 파일을 삭제하고 스크립트에 의한 삭제와 다른 점이 있다면 정확히 어떻게됩니까? 100 % Windows 삭제 루틴을 에뮬레이트하는 방법이 있습니까? 아니면 내가 모르는 비밀스런 '폴더가 업데이트되었습니다'플래그가 있습니까? 자연 폴더 속성 DateLastAccessedDateLastModified이 업데이트되었습니다. 완성도를 위해서

여기 (그들은 *Random*.level에 맞는 기존 파일을 삭제하고 빈 폴더를 제거) 내 스크립트입니다 :

BAT :

REM delete all "Random" maps 
del /S *Random*.level 
REM remove empty folders 
for /f "delims=" %%d in ('dir /S /B /A:D ^| sort /r') do rd "%%d" 

VBS :

' create shell 
Set objShell = CreateObject("Wscript.Shell") 
' get current path 
strPath = objShell.CurrentDirectory 
' create file system object 
Set oFSO = CreateObject("Scripting.FileSystemObject") 
' delete all random level files 
ProcessSubFolders oFSO.GetFolder(strPath) 


Sub ProcessSubFolders(oFolder) 
    ' get all files in the folder 
    Set cFiles = oFolder.Files 
    ' for every file 
    For Each oFile In cFiles 
     ' check if it's a level file and has "Random" in its name 
     If Right(oFile.Name, Len(".level")) = ".level" And InStr(oFile.Name, "Random") Then 
      ' if true delete it 
      oFile.Delete 
     End If 
    Next 

    ' process all subfolders in the same manner 
    For Each oSubFolder In oFolder.SubFolders 
     ProcessSubFolders oSubFolder 
    Next 

    ' if folder is empty 
    If oFolder.SubFolders.Count = 0 And oFolder.Files.Count = 0 Then 
     ' delete it 
     oFolder.Delete 
    End If 
End Sub 
+0

두 스크립트는 "수동"삭제와 같은 방식으로 파일을 삭제해야합니다. 삭제를 "인식"하지 않는 코드를 게시하십시오. –

답변

3

Shell.Application 개체는 파일 시스템 작업을 마치 manually initiated 인 것처럼 수행 할 수 있습니다. 예를 들어 Folder.CopyHere 메서드를 사용하면 파일을 Windows Compressed Folders으로 복사하여 zip 파일을 만들 수 있습니다. 파일 복사 진행률 표시 줄과 모든 것을 볼 수 있습니다.

따라서 확장자가 동일하면 파일 삭제를 수행하는 데 동일한 Shell.Application 개체를 사용하면 수동 파일 삭제와 동일한 동작을합니다. 다음은 내 이론을 테스트하기 위해 작성한 간단한 JScript 스크립트입니다.

var shl = new ActiveXObject("Shell.Application"); 
var items = shl.NameSpace("c:\\users\\me\\desktop").Items(); 

for (var i=0; i<items.Count; i++) { 
    if (/\.tmp$/i.test(items.Item(i).Name)) { 
     WSH.Echo('deleting ' + items.Item(i).Name); 
     items.Item(i).InvokeVerb('delete'); 
    } 
} 

... * 내 데스크탑에서 * .tmp를 삭제합니다. 불행히도, 그것이 발생하는 각 .tmp 파일에 대해 "이 파일을 휴지통으로 보내시겠습니까?"라는 확인 창이 나타납니다. 복잡한 조사에서 only workaround I've seen은 파일을 삭제하는 대신 파일을 임시 폴더로 이동 한 다음 폴더를 삭제합니다. 그게 당신의 조건을 만족 시킬지 아닌지는 잘 모르겠지만, 실험을해볼 가치가 있다고 생각합니다.