Pb entre version 4 et 5 de powershell

Résolu/Fermé
fr33m4n - 17 mai 2022 à 15:25
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 24 févr. 2023 à 13:05
Bonjour,

J'ai un script PowerShell qui fonctionnait très bien sous PowerShell 5 mais qui rencontre des erreurs sous la version 6. Mon script fait le ménage dans l'historique des fichiers dans une liste de répertoire alimenté dans un fichiers CSV. 1ère colonne du fichier CSV : répertoire sources, deuxième colonne délai de rétention en jours du répertoire sources., 3ème colonne répertoire de destination, dernière colonne délai de rétention en jours du répertoire de destination. Les fichiers sont transférés par un autre scripts de la source vers la destination (serveur NAS). Le présent script gére les délai de rétention et supprime des deux côtés en fonction du délai de
chacun.
Source Retention_Src Destination Retention_Dest
\\ServeurX\e$\Oracle\admin\AVENIR\dpdump 2 \\ServeurY\DUMP_BDD\AVENIR_Logitud 15

Voici le script :

# Activation du fichier de log

cd C:\Sauvegardes\
$varDate=(get-date -format yyyy-MM-dd)

start-transcript -path "C:\Sauvegardes\log_Gestion_Historique_$varDate.txt"

$csvFile = "C:\Sauvegardes\Historique.csv"
$table = Import-Csv $csvFile -Delimiter ";"



Set-Variable srcSite, dstSite , nameDump, tpsRetSrc, tpsRetDest
foreach ($row in $table) {
Clear-Variable srcSite
Clear-Variable dstSite
Clear-Variable tpsRetSrc
Clear-Variable tpsRetDest

$srcSite = $row.Source
$dstSite = $row.Destination
$tpsRetSrc= $Row.Retention_Src
$tpsRetDest= $Row.Retention_Dest



ADD-content -Path C:\Sauvegardes\log_Gestion_Historique_$varDate.txt -value "Fichiers_supprimés_sur $srcSite"

Get-ChildItem $srcSite -Recurse -Force -ea 0 |
? {!$_.PsIsContainer -and $_.LastwriteTime -lt (Get-Date).AddDays(-$tpsRetSrc)} |
ForEach-Object {
$_ | del -Force
$_.FullName | Out-File C:\Sauvegardes\log_Gestion_Historique_$varDate.txt -Append
}



ADD-content -Path C:\Sauvegardes\log_Gestion_Historique_$varDate.txt -value "Fichiers_supprimés_sur $dstSite"

Get-ChildItem $dstSite -Recurse -Force -ea 0 |
? {!$_.PsIsContainer -and $_.LastwriteTime -lt (Get-Date).AddDays(-$tpsRetDest)} |
ForEach-Object {
$_ | del -Force
$_.FullName | Out-File C:\Sauvegardes\log_Gestion_Historique_$varDate.txt -Append
}
}

# Rajouter la date de derniére modification/date de création/date dernier accés
# Rajouter le chemin d'où ont été supprimés les fichier.
# Rajouter au nom de fichier de log nom appli + serveur ?

# Désactivation des logs
Stop-Transcript

robocopy C:\Sauvegardes\ \\ServeurY\Dump_BDD\_Logs "deletedbackups$varDate.txt" /MOV
robocopy C:\Sauvegardes\ \\ServeurY\Dump_BDD\_Logs "log_Gestion_Historique_$varDate.txt" /MOV
Voici l'erreur que j'obtiens

PS C:\Sauvegardes> C:\Sauvegardes\Gestion_Historique_BDD.ps1
Transcription démarrée, le fichier de sortie est C:\Sauvegardes\log_Gestion_Historique_2022-05-16.txt
ADD-content : Le processus ne peut pas accéder au fichier 'C:\Sauvegardes\log_Gestion_Historique_2022-05-16.txt', car il est en cours d'utilisation par un autre
processus.
Au caractère C:\Sauvegardes\Gestion_Historique_BDD.ps1:27 : 1
+ ADD-content -Path C:\Sauvegardes\log_Gestion_Historique_$varDate.txt ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (C:\Sauvegardes\..._2022-05-16.txt:String) [Add-Content], IOException
+ FullyQualifiedErrorId : GetContentWriterIOError,Microsoft.PowerShell.Commands.AddContentCommand

....


Entre les deux versions seuls les chemins ont été modifiés.

Configuration: Windows / Firefox 100.0
A voir également:

2 réponses

NewStax Messages postés 7 Date d'inscription samedi 17 décembre 2022 Statut Membre Dernière intervention 18 décembre 2022 3
17 déc. 2022 à 01:44

Bonjour, il me semble que vous rencontrez un problème lorsque vous essayez d'écrire dans le fichier de log "C:\Sauvegardes\log_Gestion_Historique_$varDate.txt" en utilisant la commande Add-Content.

Le message d'erreur indique que le fichier est déjà en cours d'utilisation par un autre processus et ne peut pas être modifié. Cela peut être dû à plusieurs causes possibles :

  1. Le fichier de log est déjà ouvert dans un éditeur de texte ou un autre programme. Dans ce cas, vous devrez fermer le programme utilisant le fichier avant de pouvoir écrire dedans.

  2. Le script lui-même essaie d'accéder au fichier de log plusieurs fois simultanément. Vous pouvez essayer d'utiliser le verrou de fichier System.IO.FileStream pour empêcher plusieurs threads d'accéder au fichier simultanément.

  3. Le fichier de log est situé dans un répertoire qui n'est pas accessible en écriture par l'utilisateur qui exécute le script. Vérifiez les autorisations d'accès au répertoire et assurez-vous que l'utilisateur a les permissions nécessaires pour écrire dans le fichier.

Je vous suggère de vérifier ces points et de vous assurer que le fichier de log est accessible en écriture avant d'essayer de l'utiliser dans votre script. Si le problème persiste, vous pouvez essayer de déboguer le script en ajoutant des appels à la commande Write-Output pour afficher les valeurs des variables et comprendre ce qui peut être à l'origine de l'erreur. En espérant vous avoir aidé !

0

Bonjour NewStax,

Avant toute chose, ce n'est pas un reproche mais une constatation, il vous faut apprendre à utiliser le PowerShell correctement. Vous mélanger de la syntaxe batch, PowerShell, C# et rien n'est homogène et ne respecte les normes de programmation.

Je répète ce n'est pas un reproche. Mais vous allez droit vers des problèmes en fonctionnant avec des script qui s'emmêlent et dont les principes même de PowerShell ne sont pas respectés.

Essayer aussi de comprendre les fonctionnement du Windows PowerShell et PowerShell, car vous etes passé du .Net Framework au .Net (anciennement .Net Core).

N'ayant pas les vrai données, je n'ai fait qu'une simulation chez moi en corrigeant votre code (A savoir que l'on pourrait encore le rendre plus conforme et propre, je n'ai fait que le brut). Voici ce que ca donne, et chez moi je n'ai pas de problème de handle de fichier.

# Variables
$HistoryFile = "C:\Sauvegardes\Historique.csv"
$Date = Get-Date -Format yyyy-MM-dd
$SavePath = "C:\Sauvegardes"
$LogsFile = "$SavePath\log_Gestion_Historique_$Date.txt"
Set-Location -Path $SavePath

# Activation du fichier de log
Start-Transcript -Path $LogsFile

$Rows = Import-Csv $HistoryFile -Delimiter ";"
foreach ($Row in $Rows)
{
  Add-Content -Path $LogsFile -Value "Fichiers_supprimés_sur $($row.Source)"

  Get-ChildItem $row.Source -Directory -Recurse -Force -ea 0 | `
    Where-Object -FilterScript {$_.LastwriteTime -lt (Get-Date).AddDays(-$Row.Retention_Src)} | `
    ForEach-Object {Remove-Item $_.FullName -Force | `
      Out-File $LogsFile -Append}

  Add-Content -Path $LogsFile -Value "Fichiers_supprimés_sur $($row.Destination))"

  Get-ChildItem $row.Destination -Directory -Recurse -Force -ea 0 | `
    Where-Object -FilterScript {$_.LastwriteTime -lt (Get-Date).AddDays(-$Row.Retention_Dest)} | `
    ForEach-Object {Remove-Item $_.FullName -Force | `
      Out-File $LogsFile -Append}
}

# Désactivation des logs
Stop-Transcript

robocopy C:\Sauvegardes\ \\ServeurY\Dump_BDD\_Logs "deletedbackups$Date.txt" /MOV
robocopy C:\Sauvegardes\ \\ServeurY\Dump_BDD\_Logs "log_Gestion_Historique_$Date.txt" /MOV
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 931
24 févr. 2023 à 13:05

Bonjour Zang,

Avant toute chose, ce n'est pas un reproche mais une constatation, la question initiale a été posée il y a presque 10 mois.

7 mois plus tard, NewStax tente une réponse, qui n'a soulevé aucune réaction du demandeur initial. Ce qui est déjà bien trop tard pour aider fr334m.

Nous voilà 2 mois après la réponse de NewStax, et cette tu réveilles cette discussion qui aurait très bien pu restée endormie.

D'autant, que tu sembles "accabler" NewStax en te basant sur le code initial qui n'est pas de lui....


Je répète ce n'est pas un reproche. Mais exhumer des vieux sujets est contraire à la charte de CCM

0