VBscript或Powershell脚本,用于删除超过x天的文件,遵循快捷方式/链接



我正试图创建一个脚本来删除文件夹及其子文件夹中超过45天的所有文件-我知道如何做到这一点,问题是有问题的父文件夹本身有几个指向其他文件夹的链接-我如何防止脚本删除链接(因为链接是一个文件(,而是将链接视为文件夹,并在链接中查找超过45天的文件。

如果这不可能,那么是否可以创建一个动态变量或数组,以便脚本查看我需要的每个文件夹,并删除任何超过45天的文件?如果是,我该怎么做。

目前,我唯一的其他选择是为每个文件夹创建一个单独的脚本(或为一个文件中的每个脚本创建代码(,然后单独调用它们,或者使用另一个脚本来调用每个脚本。

作为参考,这是在Windows Server 2008 R2环境中

我现在无法找到完整的解决方案。如果我有时间,我会回来用一个编辑。从本质上讲,我会创建一个函数,该函数将递归地为文件夹和链接调用自己。TargetPath是一个文件夹。递归函数的创建是相当标准的公平。唯一稍微不透明的部分是获取。.lnk文件的目标路径:

$sh = New-Object -COM WScript.Shell
$sc = $sh.CreateShortcut('E:SandBoxScriptRepository.lnk')
$targetPath = $sc.TargetPath

这就是PS方式。VBScript版本基本相同,有不同的变量命名约定和不同的COM对象实例化方法。

因此,这里有一个更完整的解决方案。我还没有设置测试文件夹和文件来完全测试它,但它应该是你所需要的:

function Remove-OldFile{
    param(
            $Folder
         )
    $sh = New-Object -COM WScript.Shell
    foreach($item in Get-ChildItem $Folder){
        if ($item.PSIsContainer){
            Remove-OldFile $item.FullName
        }elseif($item.Extension -eq '.lnk'){
            Remove-OldFile $sh.CreateShortcut($item.FullName).TargetPath
        }else{
            if(((Get-Date) - $item.CreationTime).Days -gt 45){
                $item.Delete()
            }
        }
    }
}
Remove-OldFile C:Scripts

为了完整起见,这里有一个未经测试的即时VBS解决方案。我警告你,它可能有一些语法错误,但逻辑应该很好。

RemoveOldFiles "C:Scripts"
Sub RemoveOldFiles(strFolderPath)
    Dim oWSH : Set oWSh = CreateObject("WScript.Shell")
    Dim oFSO : Set oFSO = CreateObject("Scripting.FileSystemObject")
    For Each oFolder in oFSO.GetFolder(strFolderPath).SubFolders
        RemoveOldFiles oFolder.Path
    Next
    For Each oFile in oFSO.GetFolder(strFolderPath).Files
        if LCase(oFSO.GetExtensionName(oFile.Name)) = "lnk" Then
            RemoveOldFiles oWSH.CreateShortcut(oFile.Path).TargetPath
        Else
            If DateDiff("d", oFile.DateCreated, Date) > 45 Then
                oFSO.DeleteFile(oFile)
            End If
        End If
    Next
End Sub

非常高级的答案:

Loop through all files in current folder.
If `file.name` ends with `.lnk` (we have a link/shortcut).
Get the path of the shortcut with `.TargetPath`

现在,您可以传递.TargetPath,就像在找到子目录时传递子目录名称一样,继续在目录树中递归。

最新更新