Question Lecture d'un CSV en PowerShell
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 10 ans 4 mois #20977
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Lecture d'un CSV en PowerShell
J'ai effectué qq tests et l'exclusion fonctionne avec ce jeu :
[code:1]Get-ChildItem c:\temp\TestDir\*.* -Recurse -Exclude $FichiersExclus -Force [/code:1]
Test uniquement cette partie sans ajouter de filtre sur la date.
Le test:
[code:1]
cd c:\temp
md TestDir
cd TestDir
@'
Fichier
*.raw
*.rml
CG_OLY_SPR_ALL_IDX_PTF
CG_OLY_SPR_ALL_SEC_PTF
CG_OLY_SPR_AST_CTB_PTF
CG_OLY_SPR_HLD_IDX_CMP
CG_OLY_SPR_STA_IND_PTF
*.xsd
Export_Collections.csv
Carmignac-Retrocessions.xml
SRM_CED.INV
SRM_CED.RN
SRM_CED.VAL
SRM_CED.VL
IndicesSoliam.csv
SoliamDevises.csv
MoaOtc_SansEntete
*.dat
*.req
fic_statproforward.xml
fic_statproswap.xml
fic_statprooption.xml
Bloomberg_FXRates.xml
test.txt
test_SOLIAM.txt
'@ > 'c:\temp\TestDir\Files_To_Purge_Exclusions.csv'
function create {
'raw' > f1.raw
'rml' > f2.rml
'test' > CG_OLY_SPR_ALL_IDX_PTF
'test' > CG_OLY_SPR_ALL_SEC_PTF
'test' > CG_OLY_SPR_AST_CTB_PTF
'test' > CG_OLY_SPR_HLD_IDX_CMP
'test' > f3.xsd
'test' > Export_Collections.csv
'test' > Carmignac-Retrocessions.xml
'test' > SRM_CED.INV
'test' > SRM_CED.RN
'test' > SRM_CED.VAL
'test' > SRM_CED.VL
'test' > IndicesSoliam.csv
'test' > SoliamDevises.csv
'test' > MoaOtc_SansEntete
'test' > f4.dat
'test' > f5.req
'test' > fic_statproforward.xml
'test' > fic_statproswap.xml
'test' > fic_statprooption.xml
'test' > Bloomberg_FXRates.xml
'test' > test.txt
'test' > test_SOLIAM.txt
}
Create
#24 fichiers + \".\Files_To_Purge_Exclusions.csv\"
[string[]]$FichiersExclus= Import-Csv -path \".\Files_To_Purge_Exclusions.csv\" -Delimiter \";\"|
Select-object -expandProperty Fichier
Get-ChildItem c:\temp\TestDir\*.* -Recurse -Exclude $FichiersExclus -Force
#renvoi 1 fichier, le csv qui n'est pas dans le fichier d'exclusion
md CG_OLY_SPR_STA_IND_PTF
cd CG_OLY_SPR_STA_IND_PTF
Create
Get-ChildItem c:\temp\TestDir\*.* -Recurse -Exclude $FichiersExclus -Force
#renvoi 1 fichier, le csv qui n'est pas dans le fichier d'exclusion
[/code:1]
[code:1]Get-ChildItem c:\temp\TestDir\*.* -Recurse -Exclude $FichiersExclus -Force [/code:1]
Test uniquement cette partie sans ajouter de filtre sur la date.
Le test:
[code:1]
cd c:\temp
md TestDir
cd TestDir
@'
Fichier
*.raw
*.rml
CG_OLY_SPR_ALL_IDX_PTF
CG_OLY_SPR_ALL_SEC_PTF
CG_OLY_SPR_AST_CTB_PTF
CG_OLY_SPR_HLD_IDX_CMP
CG_OLY_SPR_STA_IND_PTF
*.xsd
Export_Collections.csv
Carmignac-Retrocessions.xml
SRM_CED.INV
SRM_CED.RN
SRM_CED.VAL
SRM_CED.VL
IndicesSoliam.csv
SoliamDevises.csv
MoaOtc_SansEntete
*.dat
*.req
fic_statproforward.xml
fic_statproswap.xml
fic_statprooption.xml
Bloomberg_FXRates.xml
test.txt
test_SOLIAM.txt
'@ > 'c:\temp\TestDir\Files_To_Purge_Exclusions.csv'
function create {
'raw' > f1.raw
'rml' > f2.rml
'test' > CG_OLY_SPR_ALL_IDX_PTF
'test' > CG_OLY_SPR_ALL_SEC_PTF
'test' > CG_OLY_SPR_AST_CTB_PTF
'test' > CG_OLY_SPR_HLD_IDX_CMP
'test' > f3.xsd
'test' > Export_Collections.csv
'test' > Carmignac-Retrocessions.xml
'test' > SRM_CED.INV
'test' > SRM_CED.RN
'test' > SRM_CED.VAL
'test' > SRM_CED.VL
'test' > IndicesSoliam.csv
'test' > SoliamDevises.csv
'test' > MoaOtc_SansEntete
'test' > f4.dat
'test' > f5.req
'test' > fic_statproforward.xml
'test' > fic_statproswap.xml
'test' > fic_statprooption.xml
'test' > Bloomberg_FXRates.xml
'test' > test.txt
'test' > test_SOLIAM.txt
}
Create
#24 fichiers + \".\Files_To_Purge_Exclusions.csv\"
[string[]]$FichiersExclus= Import-Csv -path \".\Files_To_Purge_Exclusions.csv\" -Delimiter \";\"|
Select-object -expandProperty Fichier
Get-ChildItem c:\temp\TestDir\*.* -Recurse -Exclude $FichiersExclus -Force
#renvoi 1 fichier, le csv qui n'est pas dans le fichier d'exclusion
md CG_OLY_SPR_STA_IND_PTF
cd CG_OLY_SPR_STA_IND_PTF
Create
Get-ChildItem c:\temp\TestDir\*.* -Recurse -Exclude $FichiersExclus -Force
#renvoi 1 fichier, le csv qui n'est pas dans le fichier d'exclusion
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Faucon
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 43
- Remerciements reçus 0
il y a 10 ans 4 mois #20979
par Faucon
Réponse de Faucon sur le sujet Re:Lecture d'un CSV en PowerShell
Bonjour,
Merci pour ta réponse mais ça ne fonctionne pas dans mon cas.
Je ne sais pas si je me suis bien exprimé ou pas, en faites les répertoires à exclure sont précisés dans le fichier CSV que tu trouveras en PJ.
Il faut savoir que c'est un script qui sera exécuté par CONTROL-M.
J'ai effectué différent tests en modifiant mon script mais rien n'y fait.
[code:1]$filepath1 = \"E:\OLY-APP1-TST\OLY\TST\SrcFiles\"
$filepath2 = \"E:\OLY-APP1-TST\OLY\TST\TgtFiles\"
[string[]]$exclude= Import-Csv -path \".\Files_To_Purge_Exclusions.csv\" -Delimiter \";\"| Select-object -expandProperty Fichier
$items1 = Get-ChildItem -Force $filepath1 -Recurse -Exclude $exclude
$items2 = Get-ChildItem -Force $filepath2 -Recurse -Exclude $exclude
$fileLog = \".\file_deleted_log.txt\"
foreach ($item in $items1)
{
if($item.GetType().Name -eq \"FileInfo\"«»)
{
#Si le fichier à été modifié il y plus de 90 jours, je le supprime.
Remove-Item -Path $item.FullName
Write-Output \"Fichier supprimé : $($item.FullName)\" | Out-File $fileLog -Append
}
}
foreach ($item in $items2)
{
if($item.GetType().Name -eq \"FileInfo\"«»)
{
#Si le fichier à été modifié il y plus de 90 jours, je le supprime.
Remove-Item -Path $item.FullName
Write-Output \"Fichier supprimé : $($item.FullName)\" | Out-File $fileLog -Append
}
}[/code:1]
J'ai essayé de rajouter une clause Where dans mon -Exclude mais ça ne fonctionne pas non plus.
J'avoue être à court de solution.
Je suis en V3 de PS est-ce qu'un upgrade pourrait corriger les bugs du -Exclude ?
Merci d'avance,
Mitakue
Merci pour ta réponse mais ça ne fonctionne pas dans mon cas.
Je ne sais pas si je me suis bien exprimé ou pas, en faites les répertoires à exclure sont précisés dans le fichier CSV que tu trouveras en PJ.
Il faut savoir que c'est un script qui sera exécuté par CONTROL-M.
J'ai effectué différent tests en modifiant mon script mais rien n'y fait.
[code:1]$filepath1 = \"E:\OLY-APP1-TST\OLY\TST\SrcFiles\"
$filepath2 = \"E:\OLY-APP1-TST\OLY\TST\TgtFiles\"
[string[]]$exclude= Import-Csv -path \".\Files_To_Purge_Exclusions.csv\" -Delimiter \";\"| Select-object -expandProperty Fichier
$items1 = Get-ChildItem -Force $filepath1 -Recurse -Exclude $exclude
$items2 = Get-ChildItem -Force $filepath2 -Recurse -Exclude $exclude
$fileLog = \".\file_deleted_log.txt\"
foreach ($item in $items1)
{
if($item.GetType().Name -eq \"FileInfo\"«»)
{
#Si le fichier à été modifié il y plus de 90 jours, je le supprime.
Remove-Item -Path $item.FullName
Write-Output \"Fichier supprimé : $($item.FullName)\" | Out-File $fileLog -Append
}
}
foreach ($item in $items2)
{
if($item.GetType().Name -eq \"FileInfo\"«»)
{
#Si le fichier à été modifié il y plus de 90 jours, je le supprime.
Remove-Item -Path $item.FullName
Write-Output \"Fichier supprimé : $($item.FullName)\" | Out-File $fileLog -Append
}
}[/code:1]
J'ai essayé de rajouter une clause Where dans mon -Exclude mais ça ne fonctionne pas non plus.
J'avoue être à court de solution.
Je suis en V3 de PS est-ce qu'un upgrade pourrait corriger les bugs du -Exclude ?
Merci d'avance,
Mitakue
La pièce jointe Files_To_Purge_Exclusions-a1a0c0adae3256ee2a3fe6d3c8bea490.zip est absente ou indisponible
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 10 ans 4 mois #20981
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Lecture d'un CSV en PowerShell
Mitakue écrit:
Mitakue écrit:
Mitakue écrit:
Mitakue écrit:
Mitakue écrit:
Donne nous le résultat que tu obtiens et celui attendu/désiré.
Essaie de préciser la localisation sur le filesystem comme indiqué ici .
Oui, le fichier de test est réécrit comme celui d'origine. Le dernier joint semble différent.en faites les répertoires à exclure sont précisés dans le fichier CSV que tu trouveras en PJ.
Mitakue écrit:
Vérifie si ton ordonnanceur utilise un host Powershell spécifique ou exécute PS en process externe.Il faut savoir que c'est un script qui sera exécuté par CONTROL-M.
Mitakue écrit:
Précise si c'est la construction de ta liste de fichier ou le traitement de cette liste.J'ai effectué différent tests en modifiant mon script mais rien n'y fait.
Mitakue écrit:
Effectivement je suis en v4, qq bugs ont été corrigés, mais souvent leur corrections peuvent être considérés comme des breaking change, sur le code d'origine et sur celui qui serait 'patché' par nos soins.Je suis en V3 de PS est-ce qu'un upgrade pourrait corriger les bugs du -Exclude ?
Mitakue écrit:
Peut être identifié clairement le pb, qu'on puisse le reproduire et chercher sur MS connect s'il est recensé.J'avoue être à court de solution.
Donne nous le résultat que tu obtiens et celui attendu/désiré.
Essaie de préciser la localisation sur le filesystem comme indiqué ici .
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Faucon
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 43
- Remerciements reçus 0
il y a 10 ans 4 mois #20982
par Faucon
Réponse de Faucon sur le sujet Re:Lecture d'un CSV en PowerShell
En faite le premier fichier envoyer ne comprenais pas les répertoires. Dans mon dernier message j'ai envoyé le fichier CSV dans sa bonne version.
Il exécute le script comme un process externe via un job command.
J'ai essayé de modifier la façon dont le CSV était traité dans le script mais ça n'a rien changer.
J'ai trouvé une alternative qui fonctionne même si ça n'est pas la façon la plus optimiser je pense.
Voici mon code :
[code:1]
$filepath1 = \"E:\OLY-APP1-TST\OLY\TST\SrcFiles\"
$filepath2 = \"E:\OLY-APP1-TST\OLY\TST\TgtFiles\"
[string[]]$exclude= Import-Csv -path \".\Files_To_Purge_Exclusions.csv\" -Delimiter \";\"| Select-object -expandProperty Fichier
$directory = @(get-content \".\exclu_folder.txt\"«»)
$LastWrite = (Get-Date).AddDays(-10)
$items1 = Get-ChildItem $filepath1 -Force -Recurse -Exclude $exclude | where {$directory -notcontains $_.DirectoryName} #| Where-Object {$_.LastWriteTime -le \"$LastWrite\"}
$items2 = Get-ChildItem $filepath2 -Force -Recurse -Exclude $exclude | where {$directory -notcontains $_.DirectoryName} #| Where-Object {$_.LastWriteTime -le \"$LastWrite\"}
$fileLog = \".\file_deleted_log.txt\"
foreach ($item in $items1)
{
if($item.GetType().Name -eq \"FileInfo\"«»)
{
#Si le fichier à été modifié il y plus de 90 jours, je le supprime.
Remove-Item -Path $item.FullName
Write-Output \"Fichier supprimé : $($item.FullName)\" | Out-File $fileLog -Append
}
}
foreach ($item in $items2)
{
if($item.GetType().Name -eq \"FileInfo\"«»)
{
#Si le fichier à été modifié il y plus de 90 jours, je le supprime.
Remove-Item -Path $item.FullName
Write-Output \"Fichier supprimé : $($item.FullName)\" | Out-File $fileLog -Append
}
}
[/code:1]
J'initialise une nouvelle variable $directory avec le contenu d'un .txt qui contient mes folders à exclure et met un filtre ou il ne récupère que les fichiers donc le DirectoryName n'est pas contenu dans $directory.
Je regarderais sur l'ancienne version pour corriger et faire quelque chose de plus propre.
Mais comme je doit livrer le script demain après-midi je me contenterais pour le moment de celui-ci.
Cordialement,
Mitakue
Il exécute le script comme un process externe via un job command.
J'ai essayé de modifier la façon dont le CSV était traité dans le script mais ça n'a rien changer.
J'ai trouvé une alternative qui fonctionne même si ça n'est pas la façon la plus optimiser je pense.
Voici mon code :
[code:1]
$filepath1 = \"E:\OLY-APP1-TST\OLY\TST\SrcFiles\"
$filepath2 = \"E:\OLY-APP1-TST\OLY\TST\TgtFiles\"
[string[]]$exclude= Import-Csv -path \".\Files_To_Purge_Exclusions.csv\" -Delimiter \";\"| Select-object -expandProperty Fichier
$directory = @(get-content \".\exclu_folder.txt\"«»)
$LastWrite = (Get-Date).AddDays(-10)
$items1 = Get-ChildItem $filepath1 -Force -Recurse -Exclude $exclude | where {$directory -notcontains $_.DirectoryName} #| Where-Object {$_.LastWriteTime -le \"$LastWrite\"}
$items2 = Get-ChildItem $filepath2 -Force -Recurse -Exclude $exclude | where {$directory -notcontains $_.DirectoryName} #| Where-Object {$_.LastWriteTime -le \"$LastWrite\"}
$fileLog = \".\file_deleted_log.txt\"
foreach ($item in $items1)
{
if($item.GetType().Name -eq \"FileInfo\"«»)
{
#Si le fichier à été modifié il y plus de 90 jours, je le supprime.
Remove-Item -Path $item.FullName
Write-Output \"Fichier supprimé : $($item.FullName)\" | Out-File $fileLog -Append
}
}
foreach ($item in $items2)
{
if($item.GetType().Name -eq \"FileInfo\"«»)
{
#Si le fichier à été modifié il y plus de 90 jours, je le supprime.
Remove-Item -Path $item.FullName
Write-Output \"Fichier supprimé : $($item.FullName)\" | Out-File $fileLog -Append
}
}
[/code:1]
J'initialise une nouvelle variable $directory avec le contenu d'un .txt qui contient mes folders à exclure et met un filtre ou il ne récupère que les fichiers donc le DirectoryName n'est pas contenu dans $directory.
Je regarderais sur l'ancienne version pour corriger et faire quelque chose de plus propre.
Mais comme je doit livrer le script demain après-midi je me contenterais pour le moment de celui-ci.
Cordialement,
Mitakue
Connexion ou Créer un compte pour participer à la conversation.
- Faucon
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 43
- Remerciements reçus 0
il y a 10 ans 4 mois #21019
par Faucon
Réponse de Faucon sur le sujet Re:Lecture d'un CSV en PowerShell
Bonjour,
Je reviens vers vous aujourd'hui car j'ai un autre problème toujours sur ce script de purge avec les CSV.
Voilà la purge fonctionne très bien et il prend bien en compte mes exclusions, maintenant le soucis c'est que je me base sur un CSV pour indiquer quel fichier sont à purger. Dans ce fichier je précise un environnement pour le dossier à purger.
Je souhaiterais que le script tienne compte de ce champ pour ne pas purger tous les dossier présents dans le fichier.
(C'est un fichier commun à tous les environnements TST, UAT et PRD)
Voici mon code :
[code:1]#==================================================================#
# NAME : PS1-ACCDATA-RiskMetricsWF.ps1 #
# AUTHOR : Maxime FAUCON #
# DATE : #
# VERSION : v1.0.0 #
# COMMENT : Purge des Fichiers sur les Serveurs applicatif #
#==================================================================#
#===========================#
# >>> MODIFICATIONS <<< #
#===========================#
#===========================#
# VERSION : #
# DATE : #
# Nature des modifications :#
# Code de la demande : #
# MODIFIED BY : #
#===========================#
#===========================#
# VERSION : #
# DATE : #
# Nature des modifications :#
# Code de la demande : #
# MODIFIED BY : #
#===========================#
#===========================#
# VERSION : #
# DATE : #
# Nature des modifications :#
# Code de la demande : #
# MODIFIED BY : #
#===========================#
#=======#
#Outputs#
#=======#
#### DEBUT DU SCRIPT ####
#======#
#Inputs#
#======#
#Initialisation des parametres necessaire à l'execution du script
#param
#(
#environnement
# [String]$lieu
#)
$lieu = \"PRD\"
#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 des fichiers d'exclusion des repertoires et des fichiers.
if(! (Test-Path -Path \".\Files_To_Purge_Exclusions.csv\"«»))
{
Write-Host \"Le fichier d'exclusion n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else
{
[string[]]$exclude= Import-Csv -path \".\Files_To_Purge_Exclusions.csv\" -Delimiter \";\"| Select-object -expandProperty Fichier
}
if(! (Test-Path -Path \".\Folder_To_Purge_Exclusions.txt\"«»))
{
Write-Host \"Le fichier d'exclusion n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else
{
$directory = @(get-content \".\Folder_To_Purge_Exclusions.txt\"«»)
}
if(! (Test-Path -Path \".\Folder_To_Purge.csv\"«»))
{
Write-Host \"Le fichier de purge n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else
{
$import = Import-Csv -path \".\Folder_To_Purge.csv\"
}
if ($lieu -eq \"TST\" -or $lieu -eq \"UAT\"«»)
{
$LastWrite = (Get-Date).AddDays(-90).ToString(\"dd/MM/yyyy`tHH:mm\"«»)
}
else
{
$LastWrite = (Get-Date).AddDays(-90).ToString(\"dd/MM/yyyy`tHH:mm\"«»)
}
foreach ($path in $import)
{
$environnement = $path.env
$folder = $path.chemin
$srv = $path.appli
$items1 = Get-ChildItem -Force $folder -Recurse -Exclude $exclude | where {$directory -notcontains $_.DirectoryName} | Where-Object {$_.LastWriteTime -le \"$LastWrite\"}
#Traitement en TEST
if ($lieu -eq \"TST\" -and $environnement -eq \"TST\"«»)
{
#Création du fichier de log
$fileLog = \"\\carmignac.corp\global\Applications\TEST\SSIS\Log\$($lieu)_$($srv)_file_deleted_log_$($datevacation).txt\"
foreach ($item in $items1)
{
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
}
}
}
}
#Traitement en UAT
if ($lieu -eq \"UAT\" -and $environnement -eq \"UAT\"«»)
{
#Création du fichier de log
$fileLog = \"\\carmignac.corp\global\Applications\SSIS\Log\$($lieu)_$($srv)_file_deleted_log_$($datevacation).txt\"
foreach ($item in $items1)
{
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
}
}
}
}
#Traitement en PRD
if ($lieu -eq \"PRD\" -and $environnement -eq \"PRD\" )
{
#Création du fichier de log
$fileLog = \"\\carmignac.corp\global\Applications\SSIS\Log\$($lieu)_$($srv)_archived_file_log_$($datevacation).txt\"
foreach ($item in $items1)
{
$items2 = $item.DirectoryName.Substring(3)
if (! (Test-Path -Path \"\\carmignac.corp\global\Applications\SSIS\Archives\$items2\"«»))
{
$archivepath = New-Item -ItemType Directory -Path \"\\carmignac.corp\global\Applications\SSIS\Archives\$items2\"
Write-Host \"Repertoire créée\"
}
else
{
$archivepath = \"\\carmignac.corp\global\Applications\SSIS\Archives\$items2\"
}
$FinalZipName = \"$item.zip\"
$fileToZip = \"$item\"
$destfile = $item.Name
if($item.GetType().Name -eq \"FileInfo\"«»)
{
$CmdReturn = & $7zipexe a $FinalZipName $fileToZip
Move-Item -Path $FinalZipName -Destination $archivepath -Force
#Si le fichier à été modifié il y plus de 365 jours, je l'archive.
Remove-Item -Path $filetozip -Force -ErrorAction SilentlyContinue
if(! (Test-Path $item))
{
Write-Output \"Fichier archivé : $($item)\" | Out-File $fileLog -Append
}
else
{
Write-Output \"Fichier non archivé : $($item)\" | Out-File $fileLog -Append
Write-host \"Error - FILE NOT DELETED\"
Write-host \"NOTOK\"
}
if (! (Test-Path \"$archivepath\$destfile.zip\"«»))
{
write-host \"zipped file $archivepath\$destfile.zip is not found\"
write-host \"Error - FILE NOT Exist\"
write-host \"NOTOK\"
}
}
}
}
}
[/code:1]
Lorsque j'exécute le script il purge aussi les dossiers estampillés TST dans mon CSV alors qu'il ne devrait purger que ceux estampillés PRD puisque le lieu = \"PRD\".
Je vous joint aussi mes CSV.
Je reviens vers vous aujourd'hui car j'ai un autre problème toujours sur ce script de purge avec les CSV.
Voilà la purge fonctionne très bien et il prend bien en compte mes exclusions, maintenant le soucis c'est que je me base sur un CSV pour indiquer quel fichier sont à purger. Dans ce fichier je précise un environnement pour le dossier à purger.
Je souhaiterais que le script tienne compte de ce champ pour ne pas purger tous les dossier présents dans le fichier.
(C'est un fichier commun à tous les environnements TST, UAT et PRD)
Voici mon code :
[code:1]#==================================================================#
# NAME : PS1-ACCDATA-RiskMetricsWF.ps1 #
# AUTHOR : Maxime FAUCON #
# DATE : #
# VERSION : v1.0.0 #
# COMMENT : Purge des Fichiers sur les Serveurs applicatif #
#==================================================================#
#===========================#
# >>> MODIFICATIONS <<< #
#===========================#
#===========================#
# VERSION : #
# DATE : #
# Nature des modifications :#
# Code de la demande : #
# MODIFIED BY : #
#===========================#
#===========================#
# VERSION : #
# DATE : #
# Nature des modifications :#
# Code de la demande : #
# MODIFIED BY : #
#===========================#
#===========================#
# VERSION : #
# DATE : #
# Nature des modifications :#
# Code de la demande : #
# MODIFIED BY : #
#===========================#
#=======#
#Outputs#
#=======#
#### DEBUT DU SCRIPT ####
#======#
#Inputs#
#======#
#Initialisation des parametres necessaire à l'execution du script
#param
#(
#environnement
# [String]$lieu
#)
$lieu = \"PRD\"
#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 des fichiers d'exclusion des repertoires et des fichiers.
if(! (Test-Path -Path \".\Files_To_Purge_Exclusions.csv\"«»))
{
Write-Host \"Le fichier d'exclusion n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else
{
[string[]]$exclude= Import-Csv -path \".\Files_To_Purge_Exclusions.csv\" -Delimiter \";\"| Select-object -expandProperty Fichier
}
if(! (Test-Path -Path \".\Folder_To_Purge_Exclusions.txt\"«»))
{
Write-Host \"Le fichier d'exclusion n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else
{
$directory = @(get-content \".\Folder_To_Purge_Exclusions.txt\"«»)
}
if(! (Test-Path -Path \".\Folder_To_Purge.csv\"«»))
{
Write-Host \"Le fichier de purge n'est pas présent, interruption du traitement\"
$Host.SetShouldExit(3)
exit
}
else
{
$import = Import-Csv -path \".\Folder_To_Purge.csv\"
}
if ($lieu -eq \"TST\" -or $lieu -eq \"UAT\"«»)
{
$LastWrite = (Get-Date).AddDays(-90).ToString(\"dd/MM/yyyy`tHH:mm\"«»)
}
else
{
$LastWrite = (Get-Date).AddDays(-90).ToString(\"dd/MM/yyyy`tHH:mm\"«»)
}
foreach ($path in $import)
{
$environnement = $path.env
$folder = $path.chemin
$srv = $path.appli
$items1 = Get-ChildItem -Force $folder -Recurse -Exclude $exclude | where {$directory -notcontains $_.DirectoryName} | Where-Object {$_.LastWriteTime -le \"$LastWrite\"}
#Traitement en TEST
if ($lieu -eq \"TST\" -and $environnement -eq \"TST\"«»)
{
#Création du fichier de log
$fileLog = \"\\carmignac.corp\global\Applications\TEST\SSIS\Log\$($lieu)_$($srv)_file_deleted_log_$($datevacation).txt\"
foreach ($item in $items1)
{
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
}
}
}
}
#Traitement en UAT
if ($lieu -eq \"UAT\" -and $environnement -eq \"UAT\"«»)
{
#Création du fichier de log
$fileLog = \"\\carmignac.corp\global\Applications\SSIS\Log\$($lieu)_$($srv)_file_deleted_log_$($datevacation).txt\"
foreach ($item in $items1)
{
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
}
}
}
}
#Traitement en PRD
if ($lieu -eq \"PRD\" -and $environnement -eq \"PRD\" )
{
#Création du fichier de log
$fileLog = \"\\carmignac.corp\global\Applications\SSIS\Log\$($lieu)_$($srv)_archived_file_log_$($datevacation).txt\"
foreach ($item in $items1)
{
$items2 = $item.DirectoryName.Substring(3)
if (! (Test-Path -Path \"\\carmignac.corp\global\Applications\SSIS\Archives\$items2\"«»))
{
$archivepath = New-Item -ItemType Directory -Path \"\\carmignac.corp\global\Applications\SSIS\Archives\$items2\"
Write-Host \"Repertoire créée\"
}
else
{
$archivepath = \"\\carmignac.corp\global\Applications\SSIS\Archives\$items2\"
}
$FinalZipName = \"$item.zip\"
$fileToZip = \"$item\"
$destfile = $item.Name
if($item.GetType().Name -eq \"FileInfo\"«»)
{
$CmdReturn = & $7zipexe a $FinalZipName $fileToZip
Move-Item -Path $FinalZipName -Destination $archivepath -Force
#Si le fichier à été modifié il y plus de 365 jours, je l'archive.
Remove-Item -Path $filetozip -Force -ErrorAction SilentlyContinue
if(! (Test-Path $item))
{
Write-Output \"Fichier archivé : $($item)\" | Out-File $fileLog -Append
}
else
{
Write-Output \"Fichier non archivé : $($item)\" | Out-File $fileLog -Append
Write-host \"Error - FILE NOT DELETED\"
Write-host \"NOTOK\"
}
if (! (Test-Path \"$archivepath\$destfile.zip\"«»))
{
write-host \"zipped file $archivepath\$destfile.zip is not found\"
write-host \"Error - FILE NOT Exist\"
write-host \"NOTOK\"
}
}
}
}
}
[/code:1]
Lorsque j'exécute le script il purge aussi les dossiers estampillés TST dans mon CSV alors qu'il ne devrait purger que ceux estampillés PRD puisque le lieu = \"PRD\".
Je vous joint aussi mes CSV.
La pièce jointe purge_fichiers.zip est absente ou indisponible
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Faucon
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 43
- Remerciements reçus 0
il y a 10 ans 3 mois #21092
par Faucon
Réponse de Faucon sur le sujet Re:Lecture d'un CSV en PowerShell
Bonjour,
Je reviens vers vous aujourd'hui car j'ai toujours un problème sur mon script avec un de mes CSV.
Je doit exclure de mon Get-Childitem plusieurs répertoires qui sont des répertoires réseau, pour cela je pensais utiliser un fichier CSV dans lequel seront répertoriés les fichiers à exclure.
C'est le fichier CSV que vous trouverez en PJ.
Je fais donc dans mon script un Import-CSV pour importer les données contenues dans ce script et j'applique un filtre Where-Object a mon Get-ChildItem qui fait en sorte de ne pas prendre les DirectoryName contenu dans le CSV en tout cas selon moi.
Voici mon script :
[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
{
[string[]]$excludefolder = import-csv -Path \"C:\Maintenance\Fonctions_CG\Folder_To_Purge_Exclusions.csv\" -Delimiter \";\" | Select-Object -ExcludeProperty Folder
}
#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\"«»)
{
#Date du jour -90 jours.
$LastWrite = (Get-Date).AddDays(-90)
#Récupération des fichiers de plus de 90 jours
$items1 = Get-ChildItem -Force -Path $folder -Recurse -Exclude $excludefiles | Where-Object {$excludefolder -notcontains $_.FullName} | Where-Object {$_.LastWriteTime -le \"$LastWrite\"}
#Création du fichier de log
$fileLog = \"\\carmignac.corp\global\Applications\TEST\SSIS\Log\$($environnement)_$($srv)_file_deleted_log_$($datevacation).txt\"
$items1 = \"\"
$item = \"\"
foreach ($item in $items1)
{
#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 #Out-File -FilePath \"C:\Maintenance\Fonctions_CG\log.txt\" -Append
}
else
{
Write-Output \"Fichier non supprimé : $($item)\" | Out-File $fileLog -Append
}
}
}
}
}
} [/code:1]
De plus comme précisé dans les messages précédents, ce script est exécuté par Control-M, et c'est la que je rencontre un autre soucis, ce script doit supprimer des fichiers or lorsqu'il est exécuté par Control-M, cela ne fonctionne pas car il doit demander une élévation de privilège.
Pour pallier à ce problème j'ai donc écrit un autre script tout simple qui lance PowerShell en Tant qu'Administrateur qui va ensuite faire appel à mon script de purge.
[code:1]param
(
[String]$datacenterctrlm
)
Start-Process powershell.exe -Verb RunAs -ArgumentList \"C:\Maintenance\Fonctions_CG\PS1-Remove_Old_Files.ps1 '$datacenterctrlm'\"
[/code:1]
Malheureusement il semblerait que cela ne fonctionne pas non plus.
Je m'excuse par avance pour le pavé ^^.
Bien cordialement,
Mitakue
Je reviens vers vous aujourd'hui car j'ai toujours un problème sur mon script avec un de mes CSV.
Je doit exclure de mon Get-Childitem plusieurs répertoires qui sont des répertoires réseau, pour cela je pensais utiliser un fichier CSV dans lequel seront répertoriés les fichiers à exclure.
C'est le fichier CSV que vous trouverez en PJ.
Je fais donc dans mon script un Import-CSV pour importer les données contenues dans ce script et j'applique un filtre Where-Object a mon Get-ChildItem qui fait en sorte de ne pas prendre les DirectoryName contenu dans le CSV en tout cas selon moi.
Voici mon script :
[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
{
[string[]]$excludefolder = import-csv -Path \"C:\Maintenance\Fonctions_CG\Folder_To_Purge_Exclusions.csv\" -Delimiter \";\" | Select-Object -ExcludeProperty Folder
}
#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\"«»)
{
#Date du jour -90 jours.
$LastWrite = (Get-Date).AddDays(-90)
#Récupération des fichiers de plus de 90 jours
$items1 = Get-ChildItem -Force -Path $folder -Recurse -Exclude $excludefiles | Where-Object {$excludefolder -notcontains $_.FullName} | Where-Object {$_.LastWriteTime -le \"$LastWrite\"}
#Création du fichier de log
$fileLog = \"\\carmignac.corp\global\Applications\TEST\SSIS\Log\$($environnement)_$($srv)_file_deleted_log_$($datevacation).txt\"
$items1 = \"\"
$item = \"\"
foreach ($item in $items1)
{
#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 #Out-File -FilePath \"C:\Maintenance\Fonctions_CG\log.txt\" -Append
}
else
{
Write-Output \"Fichier non supprimé : $($item)\" | Out-File $fileLog -Append
}
}
}
}
}
} [/code:1]
De plus comme précisé dans les messages précédents, ce script est exécuté par Control-M, et c'est la que je rencontre un autre soucis, ce script doit supprimer des fichiers or lorsqu'il est exécuté par Control-M, cela ne fonctionne pas car il doit demander une élévation de privilège.
Pour pallier à ce problème j'ai donc écrit un autre script tout simple qui lance PowerShell en Tant qu'Administrateur qui va ensuite faire appel à mon script de purge.
[code:1]param
(
[String]$datacenterctrlm
)
Start-Process powershell.exe -Verb RunAs -ArgumentList \"C:\Maintenance\Fonctions_CG\PS1-Remove_Old_Files.ps1 '$datacenterctrlm'\"
[/code:1]
Malheureusement il semblerait que cela ne fonctionne pas non plus.
Je m'excuse par avance pour le pavé ^^.
Bien cordialement,
Mitakue
La pièce jointe CSVs.zip est absente ou indisponible
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.062 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- Lecture d'un CSV en PowerShell