2

現在、プログラムの実行中にプログラムのファイルを自動的に削除しようとしています。Windows でファイルを手動で削除した場合、プログラムは変更を認識しますが、スクリプトを使用してファイルを削除した場合は認識しません。

ただし、すべてのファイルが削除されます。私はバットとvbsスクリプトを試し、スクリプトを手動で、および/またはプログラム内からの呼び出しによって実行しました-常に同じ結果が得られました.手動削除は認識され、スクリプトによる削除は認識されません. ファイルを自動的に削除するスクリプト/実行可能ファイルを LUA 4.0 から呼び出すことができることが重要です。

Windows でファイルを削除すると正確にはどうなりますか? また、スクリプトによる削除とどのように違いますか? Windows の削除ルーチンを 100% エミュレートする方法はありますか? それとも、私が知らない秘密の「フォルダーが更新されました」というフラグがありますか? 自然なフォルダーのプロパティDateLastAccessedDateLastModified更新されます。

完全を期すために、ここに私のスクリプトを示します(これらは、既存のファイルに適合するものをすべて削除し*Random*.level、空のフォルダーを削除します):

バット:

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
4

1 に答える 1

4

オブジェクトは、手動で開始さShell.Applicationれたかのように、ファイルシステム アクションを実行できます。たとえば、この方法では、ファイルをWindows 圧縮フォルダーとしてコピーすることにより、zip ファイルを作成できます。ファイル コピーの進行状況バーとすべてが表示されます。Folder.CopyHere

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 ファイルごとに、「このファイルをごみ箱に送ってよろしいですか?」という確認ウィンドウ ダイアログが表示されます。大雑把な調査では、私が見た唯一の回避策は、ファイルを削除する代わりに、ファイルを一時フォルダーに移動してからフォルダーを削除することです。それがあなたの条件を満たすかどうかはわかりませんが、実験する価値はあると思います。

于 2013-03-21T14:57:38.400 に答える