2

我目前正在尝试在运行程序时自动删除程序文件。如果我在 Windows 中手动删除文件,程序会识别更改,但如果我使用脚本删除文件则不会。

但是,所有文件都会被删除。我尝试了一个 bat 和一个 vbs 脚本,手动和/或通过程序内部的调用执行脚本 - 总是得到相同的结果:识别手动删除,不识别脚本删除。我应该提到的是,我可以从 LUA 4.0 调用一个脚本/可执行文件,它会自动删除文件,这对我来说很重要。

如果我在 Windows 中删除文件到底会发生什么,它与通过脚本删除有什么不同?有没有办法 100% 模拟 Windows 删除程序?还是有一些我不知道的秘密“文件夹已更新”标志?自然文件夹属性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对象能够执行文件系统操作,就好像它们是手动启动的一样。例如,该Folder.CopyHere方法允许通过将文件作为Windows 压缩文件夹复制到 zip 文件中来创建 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 文件,我都会收到一个确认窗口对话框,询问“您确定要将此文件发送到回收站吗?” 经过粗略调查,我看到的唯一解决方法是,不是删除文件,而是将文件移动到临时文件夹,然后删除该文件夹。我不确定这是否会满足您的条件,但我认为值得尝试。

于 2013-03-21T14:57:38.400 回答