VBscript или скрипт Powershell для удаления файлов старше x дней, по ссылкам / ссылкам - PullRequest
2 голосов
/ 26 июля 2011

Я пытаюсь создать скрипт для удаления всех файлов в папке и ее подпапках, которые старше 45 дней - я знаю, как это сделать, проблема в том, что рассматриваемая родительская папка имеет несколько ссылок на другие папки внутрисам по себе - как я могу предотвратить удаление сценарием ссылок (так как ссылка является файлом), но вместо этого обрабатывает ссылки как папки и просматривает ссылки внутри файлов старше 45 дней.

Еслиэто невозможно, тогда возможно ли создать динамическую переменную или массив, чтобы скрипт просматривал каждую нужную мне папку и удалял любые файлы старше 45 дней?Если да, то как мне это сделать.

В настоящее время мой единственный вариант - создать отдельный скрипт для каждой папки (или создать код для каждого скрипта в одном файле) и либо вызывать их по отдельности, либо использовать еще одинскрипт для вызова каждого скрипта.

Для справки, это в среде Windows Server 2008 R2

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

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

Ответ очень высокого уровня:

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 точно так же, как вы передавали бы имя подкаталога, когда вы нашли его для продолжения рекурсии через дерево каталогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...