Question Suppression de fichier et Dossier en fonction date
- Faucon
- Auteur du sujet
- Hors Ligne
- Membre senior
- Messages : 43
- Remerciements reçus 0
Je reviens vers vous aujourd'hui car j'ai mis en place il y a plusieurs mois de cela un script PowerShell qui sert à purger les fichiers vieux de plus de 90 jours.
Ce script fonctionne bien mais il ne supprime que les fichiers, la nouvelle demande est de faire en sorte qu'il supprime le fichier et le dossier parents par exemple :
\\NOMSERVEUR\ETL\TAZ\TST\SrcFiles\Titi\Toto\toto.txt
Dans cette arborescence, je voudrais qu'il me supprime le fichier toto.txt mais aussi le dossier Toto.
En revanche dans certains cas le fichier a supprimé va se trouver dans SrcFiles mais le dossier SrcFiles ne doit en aucun cas être supprimé (sinon je suis mort).
Je vous joint mon code pour plus de compréhension
[code:1]if ($datacenterctrlm -eq \"TST\"«»)
{
foreach ($path in $importfolder)
{
#Serveur à purger
$srv = $path.appli
#Dossier à purger
$folder = \"E:\\"
#Environnement correspondant au chemin UNC spécifié dans le CSV
$environnement = $path.env
if ($environnement -eq \"TST\"«»)
{
#Date du jour -90 jours.
$LastWrite = (Get-Date).AddDays(-90)
#Récupération des fichiers de plus de 90 jours
$items1 = \"\"
$items1 = (Get-ChildItem -Force -Path $folder -Recurse -Exclude $excludefiles | Where-Object {$_.FullName -notmatch $excludefolder -and $_.LastWriteTime -le \"$LastWrite\"})
#Création du fichier de log
$fileLog = \"\\cheminDFS\global\Applications\TEST\SSIS\Log\$($environnement)_$($srv)_file_deleted_log_$($datevacation).txt\"
$item = \"\"
foreach ($item in $items1)
{
if($item -eq $null)
{
break
}
else
{
#Récupération des éléments de type fichier
if($item.GetType().Name -eq \"FileInfo\"«»)
{
#Si le fichier à été modifié il y plus de 90 jours, je le supprime.
Remove-Item -Path $item -Force
if(! (Test-Path $item))
{
Write-Output \"Fichier supprimé : $($item)\" | Out-File $fileLog -Append
}
else
{
Write-Output \"Fichier non supprimé : $($item)\" | Out-File $fileLog -Append
}
}
}
}
}
}
} [/code:1]
Certains type de dossier ou des fichiers ne doivent pas être purgés d'ou les fichiers csv pour l'exclusion.
Merci d'avance pour votre aide,
Mitakue
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Mitakue écrit:
Il te faut déjà vérifier si ton fichier csv ne contient pas d'incohérence (ordre contradictoire).En revanche dans certains cas le fichier a supprimé va se trouver dans SrcFiles mais le dossier SrcFiles ne doit en aucun cas être supprimé (sinon je suis mort).
Ensuite crée une arbo de test, le traitement à faire est simple, ensuite intègre le à ton script existant.
L'usage de fonction ça aide
Et le paramètre -Whatif prend tout son sens ici.
Pense aussi au nom de fichier/répertoire du type 'File[0].txt'
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Faucon
- Auteur du sujet
- Hors Ligne
- Membre senior
- Messages : 43
- Remerciements reçus 0
J'ai vérifier, il n'y a pas d'incohérence dans les fichiers d'exclusions.
Pour l’arborescence de TST, je prend les fichiers présents sur l'un des serveurs à purger et je recopie le tout sur mon PC.
Le traitement est peut être simple mais je ne le voit pas ^^.
J'ai déjà essayé sur le $item.GetType mais ça n'a rien donné.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Mitakue écrit:
C'est le script qui devrait faire ce contrôle, c'est une règle de gestion. Ensuite tu fais comme tu veuxJ'ai vérifier, il n'y a pas d'incohérence dans les fichiers d'exclusions.
Mitakue écrit:
Je n'ai pas le temps pour te proposer une piste.Le traitement est peut être simple mais je ne le voit pas ^^.
Pour simplifier, essaie de le coder hors de ton traitement.
Mitakue écrit:
Utilise l'opérateur -is, certes moins performant mais évite la comparaison sur des strings.J'ai déjà essayé sur le $item.GetType mais ça n'a rien donné.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Faucon
- Auteur du sujet
- Hors Ligne
- Membre senior
- Messages : 43
- Remerciements reçus 0
Je déterre un peu ce post, depuis le temps j'ai régler le soucis que j'avais, cependant maintenant je dois en régler un autre.
Les fichiers sont bien supprimés en revanche le dossier qui contenait le fichier ne l'est pas par exemple :
\\NOMSERVER\TOTO\TITI\20160108\20160108.txt
il va ne me supprimer que le fichier txt pas le dossier 20160108 et le fichier ce qu ifais qu'à la fin de l'exécution j'ai un dossier vide qui ne me sert à rien.
Je vous joint mon code.
Merci d'avance,
Mitakue
[code:1]param
(
#environnement
[String]$datacenterctrlm
)
#Appel de 7-Zip pour l'archivage
$7zipexe = \"C:\Program Files\7-Zip\7z.exe\"
#Recuperation de la date du jour pour le fichier de log
$datevacation = Get-Date -UFormat %Y%m%d
#Import du fichier d'exclusion des fichiers.
if(! (Test-Path -Path \"C:\Maintenance\Fonctions_CG\Files_To_Purge_Exclusions.csv\"«»))
{
Write-Host \"Le fichier d'exclusion des fichiers n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else
{
[String[]]$excludefiles = Import-Csv -path \"C:\Maintenance\Fonctions_CG\Files_To_Purge_Exclusions.csv\" -Delimiter \";\" | Select-Object -expandproperty Fichier
}
#Import du fichier d'exclusion des dossiers.
if(! (Test-Path -Path \"C:\Maintenance\Fonctions_CG\Folder_To_Purge_Exclusions.txt\"«»))
{
Write-Host \"Le fichier d'exclusion des dossiers n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else
{
$excludefolder = \"($((Get-Content -Path \"C:\Maintenance\Fonctions_CG\Folder_To_Purge_Exclusions.txt\"«») -join '|' ))\"
}
#Import de la liste des dossiers à purger.
if(! (Test-Path -Path \"C:\Maintenance\Fonctions_CG\Folder_To_Purge.csv\"«»))
{
Write-Host \"Le fichier de purge n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else
{
$importfolder = Import-Csv -path \"C:\Maintenance\Fonctions_CG\Folder_To_Purge.csv\"
}
#Traitement en TEST
if ($datacenterctrlm -eq \"TST\"«»)
{
foreach ($path in $importfolder)
{
#Serveur à purger
$srv = $path.appli
#Dossier à purger
$folder = $path.chemin
#Environnement correspondant au chemin UNC spécifié dans le CSV
$environnement = $path.env
if ($environnement -eq \"TST\"«»)
{
#Recuperation du delai de retention.
$delai = $path.delai
if ($delai -eq \"\"«»)
{
$LastWrite = (Get-Date).AddDays(-90)
}
else
{
$LastWrite = (Get-Date).AddDays(-$($delai))
}
#Récupération des fichiers a archiver
$items1 = \"\"
$items1 = (Get-ChildItem -Force -Path $folder -Recurse -Exclude $excludefiles | Where-Object {$_.FullName -notmatch $excludefolder -and $_.LastWriteTime -le \"$LastWrite\"})
#Création du fichier de log
$fileLog = \"C:\Temp\$($environnement)_$($srv)_file_deleted_log_$($datevacation).txt\"
$item = \"\"
foreach ($item in $items1)
{
if($item -eq $null)
{
write-host \"rien a purger\"
}
else
{
#Récupération des éléments de type fichier
if($item.GetType().Name -eq \"FileInfo\"«»)
{
#Si la date de modification du fichier est anterieur a $LastWrite je supprime le fichier.
Remove-Item -Path $item -Force
if(! (Test-Path $item))
{
Write-Output \"Fichier supprimé : $($item)\" | Out-File $fileLog -Append
}
else
{
Write-Output \"Fichier non supprimé : $($item)\" | Out-File $fileLog -Append
}
}
}
}
}
}
}[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
- Messages : 1778
- Remerciements reçus 21
il te suffit de vérifier si le dossier contenant le fichier que tu supprime est videil va ne me supprimer que le fichier txt pas le dossier 20160108 et le fichier ce qu ifais qu'à la fin de l'exécution j'ai un dossier vide qui ne me sert à rien.
je t'ai rajouter le code correspondant entourer de #####
[code:1]
param (
# environnement
[String]$datacenterctrlm
)
# Appel de 7-Zip pour l'archivage
$7zipexe = \"C:\Program Files\7-Zip\7z.exe\"
# Recuperation de la date du jour pour le fichier de log
$datevacation = Get-Date -UFormat %Y%m%d
# Import du fichier d'exclusion des fichiers.
if ( !(Test-Path -Path \"C:\Maintenance\Fonctions_CG\Files_To_Purge_Exclusions.csv\"«»)) {
Write-Host \"Le fichier d'exclusion des fichiers n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else {
[String[]]$excludefiles = Import-Csv -path \"C:\Maintenance\Fonctions_CG\Files_To_Purge_Exclusions.csv\" -Delimiter \";\" | Select-Object -expandproperty Fichier
}
# Import du fichier d'exclusion des dossiers.
if ( !(Test-Path -Path \"C:\Maintenance\Fonctions_CG\Folder_To_Purge_Exclusions.txt\"«»)) {
Write-Host \"Le fichier d'exclusion des dossiers n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else {
$excludefolder = \"($((Get-Content -Path \"C:\Maintenance\Fonctions_CG\Folder_To_Purge_Exclusions.txt\"«») -join '|' ))\"
}
# Import de la liste des dossiers à purger.
if ( !(Test-Path -Path \"C:\Maintenance\Fonctions_CG\Folder_To_Purge.csv\"«»)) {
Write-Host \"Le fichier de purge n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else {
$importfolder = Import-Csv -path \"C:\Maintenance\Fonctions_CG\Folder_To_Purge.csv\"
}
# Traitement en TEST
if ($datacenterctrlm -eq \"TST\"«») {
foreach ($path in $importfolder) {
# Serveur à purger
$srv = $path.appli
# Dossier à purger
$folder = $path.chemin
# Environnement correspondant au chemin UNC spécifié dans le CSV
$environnement = $path.env
if ($environnement -eq \"TST\"«») {
# Recuperation du delai de retention.
$delai = $path.delai
if ($delai -eq \"\"«») {
$LastWrite = (Get-Date).AddDays(-90)
}
else {
$LastWrite = (Get-Date).AddDays(-$($delai))
}
# Récupération des fichiers a archiver
$items1 = \"\"
$items1 = (Get-ChildItem -Force -Path $folder -Recurse -Exclude $excludefiles | Where-Object {$_.FullName -notmatch $excludefolder -and $_.LastWriteTime -le \"$LastWrite\"})
# Création du fichier de log
$fileLog = \"C:\Temp\$($environnement)_$($srv)_file_deleted_log_$($datevacation).txt\"
$item = \"\"
foreach ($item in $items1) {
if ($item -eq $null) {
write-host \"rien a purger\"
}
else {
# Récupération des éléments de type fichier
if ($item.GetType().Name -eq \"FileInfo\"«») {
# Si la date de modification du fichier est anterieur a $LastWrite je supprime le fichier.
Remove-Item -Path $item -Force
if ( !(Test-Path $item)) {
Write-Output \"Fichier supprimé : $($item)\" | Out-File $fileLog -Append
##########################################################################################################################
# si le doosier contenent le fichier est vide, le dossier est supprimé
if ( -not (Get-ChildItem -Force -Path $(Split-Path $item)) ) {
Remove-Item -Path $(Split-Path $item) -Force
if ( -not (Test-Path $(Split-Path $item))) {
Write-Output \"Dossier supprimé : $($(Split-Path $item))\" | Out-File $fileLog -Append
}
else {
Write-Output \"Dossier non supprimé : $($(Split-Path $item))\" | Out-File $fileLog -Append
}
}
##########################################################################################################################
}
else {
Write-Output \"Fichier non supprimé : $($item)\" | Out-File $fileLog -Append
}
}
}
}
}
}
}
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les initiés
- Suppression de fichier et Dossier en fonction date