Question Suppression de fichier et Dossier en fonction date

Plus d'informations
il y a 7 ans 10 mois #21845 par Faucon
Bonjour à tous,

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.

Plus d'informations
il y a 7 ans 10 mois #21858 par Laurent Dardenne
Salut,
Mitakue écrit:

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).

Il te faut déjà vérifier si ton fichier csv ne contient pas d'incohérence (ordre contradictoire).

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.

Plus d'informations
il y a 7 ans 10 mois #21859 par Faucon
salut,

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.

Plus d'informations
il y a 7 ans 10 mois #21879 par Laurent Dardenne
Désolé de la réponse tardive.
Mitakue écrit:

J'ai vérifier, il n'y a pas d'incohérence dans les fichiers d'exclusions.

C'est le script qui devrait faire ce contrôle, c'est une règle de gestion. Ensuite tu fais comme tu veux :-)
Mitakue écrit:

Le traitement est peut être simple mais je ne le voit pas ^^.

Je n'ai pas le temps pour te proposer une piste.
Pour simplifier, essaie de le coder hors de ton traitement.
Mitakue écrit:

J'ai déjà essayé sur le $item.GetType mais ça n'a rien donné.

Utilise l'opérateur -is, certes moins performant mais évite la comparaison sur des strings.

Tutoriels PowerShell

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

Plus d'informations
il y a 7 ans 2 mois #22957 par Faucon
BOnjour à tous,

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.

Plus d'informations
il y a 7 ans 2 mois #22961 par Philippe
salut Mitakue

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.

il te suffit de vérifier si le dossier contenant le fichier que tu supprime est vide

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.

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