VBscript或Powershell脚本,用于按照快捷方式/链接删除早于x天的文件

VBscript或Powershell脚本,用于按照快捷方式/链接删除早于x天的文件,powershell,vbscript,Powershell,Vbscript,我正在尝试创建一个脚本来删除文件夹中的所有文件及其超过45天的子文件夹-我知道如何执行此操作,问题是所讨论的父文件夹本身有多个指向其他文件夹的链接-如何防止脚本删除链接(因为链接是一个文件),而是将链接视为文件夹,并在链接中查找45天以上的文件 如果不可能,那么是否可以创建一个动态变量或数组,以便脚本在我需要的每个文件夹中查找并删除任何超过45天的文件?如果是,我该怎么做 目前,我唯一的其他选择是为每个文件夹创建一个单独的脚本(或者为一个文件中的每个脚本创建代码),然后分别调用它们,或者使用另一

我正在尝试创建一个脚本来删除文件夹中的所有文件及其超过45天的子文件夹-我知道如何执行此操作,问题是所讨论的父文件夹本身有多个指向其他文件夹的链接-如何防止脚本删除链接(因为链接是一个文件),而是将链接视为文件夹,并在链接中查找45天以上的文件

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

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


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

非常高级的答案:

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
,传递方式与在目录树中找到一个子目录继续递归时传递子目录名称的方式相同。

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

$sh = New-Object -COM WScript.Shell
$sc = $sh.CreateShortcut('E:\SandBox\ScriptRepository.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

真正地为什么要投否决票?对我来说似乎是个合理的问题。这甚至是可行的,但您需要使用WScript.Shell COM对象来实现。我的快捷方式没有.TargetPath属性。而且,我的意思是,您在PS中使用的对象没有该属性。如果您在资源管理器中浏览到它,然后在GUI中查看属性,那么它肯定会这样做。正如我在对问题的评论中所说的,您可以使用WScript.Shell来访问.TargetPath属性。您不能在PS文件系统提供程序中以本机方式完成这项工作。您没有说PS是一项要求。我可以用几行代码在纯VBScript中实现这一点,所以我不确定您为什么认为需要多个脚本。你也没有说你的答案是针对VBScript的。谢谢-下一个问题是。如何在当前代码中实现这一点<代码>$a=Get ChildItem C:\Scripts foreach($x in$a){$y=((Get Date)-$x.CreationTime)。Days if($y-gt 45-和$x.PsISContainer-ne$True){$x.Delete()}}这是我还没有编写的递归函数部分。你喜欢递归函数吗?现在测试它,但是我在
if(((获取日期)$x.CreationTime)上注意到一个错误。Days-gt 45){
x.CreationTime
应该是
$item。CreationTime
测试已经完成,它可以工作了。谢谢!我没有想过这样做(这一点我还不太熟悉PS,我一直在用VBS编写大多数脚本,但我发现VBS让人感到困惑和麻烦)需要注意的是,它不会删除超过45天的快捷方式(从技术上讲是文件)。我想如果需要的话,你可以处理这些调整。