Question Copie de fichiers avec verifiaction si deja existants dans destination par Hash

Plus d'informations
il y a 1 mois 4 semaines - il y a 1 mois 3 semaines #32519 par Bruce
Bonjour,

Voici un petit script qui m'a été demandé par un utilisateur, le but est de sauvegarder certains fichiers (ici 3 fichiers Excel) qui sont renseignés par un utilisateur par très à l'aise avec l'outils informatique durant la période d'été. Bien que nous aillons des sauvegardes qui permettent de remonter 1 mois auparavant, le responsable aime avoir une visualisation de ces fichiers dans un répertoire ou seul lui ait l'accès et ainsi pouvoir visualiser les évolutions de ces fichiers.

Ce script est exécuté par une tache planifiée chaque jour et envoi un mail concernant l'état de la copie de ces 3 fichiers.
Voici le code:
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
Clear-Host

# Copie de fichiers avec verif si existance dans dossier destination par hashtable et envoi de mail d'info
# A mettre en tache planifiée
# Selection de 3 fichiers specifiques a copier (ici au format Excel)
#======================================================================================================
# Activation de Mode TEST: TRUE ou FALSE -> affiche les infos a l'ecran en mode test
$testing = $true
#======================================================================================================
# Parametres pour envoi de rapport par mail
$smtpServer="192.168.169.170" # IP de votre serveur de mail par exemple
$from = "INFO COPIE <MonitoringCopy@monserveur.com>" # adresse de l'expediteur du mail pour votre script
$adminEmailAddr = "admin1@monserveur.com","user1@monserveur.fr"
$testingEmailAddr = "admin1@monserveur.com"
$textEncoding = [System.Text.Encoding]::UTF8
$SendMail = $true
#======================================================================================================
# VARIABLES FICHIERS
$sourcedir = "C:\users\public"
$destdir = "C:\sauvegarde"
$prefix = get-date -format yyyy-MM-dd-
$file1 = "fichier1.xlsx".ToLower()
$file2 = "fichier2.xlsx".ToLower()
$file3 = "fichier3.xlsx".ToLower()
#======================================================================================================
# Corps du Mail 
$now = Get-Date -UFormat '%m-%d-%y %H:%M'
$body = "
     <p>Contrôle de copie des fichiers</br>
     <b>Fichiers sources à copier:</b>
     </p><ul>
     <li><b>$file1</b></li>
     <li><b>$file2</b></li>
     <li><b>$file3</b></li></ul></br>
     Dossier source: <i>$sourcedir</i></br>
     Dossier destination: <i>$destdir</i></br></br>
     Execution le $now</br></br>"

#======================================================================================================
#Recupere le nom du script
$ScriptName = $MyInvocation.MyCommand.Name
#Chemin du répertoire contenant le script
$RepScript = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition) 

# Recupération des infos du domaine
$SearchBase = (Get-AdDomainController).defaultpartition  # Resultat: DC=votredomaine,DC=local
$domain = $SearchBase -Split "," | ? {$_ -like "DC=*"}   # Resultat: DC=votredomaine DC=local
$domain = $domain -join "." -replace ("DC=", "")         # Resultat: votredomaine.local
#Nom du serveur d'execution du script
$serveur = [system.environment]::MachineName

#======================================================================================================
# DEBUT DU SCRIPT
if ((Test-Path -Path $sourcedir) -and (Test-Path -Path $destdir)) # teste si les repertoires source et cibles sont existants
{   
    $SourceFiles = Get-ChildItem –Path $sourcedir -Recurse -File -include "*.xlsx"   # recupere les fichiers du repertoire source au format Excel
    Foreach ($fichier in $SourceFiles)
    {
        $filename = $fichier.Name.ToLower() #nom du fichier en minuscule
        if (($filename -like $file1) -or($filename -like $file2) -or ($filename -like$file3)) #verifie la correspondance du fichier avec ceux a copier
        {
           $sourcefile = $sourcedir + "\" + $fichier.Name
           $destfile = $destdir + "\" + $prefix + $fichier.Name
           if (Test-Path -Path $destfile) # verifie si le fichier existe à l'emplacement cible
           {
                $hashdest = Get-FileHash -Algorithm SHA1 -Path $destfile #recupere le hash du fichier existant dans la destination
                $hashsource = Get-FileHash -Algorithm SHA1 -Path $fichier  #recupere le hash du fichier source
                if ($hashsource.Hash -eq $hashdest.Hash) # compare le hash des 2 fichiers
                {
                    $body+="<b>$destfile</b><font color=""FF0000""> existe déjà !</font></br>"
                    if ($testing -eq $true) {write-host -ForegroundColor Red -BackgroundColor Yellow "$destfile existe déjà !!"}
                }
            }else
            {
                copy-item -path $sourcefile -destination $destfile -Force -ErrorAction SilentlyContinue
                $body+="<b>$destfile</b><font color=""00FF00""> - Copie réussie</font></br>"
                if ($testing -eq $true) {write-host -ForegroundColor Yellow -BackgroundColor Blue "copie réussie : $destfile"}
            }
        }
    }
    if ($testing -eq $true) {write-host -ForegroundColor White -BackgroundColor Green "FIN !"}
}else
{
    if ($testing -eq $true) {write-host -ForegroundColor Red -BackgroundColor Yellow "Dossier source ou destination non present !!"}
    $body+="<font color=""FF0000""><b>Dossier source ou destination non present !!</font></b>"
}

#Choix du destinataire du mail en fonction du mode Test
if ($testing -eq $true) 
{
    $recipient = $testingEmailAddr
    $subject="Mode test: Copie des fichiers EXCEL"
}else
{
    $recipient = $adminEmailAddr
    $subject="INFO: Copie des fichiers EXCEL"
}

$body+="
     <p>Serveur d'execution du script: <b>$serveur</b><br>
     Nom du script: <font color=""0000FF"">$ScriptName</font><br>
     Localisation du script: <font color=""0000FF"">$RepScript</font><br>
     <br><br>    
     L'équipe Support<br>
     hotline@monserveur.com<br>
     https://monserveur.com<br></p>"

# Envoi du mail 
if ($sendmail -eq $true)
{
    Send-Mailmessage -smtpServer $smtpServer -from $from -to $recipient -subject $subject -body $body -bodyasHTML -priority High -Encoding $textEncoding -ErrorAction Stop -ErrorVariable err
}
Dernière édition: il y a 1 mois 3 semaines par Laurent Dardenne. Raison: balise code

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.051 secondes
Propulsé par Kunena