Я не могу найти полное решение прямо сейчас. Если у меня будет время, я вернусь и отредактирую его. По сути, я бы создал функцию, которая бы рекурсивно вызывала себя для папок и ссылок, где папка .TargetPath была. Создание рекурсивной функции довольно стандартно. Единственная слегка непрозрачная часть - это получение .TargetPath файла .lnk:
$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