Script PowerShell pour la suppression récursive

Sep 21 2020

J'ai commencé un nouveau travail et j'ai été presque instantanément envoyé pour faire du Powershell, mais je n'ai jamais utilisé Powershell que dans Exchange et c'est très basique.

J'apprendrai davantage au cours des prochains mois, mais pour l'instant, j'ai besoin d'un script qui ira dans un dossier arbitraire, vérifiera chaque dossier et sous-dossier de manière récursive, supprimant tous les fichiers de plus de 2 jours.

Quelqu'un peut-il aider un débutant à ce sujet s'il vous plaît?

Function DelFiles($RootFolder,[ref]$blnDeleteErrmsgSent){
  $blnDeleteErrmsgSent = $false
  $date = Get-Date $Folders              = Dir
  $FolderPath = "path" $PSEmailServer        = "servername"

  # Delete Old Files
  Cd $RootFolder foreach($folder in $Folders){ Cd $Folder.FullName
    $ToDelete = Dir -Attributes !readonly |Where {$_.lastwritetime -lt ((Get-Date).Adddays(-2))}
    foreach($File in $ToDelete){
      try{
        if($file.Attributes -notcontains "Directory"){ Remove-Item -Path $File.FullName -Force -ErrorAction Stop}
      }catch{
        # Only Send e-mail alert if we haven't already done so i.e. only once
        if(!($blnDeleteErrmsgSent.value)){ $errordescription=$_ $errorline=$_.InvocationInfo.Line.ToString() # Capture Error Information # Notify IT that this script has encountered an error Send-MailMessage -From "ScanDeletion@****.co.uk" -To "IT@****.co.uk" -Subject "errored while deleting old scan files" -Body ("The error occured at " + [string]$date +"`n Error:"+ $errordescription +"`n Line:"+ $errorline)

            # Set Flag to True so we don't send multiple e-mail alerts for file deletion errors.
            $blnDeleteErrmsgSent.value = $true
        }
      }
    }
  }
}

# Call Archive Function (auto-recursive) to archive any xml files in Folder, and subfolders
DelFiles $FolderPath ([ref]$blnDeleteErrmsgSent)

Exit

Réponses

SimonS Sep 21 2020 at 18:51

Je pense que vous n'étiez pas vraiment loin, mais voici les trois choses que je ferais différemment:

  • Obtenez tous les fichiers avec une seule commande en utilisant le -Recursecommutateur de Get-ChildItem, au lieu de sauter de dossier en dossier juste pour obtenir les fichiers à l'intérieur
  • Au lieu de créer des indicateurs pour l'e-mail, rassemblez les informations que vous souhaitez envoyer pendant votre processus de suppression, stockez-les dans un tableau, puis envoyez l'e-mail une fois
  • Au lieu de vérifier si le fichier que vous souhaitez supprimer n'est pas un dossier, utilisez le -Fileparamètre deGet-ChildItem

Je l'utiliserais également comme script, pas comme un Function, mais c'est votre appel:

$RootFolder = "C:\install\su1587308" $DeleteDate = (Get-Date).AddDays("-2")
$Fails = @() # Get all files below the rootfolder that are not ReadOnly: Get-ChildItem $RootFolder -Recurse -Attributes !ReadOnly -File |
  Where-Object { $_.LastWriteTime -lt $DeleteDate } | ForEach-Object {
    Try {
      Remove-Item $_.FullName -Force -ErrorAction Stop } Catch { # if it fails to the delete, the fullname of the file is stored in a variable $Fails += $_.FullName } } # Only send an email if something failed: if ($Fails) {
  $Body = "Could not delete the Following Files:<br>" +($Fails -join '<br>')
  $Splat = @{ SmtpServer = "???" From = "ScanDeletion@****.co.uk" To = "IT@****.co.uk" Subject = "errored while deleting old scan files" Body = $Body
    BodyAsHtml = $true
  }

  Send-MailMessage @Splat
}