[RESOLU][PowerShell 1.0]parcours et suppression de fichiers

parcours et suppression de fichiers [RESOLU][PowerShell 1.0] - Shell/Batch - Programmation

Marsh Posté le 29-01-2009 à 16:46:59    

Bon Problème résolu. Je met le script en guise de source.

#==========================================================================
#~~[comment]~~
#AUTEUR : NixNBK
#Ce Script Permet de supprimer des fichiers vieux de plus de X jours dans une arborescence de fichiers
#Le script fonctionne avec 3 arguments :
#1er Argument : Chemin du répertoire à scanner  
#2e  Argument : Nombre de jours
#3e  Argument : Chemin du répertoire de log
#La commande s'ecrit donc : .\scriptsupprfichier.ps1 "X:\repertoire_scan" 10 "X:\repertoirelog"
#Attention à ne pas mettre pour le répertoire de log un anti-slash à la fin. Le script le fait déjà.
#Les logs sont au format :suppression_log_AAAA-MM-JJ.log
#Il faut modifier certains paramètres du script, notemment dans la partie mail, ou le serveur mail, l'expediteur
#et le destinataire sont à mettre à jour.
#~~[/comment]~~
#==========================================================================
$cheminlog=$args[2]
$datejour=get-date -uformat "%Y-%m-%d"  
$fichierlog=$args[2]+"\suppression_log_"+$datejour+".log"
#==========================================================================
# SETTING 0 : Démarrage du log
#==========================================================================
Start-Transcript -path $fichierlog
#==========================================================================
# SETTING 1 : Le répertoire à scanner.
#==========================================================================
$mydata = $args[0]
 
#==========================================================================
# SETTING 2 : Nombre de jours
#==========================================================================
$day = $args[1]
 
#==========================================================================
# SCRIPT SUPPRESSION :  
#==========================================================================
if (Test-Path $mydata)
{
 Write-host "Le répertoire scruté est :" $mydata -foregroundcolor "Red"
 Write-Host "Il est encore temps d'annuler (vous avez 5 secondes), Pressez 'Ctrl + C' pour quitter" -foregroundcolor "Yellow"
 Start-sleep -s 5
 
 $jour = Get-Date
 $lastmod = $jour.AddDays(-$day)
 write-host $jour
 write-host $lastmod
 $Files = get-childitem $mydata -include *.* -recurse |Where {$_.LastWriteTime -le "$lastmod"}
 foreach ($File in $Files)
 {
  write-host "Deleting File $File" -foregroundcolor "Red"; Remove-Item $File | out-null
 }
}
Else
{
 Write-Host "Le Repertoire $mydata n'existe pas !"
}
#==========================================================================
# SETTING 3 : Arrêt du log
#==========================================================================
Stop-Transcript
 
#==========================================================================
# SETTINGS ENVOI DU MAIL : Les répertoires à scanner.
#==========================================================================
$expediteur = "expediteur@mail.fr"
$destinataire = "destinataire@mail.fr"
$serveur = "serveursmtp.fr"
$fichier = $fichierlog
$objet = "suppression de fichiers " + [System.DateTime]::Now
$texte = "Vous trouverez en fichier joint le fichier de log spécifiant les objets supprimés par le script"
 
#==========================================================================
# SCRIPT ENVOI DU MAIL : Les répertoires à scanner.
#==========================================================================
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
 
$attachment = new-object System.Net.Mail.Attachment $fichier
$message.Attachments.Add($attachment)
$client = new-object System.Net.Mail.SmtpClient $serveur
$client.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
 
$client.Send($message)  
#==========================================================================
# FIN DU SCRIPT
#==========================================================================


 
 
****************************************************************************
****************************************************************************
Bonjour,
 
Je suis en train de réaliser un script PowerShell qui parcours une arborescence de fichier, et qui les supprime si la date de dernière modification est ultérieure à X jours.
Je souhaite également loguer une ligne par fichier supprimé.
 
Le truc c'est que je connais peu le langage powershell. Mais j'avais déjà adapté un script qui a la même fonction en VBS.
 
J'ai trouvé un document microsoft permettant de faire la transition VBS vers Powershell, mais c'est pas si évident que ça.
 
Voici en gros mon VBS :


 
If Wscript.Arguments.Count = 0 Then  
     Quantity = 1
     redim MyData(Quantity)
     MyData(1) = "D:\rep1\rep2" 'repertoire à parcourir  
 
Else
     redim MyData(1)
     MyData(1) = Wscript.Arguments(0) 'was initiated by dropping folder on it
     Quantity = 1
End If
 
'chemin fichier log
BackupLogFile = "D:\scripts\deletelog.txt"
 
'mail
blnLogMail=true
strMailFrom="xxx@xxx.fr"
strMailTo="yyyy@xxx.fr"
strMailSubject="[ serveur ] Delete Report"
strMailSubjectError="[ serveur ] Delete Report - ERROR"
strMailSMTPServer="123.123.123.1"
 
 
'script
 
set fso = CreateObject("Scripting.FileSystemObject" )
 
strScript = WScript.ScriptFullName
strScript = fso.GetFileName( strScript )
strScript = left( strScript, len(strScript) - 4 )
 
count = 0
dim arrResults   ' vecteur qui stocke les resultats
redim arrResults(0)
 
For i = 1 to Quantity  
  If MyData(i) <> "" then
 
    if fso.DriveExists( MyData(i) ) Then      
      call Delete( MyData(i) )
 
    elseif fso.folderExists(MyData(i)) then  
      call Delete( MyData(i) )
 
    elseif fso.fileExists(MyData(i)) then      
      call Filedelete( MyData(i) )
 
    else      
      strMsg = MyData(i) & vbcrlf & vbcrlf & "Le fichier ou chemin n'existe pas" & _
                 vbcrlf & "Vérifiez que vous avez correctement tapé le chemin"
      strMailSubject=strMailSubjectError
      SendMail(strMsg)
      WScript.Quit
    end if
  End If
Next
 
strlog = "----------------------" & vbnewline & "suppression de" & now() & vbnewline
strlog = strlog & join(arrResults, vbnewline) & vbnewline & "= " & count & "fichiers supprimés" & BackupPath & vbnewline & vbnewline
 
call logresults ( strlog )
 
' ----- envoi du mail
SendMail(strlog)
 
' ----- Reset Objet
set fso = nothing
wscript.quit
 
'-------------------------------------------------------
'Performes the actual copying if required
Sub Delete( mypath )
 Set fldr = fso.GetFolder( myPath )
 For Each f in fldr.Files
    DoEvents
    if DateDiff("d",fso.GetFile(f).DateLastModified,date() ) > 30 then
   count = count + 1
   ReDim Preserve arrResults(count)
   arrResults(count) = f
   fso.DeleteFile f, true
 end if
  DoEvents
  Next
 
  For Each Folder In fldr.SubFolders
    Call Delete(Folder)
  Next
 
End Sub
 
'-----------------------------------------------------------------
'performs the actual copying of Files if the path was a file - not folder
Sub Filedelete( myFile )
  set f = fso.GetFile( myFile )
  if DateDiff("d",fso.GetFile(f).DateLastModified,date() ) > 30 then
   count = count + 1
   ReDim Preserve arrResults(count)
   arrResults(count) = f
   fso.DeleteFile f, true
 end if    
End Sub
 
'----------------------------------------------------------------
'Fonction log
Sub LogResults( myText )
  myfile = BackupLogFile
 
  Set fso = CreateObject("Scripting.FileSystemObject" )
  OutFile = "C:\#temp#.txt"
  set textstream = fso.OpenTextFile(myFile,1,true)
  Set OutStream=fso.CreateTextFile(OutFile,True)
 
  OutStream.WriteLine( mytext )
 
  Do until textstream.AtEndOfStream  
   OneLine = textstream.ReadLine
   OutStream.WriteLine(oneline)
   if instr(Oneline, "----------" ) then  
    logcount = logcount + 1
     if logcount >= 5 then
      exit do
     end if
   end if
  Loop
 
  textstream.close
  OutStream.Close
  fso.CopyFile OutFile, myfile, true
  fso.DeleteFile OutFile
End Sub
'-------------------------------------------------------------------
 
Sub DoEvents
  On error resume next
  wscript.sleep 1  'milliseconds
End Sub
 
'-------------------------------------------------------------------
 
' Fonction mail
Sub SendMail(strMessage)
 If blnLogMail Then
 
 Set objMail= WScript.CreateObject("CDO.Message" )
 With objMail
          .From = strMailFrom
          .To = strMailTo
          .Subject =  strMailSubject
          .TextBody = CStr("" & strMessage)
          .Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing" ) = 2
          .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver" ) = strMailSMTPServer
          .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport" ) = 25
          .Configuration.Fields.Update
          .Send
 End With
 SET objMail = Nothing
 End If
End Sub


 
Comme je dis c'est un script qui à la base était utilisé pour copier des messages, je l'ai récupéré et adapté pour les supprimer.
 
Et voici ce que ça donne pour l'instant en Powershell :


 
$mydata = "C:\repertoire1\repertoire2"
 # au cas ou l'on rajoute un répertoire :
 #$mydata = $mydata + "C:\repertoire3"
 
 
$backuplogfile="C:\scripts\deletelog.log"
 
$logmail = true
$strMailFrom="deletefiles@chu-grenoble.fr"
$strMailTo="nlecertisseur@chu-grenoble.fr"
$strMailSubject="[ Serveur ] Rapport de suppresion"
$strMailSubjectError="[ Serveur ] Rapport de suppresion - ERREUR"
$strMailSMTPServer="@IP du SMTP a mettre"
 
 
# SCRIPT :  
 #Creation de l'objet COM
$obj = new-object -comobject scripting.filesystemobject
 
#Galère
 
For ($i = 1;$i -le $mydata.length;$i++)
{
 
     #Galère


 
Voila ou j'en suis :sweat: .
J'essaie de traduire comme je peux, mais j'ai quelques soucis pour ceci déja :

strScript = WScript.ScriptFullName
strScript = fso.GetFileName( strScript )
strScript = left( strScript, len(strScript) - 4 )


J'arrive pas trop à piger a quoi ça sert...
 
Bref si vous avez des idées, l'aide est la bienvenue


Message édité par nixnbk le 02-02-2009 à 15:57:02

---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 29-01-2009 à 16:46:59   

Reply

Marsh Posté le 29-01-2009 à 17:49:35    

Bon à priori je suis parti sur la mauvaise pente... Adapter depuis un VBS c'est le mal.
 
Donc j'ai trouvé un script et l'ai adapté.  
Le voici :
 


#==========================================================================
# SETTING 1 : Les répertoires à scanner.
#==========================================================================
$mydata = "D:\test"
 # au cas ou l'on rajoute un répertoire :
 #$mydata = $mydata + "C:\repertoire3"
#==========================================================================
# SETTING 2 : Nombre de jours
#==========================================================================
$day = 10
 
if (Test-Path $mydata)
{
 Write-host "Le répertoire scruté est :" $mydata -foregroundcolor "Red"
 Write-Host "Il est encore temps d'annuler (vous avez 5 secondes), Pressez 'Ctrl + C' pour quitter" -foregroundcolor "Yellow"
 Start-sleep -s 5
 
 $jour = Get-Date
 $lastmod = $jour.AddDays(-$days)
 write-host $jour
 write-host $lastmod
 $Files = get-childitem $mydata -include *.* -recurse |Where {$_.LastWriteTime -le "$lastmod"}
 foreach ($File in $Files)
 {
  write-host "Deleting File $File" -foregroundcolor "Red"; Remove-Item $File | out-null
 }
}
Else
{
 Write-Host "Le Repertoire $mydata n'existe pas !"
}


 
Qui fonctionne bien :)
 
Reste à adapter le reste :/


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 30-01-2009 à 09:05:16    

trouvé pour la fonction log. Super Simple :
Start-Transcript -path chemin.log
permet de loguer tout ce qui s'affiche dans powershell tant qu'on ne l'arrête pas.
On l'arrête avec la commande :  
Stop-Transcript
 
Voici mon script... Avec à la fin la fonction mail :
 


Start-Transcript -path D:\deletelog.log
#==========================================================================
# SETTING 1 : Les répertoires à scanner.
#==========================================================================
$mydata = "D:\test"
 # au cas ou l'on rajoute un répertoire :
 #$mydata = $mydata + "C:\repertoire3"
#==========================================================================
# SETTING 2 : Nombre de jours
#==========================================================================
$day = 10
 
if (Test-Path $mydata)
{
 Write-host "Le répertoire scruté est :" $mydata -foregroundcolor "Red"
 Write-Host "Il est encore temps d'annuler (vous avez 5 secondes), Pressez 'Ctrl + C' pour quitter" -foregroundcolor "Yellow"
 Start-sleep -s 5
 
 $jour = Get-Date
 $lastmod = $jour.AddDays(-$days)
 write-host $jour
 write-host $lastmod
 $Files = get-childitem $mydata -include *.* -recurse |Where {$_.LastWriteTime -le "$lastmod"}
 foreach ($File in $Files)
 {
  write-host "Deleting File $File" -foregroundcolor "Red"; Remove-Item $File | out-null
 }
}
Else
{
 Write-Host "Le Repertoire $mydata n'existe pas !"
}  
 
Stop-Transcript
$expediteur = "testpowershell@site.fr"
$destinataire = "nlecertisseur@site.fr"
$serveur = "passerellesmtp.site.fr"
$fichier = "d:\deletelog.log"
$objet = "Envoi de mail via powershell " + [System.DateTime]::Now
$texte = "texte"
 
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
 
$attachment = new-object System.Net.Mail.Attachment $fichier
$message.Attachments.Add($attachment)
$client = new-object System.Net.Mail.SmtpClient $serveur
$client.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
 
$client.Send($message)  


Sauf que pour l'instant la fonction mail arrive pas a envoyer le mail... Je subodore un problème de mauvaise passerelle SMTP.


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 30-01-2009 à 09:26:17    

C'était bien ça, me suis lamentablement gourré  dans mon adresse de serveur mail :/
 
Mon script fonctionne de A à Z ...
 
Reste une dernière question :  
Comment est-ce que je peux faire pour loguer sans écrasement ???
La fonction start transcript crée un fichier de log, et si on relance la même fonction avec le même fichier (ce qui est le cas dans mon script) il recrée le fichier... Donc pas d'historique.
 
Des idées ?


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 30-01-2009 à 13:53:37    

Petit Up...


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Marsh Posté le 02-02-2009 à 15:57:30    

Problème résolu, j'ai mis en premier post le source résultant.


---------------
I'll feed your skin snacks to my cockatiel!
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed